/** * Analyze a page to check if errors are present. * * @param analysis Page analysis. * @param errors Errors found in the page. * @param onlyAutomatic True if analysis could be restricted to errors automatically fixed. * @return Flag indicating if the error was found. */ @Override public boolean analyze( PageAnalysis analysis, Collection<CheckErrorResult> errors, boolean onlyAutomatic) { if (analysis == null) { return false; } // Retrieve possible templates to replace the link to other language List<String> templatesList = getTemplatesList(); // Analyzing the text from the beginning boolean result = false; EnumWikipedia toWiki = analysis.getWikipedia(); for (PageElementInterwikiLink link : analysis.getInterwikiLinks()) { if (isLanguageLink(link, toWiki)) { if (errors == null) { return true; } result = true; CheckErrorResult errorResult = createCheckErrorResult( analysis, link.getBeginIndex(), link.getEndIndex()); String lgCode = link.getInterwiki().getPrefix(); EnumWikipedia fromWiki = EnumWikipedia.getWikipedia(lgCode); if ((fromWiki != null) && (fromWiki.getSettings().getCode().equals(lgCode))) { String pageTitle = link.getLink(); errorResult.addPossibleAction( GT._("Check language links"), new CheckLanguageLinkActionProvider( fromWiki, toWiki, pageTitle, link.getText())); if ((templatesList != null) && (templatesList.size() > 0)) { for (String template : templatesList) { String[] templateArgs = template.split("\\|"); if (templateArgs.length >= 5) { // Compute order of parameters List<String> order = new ArrayList<>(); if (templateArgs.length >= 6) { String[] tmpOrder = templateArgs[5].split(","); for (String tmp : tmpOrder) { order.add(tmp); } } for (int numParam = 1; numParam <= 4; numParam++) { if (!order.contains(templateArgs[numParam])) { order.add(templateArgs[numParam]); } } StringBuilder prefix = new StringBuilder(); StringBuilder suffix = new StringBuilder(); prefix.append("{{"); prefix.append(templateArgs[0]); boolean localTitle = false; for (String param : order) { if (param.equals(templateArgs[1])) { prefix.append("|"); prefix.append(templateArgs[1]); prefix.append("="); localTitle = true; } else { String value = ""; if (param.equals(templateArgs[2])) { value = lgCode; } else if (param.equals(templateArgs[3])) { value = pageTitle; } else if (param.equals(templateArgs[4])) { value = (link.getText() != null) ? link.getText() : pageTitle; } StringBuilder buffer = localTitle ? suffix : prefix; buffer.append("|"); buffer.append(param); buffer.append("="); if (value != null) { buffer.append(value); } } } suffix.append("}}"); String question = GT._("What is the title of the page on this wiki ?"); AddTextActionProvider action = null; if ((link.getText() != null) && (!link.getText().equals(pageTitle))) { String[] possibleValues = { null, pageTitle, link.getText() }; action = new AddTextActionProvider( prefix.toString(), suffix.toString(), null, question, possibleValues, false, null, checker); } else { action = new AddTextActionProvider( prefix.toString(), suffix.toString(), null, question, pageTitle, checker); } errorResult.addPossibleAction( GT._("Replace using template {0}", "{{" + templateArgs[0] + "}}"), action); } } } errorResult.addPossibleAction( GT._("External Viewer"), new BasicActionProvider( new ActionExternalViewer(fromWiki, pageTitle))); } errors.add(errorResult); } } return result; }
/** * Fix all the errors in the page. * * @param fixName Fix name (extracted from getGlobalFixes()). * @param analysis Page analysis. * @param textPane Text pane. * @return Page contents after fix. */ @Override public String fix(String fixName, PageAnalysis analysis, MWPane textPane) { // Initialize API api = APIFactory.getAPI(); StringBuilder tmpContents = new StringBuilder(); int currentIndex = 0; // Manage templates that can be used to replace a link to an other language List<String> templatesList = getTemplatesList(); String[] templateArgs = null; if ((templatesList != null) && (templatesList.size() > 0)) { String[] tmp = templatesList.get(0).split("\\|"); if (tmp.length >= 5) { templateArgs = tmp; } } // Check all internal links Object highlight = null; String contents = analysis.getContents(); try { EnumWikipedia toWiki = analysis.getWikipedia(); for (PageElementInterwikiLink link : analysis.getInterwikiLinks()) { if (isLanguageLink(link, toWiki)) { String lgCode = link.getInterwiki().getPrefix(); EnumWikipedia fromWiki = EnumWikipedia.getWikipedia(lgCode); if ((fromWiki != null) && (fromWiki.getSettings().getCode().equals(lgCode))) { String pageTitle = link.getLink(); int beginIndex = link.getBeginIndex(); int endIndex = link.getEndIndex(); String replacement = null; // Display selection highlight = addHighlight(textPane, beginIndex, endIndex); textPane.select(beginIndex, endIndex); // Check for language link String toTitle = api.getLanguageLink(fromWiki, toWiki, pageTitle); if (toTitle != null) { // List possible replacements List<String> possibleValues = new ArrayList<String>(); String possible = null; possible = PageElementInternalLink.createInternalLink(toTitle, link.getText()); if (!possibleValues.contains(possible)) { possibleValues.add(possible); } possible = PageElementInternalLink.createInternalLink(toTitle, link.getFullLink()); if (!possibleValues.contains(possible)) { possibleValues.add(possible); } possible = PageElementInternalLink.createInternalLink(toTitle, null); if (!possibleValues.contains(possible)) { possibleValues.add(possible); } possibleValues.add(GT._("Do not replace")); possibleValues.add(GT._("Cancel")); // Ask user what replacement to use String message = GT._( "The page \"{0}\" in \"{1}\" has a language link to \"{2}\": {3}.\n" + "With what text do you want to replace the link ?", new Object[] { pageTitle, fromWiki, toWiki, toTitle } ); int answer = Utilities.displayQuestion( textPane.getParent(), message, possibleValues.toArray()); if ((answer < 0) || (answer >= possibleValues.size() - 1)) { break; } else if (answer < possibleValues.size() - 2) { replacement = possibleValues.get(answer); } } else if (templateArgs != null) { String message = GT._("The page \"{0}\" in \"{1}\" doesn''t have a language link to \"{2}\".", new Object[] { pageTitle, fromWiki, toWiki }) +"\n" + GT._("You can replace the link using template {0}.", "{{" + templateArgs[0] + "}}") + "\n" + GT._("What is the title of the page on this wiki ?"); if ((link.getText() != null) && (!link.getText().equals(pageTitle))) { toTitle = Utilities.askForValue( textPane.getParent(), message, link.getText(), checker); } else { toTitle = Utilities.askForValue( textPane.getParent(), message, pageTitle, checker); } if (toTitle != null) { replacement = "{{" + templateArgs[0] + "|" + templateArgs[1] + "=" + toTitle + "|" + templateArgs[2] + "=" + lgCode + "|" + templateArgs[3] + "=" + pageTitle + "|" + templateArgs[4] + "=" + ((link.getText() != null) ? link.getText() : pageTitle) + "}}"; } } // Do the replacement if (replacement != null) { if (currentIndex < link.getBeginIndex()) { tmpContents.append(contents.substring(currentIndex, link.getBeginIndex())); } tmpContents.append(replacement); currentIndex = link.getEndIndex(); } removeHighlight(textPane, highlight); highlight = null; } } } } catch (APIException e) { // } removeHighlight(textPane, highlight); highlight = null; // Return result if (currentIndex == 0) { return contents; } if (currentIndex < contents.length()) { tmpContents.append(contents.substring(currentIndex)); } return tmpContents.toString(); }