/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2013 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.api.data;
import java.util.ArrayList;
import java.util.List;
/**
* Information about magic words.
*/
public class MagicWord implements Comparable<MagicWord> {
/**
* Magic word name.
*/
private final String name;
/**
* List of magic word aliases.
*/
private final List<String> aliases;
/**
* Flag indicating if the name is case sensitive.
*/
private boolean caseSensitive;
public final static String ABBREVIATE = "abbreviate";
public final static String ARTICLE_PATH = "articlepath";
public final static String ANCHOR_ENCODE = "anchorencode";
public final static String BABEL = "babel";
public final static String BASE_PAGE_NAME = "basepagename";
public final static String BASE_PAGE_NAME_E = "basepagnenamee";
public final static String CANONICAL_URL = "canonicalurl";
public final static String CANONICAL_URL_E = "canonicalurle";
public final static String CATEGORY_TREE = "categorytree";
public final static String CONTENT_LANGUAGE = "contentlanguage";
public final static String CONTRIBUTION_TOTAL = "contributiontotal";
public final static String COUNT = "count";
public final static String COORDINATES = "coordinates";
public final static String CURRENT_DAY = "currentday";
public final static String CURRENT_DAY_2 = "currentday2";
public final static String CURRENT_DAY_NAME = "currentdayname";
public final static String CURRENT_DOW = "currentdow";
public final static String CURRENT_HOUR = "currenthour";
public final static String CURRENT_MONTH = "currentmonth";
public final static String CURRENT_MONTH_1 = "currentmonth1";
public final static String CURRENT_MONTH_ABBREV = "currentmonthabbrev";
public final static String CURRENT_MONTH_NAME = "currentmonthname";
public final static String CURRENT_MONTH_NAME_GEN = "currentmonthnamegen";
public final static String CURRENT_TIME = "currenttime";
public final static String CURRENT_TIMESTAMP = "currenttimestamp";
public final static String CURRENT_VERSION = "currentversion";
public final static String CURRENT_WEEK = "currentweek";
public final static String CURRENT_YEAR = "currentyear";
public final static String DECIMAL_PLACES = "decimalplaces";
public final static String DEFAULT = "default";
public final static String DEFAULT_SORT = "defaultsort";
public final static String DEFAULT_SORT_NOERROR = "defaultsort_noerror";
public final static String DEFAULT_SORT_NOREPLACE = "defaultsort_noreplace";
public final static String DIRECTION_MARK = "directionmark";
public final static String DISPLAY_TITLE = "displaytitle";
public final static String EXPLODE = "explode";
public final static String EXPR = "expr";
public final static String FILE_PATH = "filepath";
public final static String FORCE_TOC = "forcetoc";
public final static String FORMAT_DATE = "formatdate";
public final static String FORMAT_NUM = "formatnum";
public final static String FULL_PAGE_NAME = "fullpagename";
public final static String FULL_PAGE_NAME_E = "fullpagenamee";
public final static String FULL_URL = "fullurl";
public final static String FULL_URL_E = "fullurle";
public final static String GENDER = "gender";
public final static String GRAMMAR = "grammar";
public final static String HIDDEN_CAT = "hiddencat";
public final static String IF = "if";
public final static String IF_EQ = "ifeq";
public final static String IF_ERROR = "iferror";
public final static String IF_EXIST = "ifexist";
public final static String IF_EXPR = "ifexpr";
public final static String INFO_PAGE = "infopage";
public final static String INT = "int";
public final static String INVOKE = "invoke";
public final static String IMG_ALT = "img_alt";
public final static String IMG_BASELINE = "img_baseline";
public final static String IMG_BORDER = "img_border";
public final static String IMG_BOTTOM = "img_bottom";
public final static String IMG_CENTER = "img_center";
public final static String IMG_CLASS = "img_class";
public final static String IMG_FRAMED = "img_framed";
public final static String IMG_FRAMELESS = "img_frameless";
public final static String IMG_LEFT = "img_left";
public final static String IMG_LINK = "img_link";
public final static String IMG_LOSSY = "img_lossy";
public final static String IMG_MANUAL_THUMB = "img_manualthumb";
public final static String IMG_MIDDLE = "img_middle";
public final static String IMG_NONE = "img_none";
public final static String IMG_PAGE = "img_page";
public final static String IMG_RIGHT = "img_right";
public final static String IMG_SUB = "img_sub";
public final static String IMG_SUPER = "img_super";
public final static String IMG_TEXT_BOTTOM = "img_text_bottom";
public final static String IMG_TEXT_TOP = "img_text_top";
public final static String IMG_THUMBNAIL = "img_thumbnail";
public final static String IMG_TOP = "img_top";
public final static String IMG_UPRIGHT = "img_upright";
public final static String IMG_WIDTH = "img_width";
public final static String INDEX = "index";
public final static String LANGUAGE = "language";
public final static String LC = "lc";
public final static String LC_FIRST = "lcfirst";
public final static String LEN = "len";
public final static String LINK_UNIT = "linkunit";
public final static String LOCAL_DAY = "localday";
public final static String LOCAL_DAY_2 = "localday2";
public final static String LOCAL_DAY_NAME = "localdayname";
public final static String LOCAL_DOW = "localdow";
public final static String LOCAL_HOUR = "localhour";
public final static String LOCAL_MONTH = "localmonth";
public final static String LOCAL_MONTH_1 = "localmonth1";
public final static String LOCAL_MONTH_ABBREV = "localmonthabbrev";
public final static String LOCAL_MONTH_NAME = "localmonthname";
public final static String LOCAL_MONTH_NAME_GEN = "localmonthnamegen";
public final static String LOCAL_TIME = "localtime";
public final static String LOCAL_TIMESTAMP = "localtimestamp";
public final static String LOCAL_URL = "localurl";
public final static String LOCAL_URL_E = "localurle";
public final static String LOCAL_WEEK = "localweek";
public final static String LOCAL_YEAR = "localyear";
public final static String LQT_PAGE_LIMIT = "lqtpagelimit";
public final static String MSG = "msg";
public final static String MSGNW = "msgnw";
public final static String NAMESPACE = "namespace";
public final static String NAMESPACE_E = "namespacee";
public final static String NAMESPACE_NUMBER = "namespacenumber";
public final static String NEW_SECTION_LINK = "newsectionlink";
public final static String NO_CONTENT_CONVERT = "nocontentconvert";
public final static String NO_EDIT_SECTION = "noeditsection";
public final static String NO_GALLERY = "nogallery";
public final static String NO_HEADER = "noheader";
public final static String NO_INDEX = "noindex";
public final static String NO_NEW_SECTION_LINK = "nonewsectionlink";
public final static String NO_TITLE_CONVERT = "notitleconvert";
public final static String NO_TOC = "notoc";
public final static String NS = "ns";
public final static String NSE = "nse";
public final static String NUMBER_IN_GROUP = "numberingroup";
public final static String NUMBER_OF_ACTIVE_USERS = "numberofactiveusers";
public final static String NUMBER_OF_ADMINS = "numberofadmins";
public final static String NUMBER_OF_ARTICLES = "numberofarticles";
public final static String NUMBER_OF_EDITS = "numberofedits";
public final static String NUMBER_OF_FILES = "numberoffiles";
public final static String NUMBER_OF_PAGES = "numberofpages";
public final static String NUMBER_OF_USERS = "numberofusers";
public final static String NUMBER_OF_VIEWS = "numberofviews";
public final static String OGG_NOICON = "ogg_noicon";
public final static String OGG_NOPLAYER = "ogg_noplayer";
public final static String OGG_THUMBTIME = "ogg_thumbtime";
public final static String PAD_LEFT = "padleft";
public final static String PAD_RIGHT = "padright";
public final static String PAGE_ID = "pageid";
public final static String PAGE_NAME = "pagename";
public final static String PAGE_NAME_E = "pagenamee";
public final static String PAGE_SIZE = "pagesize";
public final static String PAGES_IN_CATEGORY = "pagesincategory";
public final static String PAGES_IN_CATEGORY_ALL = "pagesincategory_all";
public final static String PAGES_IN_CATEGORY_FILES = "pagesincategory_files";
public final static String PAGES_IN_CATEGORY_PAGES = "pagesincategory_pages";
public final static String PAGES_IN_CATEGORY_SUBCATS = "pagesincategory_subcats";
public final static String PAGES_IN_NAMESPACE = "pagesinnamespace";
public final static String PAGES_USING_PENDING_CHANGES = "pagesusingpendingchanges";
public final static String PENDING_CHANGE_LEVEL = "pendingchangelevel";
public final static String PLURAL = "plural";
public final static String POS = "pos";
public final static String PROTECTION_LEVEL = "protectionlevel";
public final static String RAW = "raw";
public final static String RAW_SUFFIX = "rawsuffix";
public final static String REDIRECT = "redirect";
public final static String REL_2_ABS = "rel2abs";
public final static String REPLACE = "replace";
public final static String REVISION_DAY = "revisionday";
public final static String REVISION_DAY_2 = "revisionday2";
public final static String REVISION_ID = "revisionid";
public final static String REVISION_MONTH = "revisionmonth";
public final static String REVISION_MONTH_1 = "revisionmonth1";
public final static String REVISION_TIMESTAMP = "revisiontimestamp";
public final static String REVISION_USER = "revisionuser";
public final static String REVISION_YEAR = "revisionyear";
public final static String RPOS = "rpos";
public final static String SAFE_SUBST = "safesubst";
public final static String SCRIPT_PATH = "scriptpath";
public final static String SERVER = "server";
public final static String SERVER_NAME = "servername";
public final static String SIGNIFICANT_FIGURES = "significantfigures";
public final static String SITE_NAME = "sitename";
public final static String SOURCE_UNIT = "sourceunit";
public final static String SPECIAL = "special";
public final static String SPECIAL_E = "speciale";
public final static String STATIC_REDIRECT = "staticredirect";
public final static String STYLE_PATH = "stylepath";
public final static String SUB = "sub";
public final static String SUB_PAGE_NAME = "subpagename";
public final static String SUB_PAGE_NAME_E = "subpagenamee";
public final static String SUBJECT_PAGE_NAME = "subjectpagename";
public final static String SUBJECT_PAGE_NAME_E = "subjectpagenamee";
public final static String SUBJECT_SPACE = "subjectspace";
public final static String SUBJECT_SPACE_E = "subjectspacee";
public final static String SUBST = "subst";
public final static String SWITCH = "switch";
public final static String SWITCH_COUNTRY = "switchcountry";
public final static String SWITCH_LANGUAGE = "switchlanguage";
public final static String TAG = "tag";
public final static String TALK_PAGE_NAME = "talkpagename";
public final static String TALK_PAGE_NAME_E = "talkpagenamee";
public final static String TALK_SPACE = "talkspace";
public final static String TALK_SPACE_E = "talkspacee";
public final static String TARGET_UNIT = "targetunit";
public final static String TIME = "time";
public final static String TIMED_MEDIA_ENDTIME = "timedmedia_endtime";
public final static String TIMED_MEDIA_NOICON = "timedmedia_noicon";
public final static String TIMED_MEDIA_NOPLAYER = "timedmedia_noplayer";
public final static String TIMED_MEDIA_STARTTIME = "timedmedia_starttime";
public final static String TIMED_MEDIA_THUMBTIME = "timedmedia_thumbtime";
public final static String TIME_L = "timel";
public final static String TITLE_PARTS = "titleparts";
public final static String TOC = "toc";
public final static String TRANSLATION_DIALOG = "translationdialog";
public final static String UC = "uc";
public final static String UC_FIRST = "ucfirst";
public final static String URL_DECODE = "urldecode";
public final static String URL_ENCODE = "urlencode";
public final static String URL_PATH = "url_path";
public final static String URL_QUERY = "url_query";
public final static String URL_WIKI = "url_wiki";
public final static String USE_LIQUID_THREADS = "useliquidthreads";
public final static String USER_TEST_WIKI = "usertestwiki";
/**
* List of magic words that can be used as variables / functions.
*/
private final static String[] functionMagicWords = {
MagicWord.ANCHOR_ENCODE,
MagicWord.BASE_PAGE_NAME,
MagicWord.BASE_PAGE_NAME_E,
MagicWord.CANONICAL_URL,
MagicWord.CONTENT_LANGUAGE,
MagicWord.CURRENT_DAY,
MagicWord.CURRENT_DAY_2,
MagicWord.CURRENT_DAY_NAME,
MagicWord.CURRENT_DOW,
MagicWord.CURRENT_HOUR,
MagicWord.CURRENT_MONTH,
MagicWord.CURRENT_MONTH_ABBREV,
MagicWord.CURRENT_MONTH_NAME,
MagicWord.CURRENT_MONTH_NAME_GEN,
MagicWord.CURRENT_TIME,
MagicWord.CURRENT_TIMESTAMP,
MagicWord.CURRENT_VERSION,
MagicWord.CURRENT_WEEK,
MagicWord.CURRENT_YEAR,
MagicWord.DEFAULT_SORT,
MagicWord.DIRECTION_MARK,
MagicWord.DISPLAY_TITLE,
MagicWord.EXPLODE,
MagicWord.EXPR,
MagicWord.FILE_PATH,
MagicWord.FORMAT_DATE,
MagicWord.FORMAT_NUM,
MagicWord.FULL_PAGE_NAME,
MagicWord.FULL_PAGE_NAME_E,
MagicWord.FULL_URL,
MagicWord.GENDER,
MagicWord.GRAMMAR,
MagicWord.IF,
MagicWord.IF_EQ,
MagicWord.IF_ERROR,
MagicWord.IF_EXIST,
MagicWord.IF_EXPR,
MagicWord.INT,
MagicWord.LANGUAGE,
MagicWord.LC,
MagicWord.LC_FIRST,
MagicWord.LEN,
MagicWord.LOCAL_DAY,
MagicWord.LOCAL_DAY_2,
MagicWord.LOCAL_DAY_NAME,
MagicWord.LOCAL_DOW,
MagicWord.LOCAL_HOUR,
MagicWord.LOCAL_MONTH,
MagicWord.LOCAL_MONTH_ABBREV,
MagicWord.LOCAL_MONTH_NAME,
MagicWord.LOCAL_MONTH_NAME_GEN,
MagicWord.LOCAL_TIME,
MagicWord.LOCAL_TIMESTAMP,
MagicWord.LOCAL_URL,
MagicWord.LOCAL_WEEK,
MagicWord.LOCAL_YEAR,
MagicWord.NAMESPACE,
MagicWord.NAMESPACE_E,
MagicWord.NAMESPACE_NUMBER,
MagicWord.NS,
MagicWord.NUMBER_IN_GROUP,
MagicWord.NUMBER_OF_ACTIVE_USERS,
MagicWord.NUMBER_OF_ADMINS,
MagicWord.NUMBER_OF_ARTICLES,
MagicWord.NUMBER_OF_EDITS,
MagicWord.NUMBER_OF_FILES,
MagicWord.NUMBER_OF_PAGES,
MagicWord.NUMBER_OF_USERS,
MagicWord.NUMBER_OF_VIEWS,
MagicWord.PAD_LEFT,
MagicWord.PAD_RIGHT,
MagicWord.PAGE_ID,
MagicWord.PAGE_NAME,
MagicWord.PAGE_NAME_E,
MagicWord.PAGE_SIZE,
MagicWord.PAGES_IN_CATEGORY,
MagicWord.PAGES_IN_NAMESPACE,
MagicWord.PLURAL,
MagicWord.POS,
MagicWord.PROTECTION_LEVEL,
MagicWord.REL_2_ABS,
MagicWord.REPLACE,
MagicWord.REVISION_DAY,
MagicWord.REVISION_DAY_2,
MagicWord.REVISION_ID,
MagicWord.REVISION_MONTH,
MagicWord.REVISION_MONTH_1,
MagicWord.REVISION_TIMESTAMP,
MagicWord.REVISION_USER,
MagicWord.REVISION_YEAR,
MagicWord.RPOS,
MagicWord.SCRIPT_PATH,
MagicWord.SERVER,
MagicWord.SERVER_NAME,
MagicWord.SITE_NAME,
MagicWord.SPECIAL,
MagicWord.SPECIAL_E,
MagicWord.STYLE_PATH,
MagicWord.SAFE_SUBST,
MagicWord.SUB,
MagicWord.SUB_PAGE_NAME,
MagicWord.SUB_PAGE_NAME_E,
MagicWord.SUBJECT_PAGE_NAME,
MagicWord.SUBJECT_PAGE_NAME_E,
MagicWord.SUBJECT_SPACE,
MagicWord.SUBJECT_SPACE_E,
MagicWord.SUBST,
MagicWord.SWITCH,
MagicWord.TAG,
MagicWord.TALK_PAGE_NAME,
MagicWord.TALK_PAGE_NAME_E,
MagicWord.TALK_SPACE,
MagicWord.TALK_SPACE_E,
MagicWord.TIME,
MagicWord.TIME_L,
MagicWord.TITLE_PARTS,
MagicWord.UC,
MagicWord.UC_FIRST,
MagicWord.URL_DECODE,
MagicWord.URL_ENCODE,
};
/**
* List of magic words that can be used in images.
*/
private final static String[] imgMagicWords = {
MagicWord.IMG_ALT,
MagicWord.IMG_BASELINE,
MagicWord.IMG_BORDER,
MagicWord.IMG_BOTTOM,
MagicWord.IMG_CENTER,
MagicWord.IMG_CLASS,
MagicWord.IMG_FRAMED,
MagicWord.IMG_FRAMELESS,
MagicWord.IMG_LEFT,
MagicWord.IMG_LINK,
MagicWord.IMG_LOSSY,
MagicWord.IMG_MANUAL_THUMB,
MagicWord.IMG_MIDDLE,
MagicWord.IMG_NONE,
MagicWord.IMG_PAGE,
MagicWord.IMG_RIGHT,
MagicWord.IMG_SUB,
MagicWord.IMG_SUPER,
MagicWord.IMG_TEXT_BOTTOM,
MagicWord.IMG_TEXT_TOP,
MagicWord.IMG_THUMBNAIL,
MagicWord.IMG_TOP,
MagicWord.IMG_UPRIGHT,
MagicWord.IMG_WIDTH,
};
/**
* List of magic words that need a # to be used.
*/
private final static String[] sharpMagicWords = {
MagicWord.EXPLODE,
MagicWord.EXPR,
MagicWord.FORMAT_DATE,
MagicWord.IF,
MagicWord.IF_EQ,
MagicWord.IF_ERROR,
MagicWord.IF_EXIST,
MagicWord.IF_EXPR,
MagicWord.LANGUAGE,
MagicWord.LEN,
MagicWord.POS,
MagicWord.REL_2_ABS,
MagicWord.REPLACE,
MagicWord.RPOS,
MagicWord.SPECIAL,
MagicWord.SPECIAL_E,
MagicWord.SUB,
MagicWord.SWITCH,
MagicWord.TAG,
MagicWord.TIME,
MagicWord.TITLE_PARTS,
};
/**
* @param name Magic word name.
* @param aliases Magic word aliases.
*/
public MagicWord(String name, List<String> aliases, boolean caseSensitive) {
this.name = name;
this.aliases = aliases;
this.caseSensitive = caseSensitive;
}
/**
* @return Magic word name.
*/
public String getName() {
return name;
}
/**
* @return Magic word aliases.
*/
public List<String> getAliases() {
return aliases;
}
/**
* @param text Text to check.
* @return Flag indicating if the text is a possible alias.
*/
public boolean isPossibleAlias(String text) {
return isPossibleAlias(text, ".*");
}
/**
* @param text Text to check.
* @param pattern Pattern acceptable for replacing $1
* @return Flag indicating if the text is a possible alias.
*/
public boolean isPossibleAlias(String text, String pattern) {
if (text == null) {
return false;
}
if ((text.length() > 0) && (text.charAt(0) == '#')) {
boolean sharp = false;
for (String magicWord : sharpMagicWords) {
if (magicWord.equals(name)) {
sharp = true;
}
}
if (sharp) {
text = text.substring(1);
}
}
for (String alias : aliases) {
if (alias.contains("$1")) {
if (text.matches(alias.replaceAll("\\$1", pattern))) {
return true;
}
} else if (alias.equals(text)) {
return true;
} else if (!caseSensitive && alias.equalsIgnoreCase(text)) {
return true;
}
}
return false;
}
/**
* @return List of magic words that can be used as functions.
*/
public static List<String> getFunctionMagicWords() {
List<String> result = new ArrayList<String>(functionMagicWords.length);
for (String magicWord : functionMagicWords) {
result.add(magicWord);
}
return result;
}
/**
* @return List of magic words that can be used in images.
*/
public static List<String> getImgMagicWords() {
List<String> result = new ArrayList<String>(imgMagicWords.length);
for (String magicWord : imgMagicWords) {
result.add(magicWord);
}
return result;
}
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(MagicWord mw) {
int compare;
// Name
compare = name.compareTo(mw.name);
if (compare != 0) {
return compare;
}
return compare;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if ((o == null) || (o.getClass() != getClass())) {
return false;
}
MagicWord mw = (MagicWord) o;
boolean equals = true;
equals &= name.equals(mw.name);
return equals;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return name.hashCode();
}
}