X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fparser%2Fwiktionary%2FWholeSectionToHtmlParser.java;h=8dcaf714eb6ff5c7c3f510d13fd747e673d17bb4;hb=58fd4402729f38bf4408e8fef487a9bc359e45a0;hp=0b4bc0dd2be0acf34cf248185654febe4487ab61;hpb=67780552c216010c96a4823a2f2f44e6f206c8f2;p=DictionaryPC.git diff --git a/src/com/hughes/android/dictionary/parser/wiktionary/WholeSectionToHtmlParser.java b/src/com/hughes/android/dictionary/parser/wiktionary/WholeSectionToHtmlParser.java index 0b4bc0d..8dcaf71 100644 --- a/src/com/hughes/android/dictionary/parser/wiktionary/WholeSectionToHtmlParser.java +++ b/src/com/hughes/android/dictionary/parser/wiktionary/WholeSectionToHtmlParser.java @@ -8,6 +8,7 @@ import com.hughes.android.dictionary.engine.IndexBuilder.TokenData; import com.hughes.android.dictionary.engine.IndexedEntry; import com.hughes.android.dictionary.parser.WikiTokenizer; import com.hughes.util.StringUtil; +import com.sun.xml.internal.rngom.util.Uri; import org.apache.commons.lang3.StringEscapeUtils; @@ -25,13 +26,13 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { boolean skipSection(final String name); EntryTypeName sectionNameToEntryType(String sectionName); boolean skipWikiLink(final WikiTokenizer wikiTokenizer); - String adjustWikiLink(String wikiLinkDest); + String adjustWikiLink(String wikiLinkDest, final String wikiLinkText); void addFunctionCallbacks( Map> functionCallbacks); } static final Map isoToLangConfig = new LinkedHashMap(); static { - final Pattern enSkipSections = Pattern.compile(".*Translations|Anagrams|References.*"); + final Pattern enSkipSections = Pattern.compile(".*(Translations|Anagrams|References).*"); isoToLangConfig.put("EN", new LangConfig() { @Override public boolean skipSection(String headingText) { @@ -47,7 +48,7 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { return EntryTypeName.ANTONYM_MULTI; } if (EnParser.partOfSpeechHeader.matcher(sectionName).matches()) { - // We need to put it in the other index, too. + // We need to put it in the other index, too (probably) return null; } if (sectionName.equalsIgnoreCase("Derived Terms")) { @@ -55,7 +56,7 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { } return null; } - + @Override public boolean skipWikiLink(WikiTokenizer wikiTokenizer) { final String wikiText = wikiTokenizer.wikiLinkText(); @@ -65,10 +66,17 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { return false; } @Override - public String adjustWikiLink(String wikiLinkDest) { + public String adjustWikiLink(String wikiLinkDest, String wikiLinkText) { if (wikiLinkDest.startsWith("w:") || wikiLinkDest.startsWith("Image:")) { return null; } + final int hashPos = wikiLinkDest.indexOf("#"); + if (hashPos != -1) { + wikiLinkDest = wikiLinkDest.substring(0, hashPos); + if (wikiLinkDest.isEmpty()) { + wikiLinkDest = wikiLinkText; + } + } return wikiLinkDest; } @@ -76,49 +84,163 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { public void addFunctionCallbacks( Map> functionCallbacks) { EnFunctionCallbacks.addGenericCallbacks(functionCallbacks); - }}); + } + }); - final LangConfig basicLangConfig = new LangConfig() { + final Pattern deSkipSections = Pattern.compile(".*(Übersetzungen|Referenzen|Quellen).*"); + isoToLangConfig.put("DE", new LangConfig() { @Override public boolean skipSection(String headingText) { + return deSkipSections.matcher(headingText).matches(); + } + + @Override + public EntryTypeName sectionNameToEntryType(String sectionName) { + if (sectionName.equalsIgnoreCase("Synonyme")) { + return EntryTypeName.SYNONYM_MULTI; + } + if (sectionName.equalsIgnoreCase("Gegenwörter")) { + return EntryTypeName.ANTONYM_MULTI; + } + return null; + } + + @Override + public boolean skipWikiLink(WikiTokenizer wikiTokenizer) { + final String wikiText = wikiTokenizer.wikiLinkText(); + if (wikiText.startsWith("???Category:")) { + return true; + } return false; } + @Override + public String adjustWikiLink(String wikiLinkDest, String wikiLinkText) { + if (wikiLinkDest.startsWith("w:") || wikiLinkDest.startsWith("Image:")) { + return null; + } + final int hashPos = wikiLinkDest.indexOf("#"); + if (hashPos != -1) { + wikiLinkDest = wikiLinkDest.substring(0, hashPos); + if (wikiLinkDest.isEmpty()) { + wikiLinkDest = wikiLinkText; + } + } + return wikiLinkDest; + } + + @Override + public void addFunctionCallbacks( + Map> functionCallbacks) { + DeFunctionCallbacks.addGenericCallbacks(functionCallbacks); + } + }); + + final Pattern itSkipSections = Pattern.compile(".*(Traduzione|Note / Riferimenti).*"); + isoToLangConfig.put("IT", new LangConfig() { + @Override + public boolean skipSection(String headingText) { + return itSkipSections.matcher(headingText).matches(); + } + @Override public EntryTypeName sectionNameToEntryType(String sectionName) { - return EntryTypeName.WIKTIONARY_MENTIONED; + if (sectionName.equalsIgnoreCase("Sinonimi")) { + return EntryTypeName.SYNONYM_MULTI; + } + if (sectionName.equalsIgnoreCase("Antonimi/Contrari")) { + return EntryTypeName.ANTONYM_MULTI; + } + return null; } + @Override public boolean skipWikiLink(WikiTokenizer wikiTokenizer) { final String wikiText = wikiTokenizer.wikiLinkText(); - if (wikiText.startsWith("Category:")) { + if (wikiText.startsWith("???Category:")) { return true; } return false; } @Override - public String adjustWikiLink(String wikiLinkDest) { + public String adjustWikiLink(String wikiLinkDest, String wikiLinkText) { + if (wikiLinkDest.startsWith("w:") || wikiLinkDest.startsWith("Image:")) { + return null; + } + final int hashPos = wikiLinkDest.indexOf("#"); + if (hashPos != -1) { + wikiLinkDest = wikiLinkDest.substring(0, hashPos); + if (wikiLinkDest.isEmpty()) { + wikiLinkDest = wikiLinkText; + } + } + return wikiLinkDest; + } + + @Override + public void addFunctionCallbacks( + Map> functionCallbacks) { + ItFunctionCallbacks.addGenericCallbacks(functionCallbacks); + } + }); + + + final Pattern frSkipSections = Pattern.compile(".*(Traductions).*"); + isoToLangConfig.put("FR", new LangConfig() { + @Override + public boolean skipSection(String headingText) { + return frSkipSections.matcher(headingText).matches(); + } + + @Override + public EntryTypeName sectionNameToEntryType(String sectionName) { + if (sectionName.equalsIgnoreCase("Synonymes")) { + return EntryTypeName.SYNONYM_MULTI; + } + return null; + } + + @Override + public boolean skipWikiLink(WikiTokenizer wikiTokenizer) { + return false; + } + @Override + public String adjustWikiLink(String wikiLinkDest, String wikiLinkText) { + if (wikiLinkDest.startsWith("w:") || wikiLinkDest.startsWith("Image:")) { + return null; + } + final int hashPos = wikiLinkDest.indexOf("#"); + if (hashPos != -1) { + wikiLinkDest = wikiLinkDest.substring(0, hashPos); + if (wikiLinkDest.isEmpty()) { + wikiLinkDest = wikiLinkText; + } + } return wikiLinkDest; } @Override public void addFunctionCallbacks( Map> functionCallbacks) { + FrFunctionCallbacks.addGenericCallbacks(functionCallbacks); } - }; - isoToLangConfig.put("FR", basicLangConfig); - isoToLangConfig.put("DE", basicLangConfig); - isoToLangConfig.put("IT", basicLangConfig); + }); } final IndexBuilder titleIndexBuilder; + final IndexBuilder defIndexBuilder; final String skipLangIso; final LangConfig langConfig; + final String webUrlTemplate; + - public WholeSectionToHtmlParser(final IndexBuilder titleIndexBuilder, final String wiktionaryIso, final String skipLangIso) { + public WholeSectionToHtmlParser(final IndexBuilder titleIndexBuilder, final IndexBuilder defIndexBuilder, final String wiktionaryIso, final String skipLangIso, + final String webUrlTemplate) { this.titleIndexBuilder = titleIndexBuilder; + this.defIndexBuilder = defIndexBuilder; assert isoToLangConfig.containsKey(wiktionaryIso): wiktionaryIso; this.langConfig = isoToLangConfig.get(wiktionaryIso); this.skipLangIso = skipLangIso; + this.webUrlTemplate = webUrlTemplate; } IndexedEntry indexedEntry = null; @@ -126,7 +248,7 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { @Override public void parseSection(String heading, String text) { assert entrySource != null; - final HtmlEntry htmlEntry = new HtmlEntry(entrySource, StringEscapeUtils.escapeHtml3(title)); + final HtmlEntry htmlEntry = new HtmlEntry(entrySource, title); indexedEntry = new IndexedEntry(htmlEntry); final AppendAndIndexWikiCallback callback = new AppendCallback( @@ -137,10 +259,15 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { callback.indexedEntry = indexedEntry; callback.dispatch(text, null); + if (webUrlTemplate != null) { + final String webUrl = String.format(webUrlTemplate, title); + callback.builder.append(String.format("

%s", Uri.escapeDisallowedChars(webUrl), escapeHtmlLiteral(webUrl))); + } htmlEntry.html = callback.builder.toString(); indexedEntry.isValid = true; final TokenData tokenData = titleIndexBuilder.getOrCreateTokenData(title); + tokenData.hasMainEntry = true; htmlEntry.addToDictionary(titleIndexBuilder.index.dict); tokenData.htmlEntries.add(htmlEntry); @@ -155,13 +282,23 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { } @Override - public void addLinkToCurrentEntry(String token, EntryTypeName entryTypeName) { - titleIndexBuilder.addEntryWithString(indexedEntry, token, entryTypeName); + public void addLinkToCurrentEntry(String token, final String lang, EntryTypeName entryTypeName) { + if (lang == null || lang.equals(skipLangIso)) { + titleIndexBuilder.addEntryWithString(indexedEntry, token, entryTypeName); + } } + + public static String escapeHtmlLiteral(final String plainText) { + final String htmlEscaped = StringEscapeUtils.escapeHtml3(plainText); + if (StringUtil.isAscii(htmlEscaped)) { + return htmlEscaped; + } else { + return StringUtil.escapeUnicodeToPureHtml(plainText); + } + } - static final Pattern ALL_ASCII = Pattern.compile("[\\p{ASCII}]*"); class AppendCallback extends AppendAndIndexWikiCallback { public AppendCallback(WholeSectionToHtmlParser parser) { @@ -170,12 +307,7 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { @Override public void onPlainText(String plainText) { - final String htmlEscaped = StringEscapeUtils.escapeHtml3(plainText); - if (ALL_ASCII.matcher(htmlEscaped).matches()) { - super.onPlainText(htmlEscaped); - } else { - super.onPlainText(StringUtil.escapeToPureHtmlUnicode(plainText)); - } + super.onPlainText(escapeHtmlLiteral(plainText)); } @Override @@ -189,7 +321,7 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { } String linkDest; if (wikiTokenizer.wikiLinkDest() != null) { - linkDest = langConfig.adjustWikiLink(wikiTokenizer.wikiLinkDest()); + linkDest = langConfig.adjustWikiLink(wikiTokenizer.wikiLinkDest(), wikiTokenizer.wikiLinkText()); } else { linkDest = wikiTokenizer.wikiLinkText(); } @@ -197,8 +329,8 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { // TODO: inside a definition, this could be the wrong language. titleIndexBuilder.addEntryWithString(indexedEntry, wikiTokenizer.wikiLinkText(), sectionEntryTypeName); } - if (linkDest != null) { - builder.append(String.format("", linkDest)); + if (!StringUtil.isNullOrEmpty(linkDest)) { + builder.append(String.format("", HtmlEntry.formatQuickdicUrl("", linkDest))); super.onWikiLink(wikiTokenizer); builder.append(String.format("")); } else { @@ -225,6 +357,7 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { } EntryTypeName sectionEntryTypeName; + IndexBuilder currentIndexBuilder; @Override public void onHeading(WikiTokenizer wikiTokenizer) { @@ -232,10 +365,14 @@ public class WholeSectionToHtmlParser extends AbstractWiktionaryParser { sectionEntryTypeName = langConfig.sectionNameToEntryType(headingText); final int depth = wikiTokenizer.headingDepth(); if (langConfig.skipSection(headingText)) { + //System.out.println("Skipping section:" + headingText); while ((wikiTokenizer = wikiTokenizer.nextToken()) != null) { if (wikiTokenizer.isHeading() && wikiTokenizer.headingDepth() <= depth) { + // System.out.println("Resume on: " + wikiTokenizer.token()); wikiTokenizer.returnToLineStart(); return; + } else { + // System.out.println("Skipped: " + wikiTokenizer.token()); } } return;