summaryrefslogtreecommitdiff
path: root/maintenance
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2015-06-04 07:31:04 +0200
committerPierre Schmitz <pierre@archlinux.de>2015-06-04 07:58:39 +0200
commitf6d65e533c62f6deb21342d4901ece24497b433e (patch)
treef28adf0362d14bcd448f7b65a7aaf38650f923aa /maintenance
parentc27b2e832fe25651ef2410fae85b41072aae7519 (diff)
Update to MediaWiki 1.25.1
Diffstat (limited to 'maintenance')
-rw-r--r--maintenance/Doxyfile111
-rw-r--r--maintenance/Maintenance.php73
-rw-r--r--maintenance/archives/patch-drop-page_counter.sql2
-rw-r--r--maintenance/archives/patch-drop-ss_total_views.sql2
-rw-r--r--maintenance/archives/patch-editsummary-length.sql11
-rw-r--r--maintenance/archives/patch-hitcounter.sql9
-rw-r--r--maintenance/archives/patch-user-newtalk-userid-unsigned.sql1
-rw-r--r--maintenance/backupTextPass.inc113
-rw-r--r--maintenance/benchmarks/bench_HTTP_HTTPS.php2
-rw-r--r--maintenance/cdb.php2
-rw-r--r--maintenance/checkComposerLockUpToDate.php63
-rw-r--r--maintenance/checkLess.php12
-rw-r--r--maintenance/cleanupBlocks.php147
-rw-r--r--maintenance/cleanupCaps.php11
-rw-r--r--maintenance/convertExtensionToRegistration.php226
-rw-r--r--maintenance/dev/includes/router.php2
-rw-r--r--maintenance/dictionary/mediawiki.dic6
-rw-r--r--maintenance/doMaintenance.php36
-rw-r--r--maintenance/dumpIterator.php4
-rw-r--r--maintenance/dumpTextPass.php2
-rw-r--r--maintenance/eval.php39
-rw-r--r--maintenance/exportSites.php54
-rw-r--r--maintenance/fetchText.php5
-rw-r--r--maintenance/findHooks.php56
-rw-r--r--maintenance/findMissingFiles.php26
-rw-r--r--maintenance/fixUserRegistration.php64
-rw-r--r--maintenance/generateLocalAutoload.php25
-rw-r--r--maintenance/generateSitemap.php23
-rw-r--r--maintenance/importDump.php2
-rw-r--r--maintenance/importImages.inc4
-rw-r--r--maintenance/importSiteScripts.php39
-rw-r--r--maintenance/importSites.php52
-rw-r--r--maintenance/initSiteStats.php12
-rw-r--r--maintenance/interwiki.list150
-rw-r--r--maintenance/interwiki.sql152
-rw-r--r--maintenance/jsduck/categories.json11
-rw-r--r--maintenance/jsduck/custom_tags.rb (renamed from maintenance/jsduck/CustomTags.rb)32
-rw-r--r--maintenance/jsduck/eg-iframe.html71
-rw-r--r--maintenance/language/StatOutputs.php2
-rw-r--r--maintenance/language/checkLanguage.php2
-rw-r--r--maintenance/language/generateCollationData.php4
-rw-r--r--maintenance/language/generateNormalizerDataAr.php6
-rw-r--r--maintenance/language/generateNormalizerDataMl.php6
-rw-r--r--maintenance/language/generateUtf8Case.php6
-rw-r--r--maintenance/language/zhtable/Makefile.py20
-rw-r--r--maintenance/language/zhtable/README24
-rw-r--r--maintenance/language/zhtable/simp2trad.manual195
-rw-r--r--maintenance/language/zhtable/simp2trad_noconvert.manual143
-rw-r--r--maintenance/language/zhtable/simpphrases.manual2104
-rw-r--r--maintenance/language/zhtable/simpphrases_exclude.manual11
-rw-r--r--maintenance/language/zhtable/symme_supp.manual27
-rw-r--r--maintenance/language/zhtable/toCN.manual2666
-rw-r--r--maintenance/language/zhtable/toHK.manual1418
-rw-r--r--maintenance/language/zhtable/toSG.manual21
-rw-r--r--maintenance/language/zhtable/toSimp.manual148
-rw-r--r--maintenance/language/zhtable/toTW.manual729
-rw-r--r--maintenance/language/zhtable/toTrad.manual367
-rw-r--r--maintenance/language/zhtable/trad2simp.manual733
-rw-r--r--maintenance/language/zhtable/trad2simp_noconvert.manual9
-rw-r--r--maintenance/language/zhtable/tradphrases.manual1845
-rw-r--r--maintenance/language/zhtable/tradphrases_exclude.manual349
-rw-r--r--maintenance/mergeMessageFileList.php43
-rw-r--r--maintenance/moveBatch.php8
-rw-r--r--maintenance/mssql/tables.sql16
-rw-r--r--maintenance/mwdoc-filter.php29
-rw-r--r--maintenance/mwdocgen.php1
-rw-r--r--maintenance/namespaceDupes.php390
-rw-r--r--maintenance/oracle/tables.sql6
-rw-r--r--maintenance/parse.php4
-rw-r--r--maintenance/populateBloomCache.php78
-rw-r--r--maintenance/populateParentId.php2
-rw-r--r--maintenance/populateRevisionSha1.php4
-rw-r--r--maintenance/postgres/compare_schemas.pl1
-rw-r--r--maintenance/postgres/tables.sql6
-rw-r--r--maintenance/preprocessorFuzzTest.php2
-rw-r--r--maintenance/purgeChangedFiles.php1
-rw-r--r--maintenance/purgeChangedPages.php1
-rw-r--r--maintenance/rebuildLocalisationCache.php23
-rw-r--r--maintenance/rebuildSitesCache.php (renamed from maintenance/dumpSisterSites.php)56
-rw-r--r--maintenance/rebuildtextindex.php1
-rw-r--r--maintenance/refreshLinks.php174
-rw-r--r--maintenance/removeInvalidEmails.php78
-rw-r--r--maintenance/renderDump.php2
-rw-r--r--maintenance/resources/update-oojs-ui.sh116
-rw-r--r--maintenance/resources/update-oojs.sh4
-rw-r--r--maintenance/runJobs.php4
-rw-r--r--maintenance/showJobs.php20
-rw-r--r--maintenance/showSiteStats.php1
-rw-r--r--maintenance/sql.php3
-rw-r--r--maintenance/sqlite.inc2
-rw-r--r--maintenance/sqlite.php6
-rw-r--r--maintenance/sqlite/archives/initial-indexes.sql2
-rw-r--r--maintenance/sqlite/archives/patch-drop-page_counter.sql31
-rw-r--r--maintenance/sqlite/archives/patch-drop-ss_admins.sql3
-rw-r--r--maintenance/sqlite/archives/patch-drop-ss_total_views.sql21
-rw-r--r--maintenance/sqlite/archives/patch-editsummary-length.sql65
-rw-r--r--maintenance/storage/checkStorage.php6
-rw-r--r--maintenance/storage/compressOld.php16
-rw-r--r--maintenance/storage/moveToExternal.php1
-rw-r--r--maintenance/storage/recompressTracked.php6
-rw-r--r--maintenance/storage/resolveStubs.php2
-rw-r--r--maintenance/tables.sql54
-rw-r--r--maintenance/update.php24
-rw-r--r--maintenance/updateArticleCount.php8
-rw-r--r--maintenance/updateSpecialPages.php12
-rw-r--r--maintenance/validateRegistrationFile.php37
106 files changed, 8568 insertions, 5289 deletions
diff --git a/maintenance/Doxyfile b/maintenance/Doxyfile
index ffc8c3b0..1f70f452 100644
--- a/maintenance/Doxyfile
+++ b/maintenance/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.7.6.1
+# Doxyfile 1.8.6
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for MediaWiki.
@@ -47,31 +47,39 @@ MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
-ALIASES = "type{1}=<b> \1 </b>:" \
- "types{2}=<b> \1 </b> or <b> \2 </b>:" \
- "types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
- "arrayof{2}=<b> Array </b> of \2" \
- "null=\type{Null}" \
- "boolean=\type{Boolean}" \
- "bool=\type{Boolean}" \
- "integer=\type{Integer}" \
- "int=\type{Integer}" \
- "string=\type{String}" \
- "str=\type{String}" \
- "mixed=\type{Mixed}" \
- "access=\par Access:\n" \
- "private=\access private" \
- "protected=\access protected" \
- "public=\access public" \
- "copyright=\note" \
- "license=\note" \
- "codeCoverageIgnore="
+ALIASES = "type{1}=<b> \1 </b>:" \
+ "types{2}=<b> \1 </b> or <b> \2 </b>:" \
+ "types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
+ "arrayof{2}=<b> Array </b> of \2" \
+ "null=\type{Null}" \
+ "boolean=\type{Boolean}" \
+ "bool=\type{Boolean}" \
+ "integer=\type{Integer}" \
+ "int=\type{Integer}" \
+ "string=\type{String}" \
+ "str=\type{String}" \
+ "mixed=\type{Mixed}" \
+ "access=\par Access:\n" \
+ "private=\access private" \
+ "protected=\access protected" \
+ "public=\access public" \
+ "copyright=\note" \
+ "license=\note" \
+ "codeCoverageIgnore=" \
+ "codingStandardsIgnoreStart=" \
+ "group=" \
+ "covers=" \
+ "dataProvider=" \
+ "expectedException=" \
+ "expectedExceptionMessage="
TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = YES
+AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
@@ -81,13 +89,13 @@ SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
-SYMBOL_CACHE_SIZE = 0
-LOOKUP_CACHE_SIZE = 1
+LOOKUP_CACHE_SIZE = 2
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
+EXTRACT_PACKAGE = NO
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
@@ -100,6 +108,7 @@ INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
+SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
@@ -115,14 +124,13 @@ GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
-SHOW_DIRECTORIES = YES
SHOW_FILES = YES
SHOW_NAMESPACES = NO
FILE_VERSION_FILTER =
LAYOUT_FILE =
CITE_BIB_FILES =
#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
@@ -132,7 +140,7 @@ WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = {{INPUT}}
INPUT_ENCODING = UTF-8
@@ -182,7 +190,12 @@ FILE_PATTERNS = *.c \
RECURSIVE = YES
EXCLUDE = {{EXCLUDE}}
EXCLUDE_SYMLINKS = YES
-EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
+EXCLUDE_PATTERNS = LocalSettings.php \
+ AdminSettings.php \
+ StartProfiler.php \
+ .svn \
+ */.git/* \
+ {{EXCLUDE_PATTERNS}}
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
@@ -192,8 +205,9 @@ INPUT_FILTER = "{{INPUT_FILTER}}"
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
@@ -201,16 +215,17 @@ STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
@@ -218,13 +233,14 @@ HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES
-HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
@@ -248,20 +264,26 @@ QHG_LOCATION =
GENERATE_ECLIPSEHELP = NO
ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
-ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
-USE_INLINE_TREES = YES
+ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES
USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
SEARCHENGINE = YES
SERVER_BASED_SEARCH = YES
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = NO
LATEX_OUTPUT = latex
@@ -272,6 +294,7 @@ PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
LATEX_FOOTER =
+LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
@@ -279,7 +302,7 @@ LATEX_HIDE_INDICES = NO
LATEX_SOURCE_CODE = NO
LATEX_BIB_STYLE = plain
#---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
@@ -288,14 +311,14 @@ RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = {{GENERATE_MAN}}
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
@@ -303,11 +326,16 @@ XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
@@ -326,18 +354,20 @@ PREDEFINED =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE = {{OUTPUT_DIRECTORY}}/html/tagfile.xml
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
MSCGEN_PATH =
+DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = {{HAVE_DOT}}
DOT_NUM_THREADS = 0
@@ -348,6 +378,7 @@ CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
@@ -360,10 +391,10 @@ INTERACTIVE_SVG = NO
DOT_PATH =
DOTFILE_DIRS =
MSCFILE_DIRS =
+DIAFILE_DIRS =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = YES
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
-
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index 8d30df4c..923c5b41 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -20,12 +20,10 @@
* @defgroup Maintenance Maintenance
*/
-// Make sure we're on PHP5.3.2 or better
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
- // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
- require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
- wfPHPVersionError( 'cli' );
-}
+// Bail on old versions of PHP, or if composer has not been run yet to install
+// dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
+require_once dirname( __FILE__ ) . '/../includes/PHPVersionCheck.php';
+wfEntryPointCheck( 'cli' );
/**
* @defgroup MaintenanceArchive Maintenance archives
@@ -102,7 +100,7 @@ abstract class Maintenance {
private $mDependantParameters = array();
/**
- * Used by getDD() / setDB()
+ * Used by getDB() / setDB()
* @var DatabaseBase
*/
private $mDb = null;
@@ -446,7 +444,7 @@ abstract class Maintenance {
$this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
"http://en.wikipedia.org. This is sometimes necessary because " .
"server name detection may fail in command line scripts.", false, true );
- $this->addOption( 'profiler', 'Set to "text" or "trace" to show profiling output', false, true );
+ $this->addOption( 'profiler', 'Profiler output format (usually "text")', false, true );
# Save generic options to display them separately in help
$this->mGenericParameters = $this->mParams;
@@ -598,6 +596,23 @@ abstract class Maintenance {
}
/**
+ * Activate the profiler (assuming $wgProfiler is set)
+ */
+ protected function activateProfiler() {
+ global $wgProfiler;
+
+ $output = $this->getOption( 'profiler' );
+ if ( $output && is_array( $wgProfiler ) && isset( $wgProfiler['class'] ) ) {
+ $class = $wgProfiler['class'];
+ $profiler = new $class(
+ array( 'sampling' => 1, 'output' => $output ) + $wgProfiler
+ );
+ $profiler->setTemplated( true );
+ Profiler::replaceStubInstance( $profiler );
+ }
+ }
+
+ /**
* Clear all params and arguments.
*/
public function clearParamsAndArgs() {
@@ -679,6 +694,9 @@ abstract class Maintenance {
}
$options[$option] = $param;
}
+ } elseif ( $arg == '-' ) {
+ # Lonely "-", often used to indicate stdin or stdout.
+ $args[] = $arg;
} elseif ( substr( $arg, 0, 1 ) == '-' ) {
# Short options
$argLength = strlen( $arg );
@@ -920,26 +938,19 @@ abstract class Maintenance {
LBFactory::destroyInstance();
}
+ // Per-script profiling; useful for debugging
+ $this->activateProfiler();
+
$this->afterFinalSetup();
$wgShowSQLErrors = true;
- // @codingStandardsIgnoreStart Allow error supppression. wfSuppressWarnings()
- // is not avaiable.
+ // @codingStandardsIgnoreStart Allow error suppression. wfSuppressWarnings()
+ // is not available.
@set_time_limit( 0 );
// @codingStandardsIgnoreStart
$this->adjustMemoryLimit();
-
- // Per-script profiling; useful for debugging
- $forcedProfiler = $this->getOption( 'profiler' );
- if ( $forcedProfiler === 'text' ) {
- Profiler::setInstance( new ProfilerSimpleText( array() ) );
- Profiler::instance()->setTemplated( true );
- } elseif ( $forcedProfiler === 'trace' ) {
- Profiler::setInstance( new ProfilerSimpleTrace( array() ) );
- Profiler::instance()->setTemplated( true );
- }
}
/**
@@ -1063,7 +1074,7 @@ abstract class Maintenance {
*
* @return DatabaseBase
*/
- protected function &getDB( $db, $groups = array(), $wiki = false ) {
+ protected function getDB( $db, $groups = array(), $wiki = false ) {
if ( is_null( $this->mDb ) ) {
return wfGetDB( $db, $groups, $wiki );
} else {
@@ -1076,7 +1087,7 @@ abstract class Maintenance {
*
* @param DatabaseBase $db Database object to be used
*/
- public function setDB( &$db ) {
+ public function setDB( $db ) {
$this->mDb = $db;
}
@@ -1084,7 +1095,7 @@ abstract class Maintenance {
* Lock the search index
* @param DatabaseBase &$db
*/
- private function lockSearchindex( &$db ) {
+ private function lockSearchindex( $db ) {
$write = array( 'searchindex' );
$read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user' );
$db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
@@ -1094,7 +1105,7 @@ abstract class Maintenance {
* Unlock the tables
* @param DatabaseBase &$db
*/
- private function unlockSearchindex( &$db ) {
+ private function unlockSearchindex( $db ) {
$db->unlockTables( __CLASS__ . '::' . __METHOD__ );
}
@@ -1103,7 +1114,7 @@ abstract class Maintenance {
* Since the lock is low-priority, queued reads will be able to complete
* @param DatabaseBase &$db
*/
- private function relockSearchindex( &$db ) {
+ private function relockSearchindex( $db ) {
$this->unlockSearchindex( $db );
$this->lockSearchindex( $db );
}
@@ -1174,7 +1185,7 @@ abstract class Maintenance {
* We default as considering stdin a tty (for nice readline methods)
* but treating stout as not a tty to avoid color codes
*
- * @param int $fd File descriptor
+ * @param mixed $fd File descriptor
* @return bool
*/
public static function posix_isatty( $fd ) {
@@ -1197,7 +1208,13 @@ abstract class Maintenance {
}
if ( $isatty && function_exists( 'readline' ) ) {
- return readline( $prompt );
+ $resp = readline( $prompt );
+ if ( $resp === null ) {
+ // Workaround for https://github.com/facebook/hhvm/issues/4776
+ return false;
+ } else {
+ return $resp;
+ }
} else {
if ( $isatty ) {
$st = self::readlineEmulation( $prompt );
@@ -1311,7 +1328,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
}
/**
- * Message to show the the update log was unable to log the completion of this update
+ * Message to show that the update log was unable to log the completion of this update
* @return string
*/
protected function updatelogFailedMessage() {
diff --git a/maintenance/archives/patch-drop-page_counter.sql b/maintenance/archives/patch-drop-page_counter.sql
new file mode 100644
index 00000000..1d8e701b
--- /dev/null
+++ b/maintenance/archives/patch-drop-page_counter.sql
@@ -0,0 +1,2 @@
+-- field is deprecated and no longer updated as of 1.25
+ALTER TABLE /*_*/page DROP COLUMN page_counter;
diff --git a/maintenance/archives/patch-drop-ss_total_views.sql b/maintenance/archives/patch-drop-ss_total_views.sql
new file mode 100644
index 00000000..00591939
--- /dev/null
+++ b/maintenance/archives/patch-drop-ss_total_views.sql
@@ -0,0 +1,2 @@
+-- field is deprecated and no longer updated as of 1.24
+ALTER TABLE /*_*/site_stats DROP COLUMN ss_total_views; \ No newline at end of file
diff --git a/maintenance/archives/patch-editsummary-length.sql b/maintenance/archives/patch-editsummary-length.sql
new file mode 100644
index 00000000..c8ac1adf
--- /dev/null
+++ b/maintenance/archives/patch-editsummary-length.sql
@@ -0,0 +1,11 @@
+ALTER TABLE /*_*/revision MODIFY rev_comment varbinary(767) NOT NULL;
+ALTER TABLE /*_*/archive MODIFY ar_comment varbinary(767) NOT NULL;
+ALTER TABLE /*_*/image MODIFY img_description varbinary(767) NOT NULL;
+ALTER TABLE /*_*/oldimage MODIFY oi_description varbinary(767) NOT NULL;
+ALTER TABLE /*_*/filearchive MODIFY fa_description varbinary(767);
+ALTER TABLE /*_*/filearchive MODIFY fa_deleted_reason varbinary(767) default '';
+ALTER TABLE /*_*/recentchanges MODIFY rc_comment varbinary(767) NOT NULL default '';
+ALTER TABLE /*_*/logging MODIFY log_comment varbinary(767) NOT NULL default '';
+ALTER TABLE /*_*/ipblocks MODIFY ipb_reason varbinary(767) NOT NULL;
+ALTER TABLE /*_*/protected_titles MODIFY pt_reason varbinary(767);
+
diff --git a/maintenance/archives/patch-hitcounter.sql b/maintenance/archives/patch-hitcounter.sql
deleted file mode 100644
index 2d698f68..00000000
--- a/maintenance/archives/patch-hitcounter.sql
+++ /dev/null
@@ -1,9 +0,0 @@
---
--- hitcounter table is used to buffer page hits before they are periodically
--- counted and added to the cur_counter column in the cur table.
--- December 2003
---
-
-CREATE TABLE /*$wgDBprefix*/hitcounter (
- hc_id INTEGER UNSIGNED NOT NULL
-) ENGINE=MEMORY MAX_ROWS=25000;
diff --git a/maintenance/archives/patch-user-newtalk-userid-unsigned.sql b/maintenance/archives/patch-user-newtalk-userid-unsigned.sql
new file mode 100644
index 00000000..a83e03b9
--- /dev/null
+++ b/maintenance/archives/patch-user-newtalk-userid-unsigned.sql
@@ -0,0 +1 @@
+ALTER TABLE /*_*/user_newtalk MODIFY user_id int unsigned NOT NULL default 0;
diff --git a/maintenance/backupTextPass.inc b/maintenance/backupTextPass.inc
index 5f776373..d83f1fcc 100644
--- a/maintenance/backupTextPass.inc
+++ b/maintenance/backupTextPass.inc
@@ -48,6 +48,8 @@ class TextPassDumper extends BackupDumper {
protected $maxConsecutiveFailedTextRetrievals = 200;
protected $failureTimeout = 5; // Seconds to sleep after db failure
+ protected $bufferSize = 524288; // In bytes. Maximum size to read from the stub in on go.
+
protected $php = "php";
protected $spawn = false;
@@ -186,6 +188,10 @@ class TextPassDumper extends BackupDumper {
$url = $this->processFileOpt( $val, $param );
switch ( $opt ) {
+ case 'buffersize':
+ // Lower bound for xml reading buffer size is 4 KB
+ $this->bufferSize = max( intval( $val ), 4 * 1024 );
+ break;
case 'prefetch':
require_once "$IP/maintenance/backupPrefetch.inc";
$this->prefetch = new BaseDump( $url );
@@ -354,6 +360,8 @@ class TextPassDumper extends BackupDumper {
$this->lastName = "";
$this->thisPage = 0;
$this->thisRev = 0;
+ $this->thisRevModel = null;
+ $this->thisRevFormat = null;
$parser = xml_parser_create( "UTF-8" );
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
@@ -366,12 +374,11 @@ class TextPassDumper extends BackupDumper {
xml_set_character_data_handler( $parser, array( &$this, 'characterData' ) );
$offset = 0; // for context extraction on error reporting
- $bufferSize = 512 * 1024;
do {
if ( $this->checkIfTimeExceeded() ) {
$this->setTimeExceeded();
}
- $chunk = fread( $input, $bufferSize );
+ $chunk = fread( $input, $this->bufferSize );
if ( !xml_parse( $parser, $chunk, feof( $input ) ) ) {
wfDebug( "TextDumpPass::readDump encountered XML parsing error\n" );
@@ -422,7 +429,33 @@ class TextPassDumper extends BackupDumper {
}
/**
+ * Applies applicable export transformations to $text.
+ *
+ * @param string $text
+ * @param string $model
+ * @param string|null $format
+ *
+ * @return string
+ */
+ private function exportTransform( $text, $model, $format = null ) {
+ try {
+ $handler = ContentHandler::getForModelID( $model );
+ $text = $handler->exportTransform( $text, $format );
+ }
+ catch ( MWException $ex ) {
+ $this->progress(
+ "Unable to apply export transformation for content model '$model': " .
+ $ex->getMessage()
+ );
+ }
+
+ return $text;
+ }
+
+ /**
* Tries to get the revision text for a revision id.
+ * Export transformations are applied if the content model can is given or can be
+ * determined from the database.
*
* Upon errors, retries (Up to $this->maxFailures tries each call).
* If still no good revision get could be found even after this retrying, "" is returned.
@@ -431,11 +464,14 @@ class TextPassDumper extends BackupDumper {
* is thrown.
*
* @param string $id The revision id to get the text for
+ * @param string|bool|null $model The content model used to determine applicable export transformations.
+ * If $model is null, it will be determined from the database.
+ * @param string|null $format The content format used when applying export transformations.
*
- * @return string The revision text for $id, or ""
* @throws MWException
+ * @return string The revision text for $id, or ""
*/
- function getText( $id ) {
+ function getText( $id, $model = null, $format = null ) {
global $wgContentHandlerUseDB;
$prefetchNotTried = true; // Whether or not we already tried to get the text via prefetch.
@@ -453,6 +489,24 @@ class TextPassDumper extends BackupDumper {
$oldConsecutiveFailedTextRetrievals = $consecutiveFailedTextRetrievals;
$consecutiveFailedTextRetrievals = 0;
+ if ( $model === null && $wgContentHandlerUseDB ) {
+ $row = $this->db->selectRow(
+ 'revision',
+ array( 'rev_content_model', 'rev_content_format' ),
+ array( 'rev_id' => $this->thisRev ),
+ __METHOD__
+ );
+
+ if ( $row ) {
+ $model = $row->rev_content_model;
+ $format = $row->rev_content_format;
+ }
+ }
+
+ if ( $model === null || $model === '' ) {
+ $model = false;
+ }
+
while ( $failures < $this->maxFailures ) {
// As soon as we found a good text for the $id, we will return immediately.
@@ -469,9 +523,19 @@ class TextPassDumper extends BackupDumper {
$tryIsPrefetch = true;
$text = $this->prefetch->prefetch( intval( $this->thisPage ),
intval( $this->thisRev ) );
+
if ( $text === null ) {
$text = false;
}
+
+ if ( is_string( $text ) && $model !== false ) {
+ // Apply export transformation to text coming from an old dump.
+ // The purpose of this transformation is to convert up from legacy
+ // formats, which may still be used in the older dump that is used
+ // for pre-fetching. Applying the transformation again should not
+ // interfere with content that is already in the correct form.
+ $text = $this->exportTransform( $text, $model, $format );
+ }
}
if ( $text === false ) {
@@ -483,6 +547,12 @@ class TextPassDumper extends BackupDumper {
$text = $this->getTextDb( $id );
}
+ if ( $text !== false && $model !== false ) {
+ // Apply export transformation to text coming from the database.
+ // Prefetched text should already have transformations applied.
+ $text = $this->exportTransform( $text, $model, $format );
+ }
+
// No more checks for texts from DB for now.
// If we received something that is not false,
// We treat it as good text, regardless of whether it actually is or is not
@@ -504,21 +574,8 @@ class TextPassDumper extends BackupDumper {
throw new MWException( "No database available" );
}
- $revLength = strlen( $text );
- if ( $wgContentHandlerUseDB ) {
- $row = $this->db->selectRow(
- 'revision',
- array( 'rev_len', 'rev_content_model' ),
- array( 'rev_id' => $revID ),
- __METHOD__
- );
- if ( $row ) {
- // only check the length for the wikitext content handler,
- // it's a wasted (and failed) check otherwise
- if ( $row->rev_content_model == CONTENT_MODEL_WIKITEXT ) {
- $revLength = $row->rev_len;
- }
- }
+ if ( $model !== CONTENT_MODEL_WIKITEXT ) {
+ $revLength = strlen( $text );
} else {
$revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
}
@@ -757,7 +814,14 @@ class TextPassDumper extends BackupDumper {
}
if ( $name == "text" && isset( $attribs['id'] ) ) {
- $text = $this->getText( $attribs['id'] );
+ $id = $attribs['id'];
+ $model = trim( $this->thisRevModel );
+ $format = trim( $this->thisRevFormat );
+
+ $model = $model === '' ? null : $model;
+ $format = $format === '' ? null : $format;
+
+ $text = $this->getText( $id, $model, $format );
$this->openElement = array( $name, array( 'xml:space' => 'preserve' ) );
if ( strlen( $text ) > 0 ) {
$this->characterData( $parser, $text );
@@ -780,6 +844,8 @@ class TextPassDumper extends BackupDumper {
$this->egress->writeRevision( null, $this->buffer );
$this->buffer = "";
$this->thisRev = "";
+ $this->thisRevModel = null;
+ $this->thisRevFormat = null;
} elseif ( $name == 'page' ) {
if ( !$this->firstPageWritten ) {
$this->firstPageWritten = trim( $this->thisPage );
@@ -834,6 +900,13 @@ class TextPassDumper extends BackupDumper {
$this->thisPage .= $data;
}
}
+ elseif ( $this->lastName == "model" ) {
+ $this->thisRevModel .= $data;
+ }
+ elseif ( $this->lastName == "format" ) {
+ $this->thisRevFormat .= $data;
+ }
+
// have to skip the newline left over from closepagetag line of
// end of checkpoint files. nasty hack!!
if ( $this->checkpointJustWritten ) {
diff --git a/maintenance/benchmarks/bench_HTTP_HTTPS.php b/maintenance/benchmarks/bench_HTTP_HTTPS.php
index bb7499b7..15692348 100644
--- a/maintenance/benchmarks/bench_HTTP_HTTPS.php
+++ b/maintenance/benchmarks/bench_HTTP_HTTPS.php
@@ -46,7 +46,7 @@ class BenchHttpHttps extends Benchmarker {
}
static function doRequest( $proto ) {
- Http::get( "$proto://localhost/" );
+ Http::get( "$proto://localhost/", array(), __METHOD__ );
}
// bench function 1
diff --git a/maintenance/cdb.php b/maintenance/cdb.php
index 86c686b4..2e252adb 100644
--- a/maintenance/cdb.php
+++ b/maintenance/cdb.php
@@ -21,6 +21,8 @@
* @todo document
* @ingroup Maintenance
*/
+use \Cdb\Exception as CdbException;
+use \Cdb\Reader as CdbReader;
/** */
require_once __DIR__ . '/commandLine.inc';
diff --git a/maintenance/checkComposerLockUpToDate.php b/maintenance/checkComposerLockUpToDate.php
new file mode 100644
index 00000000..0b77578d
--- /dev/null
+++ b/maintenance/checkComposerLockUpToDate.php
@@ -0,0 +1,63 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Checks whether your composer-installed dependencies are up to date
+ *
+ * Composer creates a "composer.lock" file which specifies which versions are installed
+ * (via `composer install`). It has a hash, which can be compared to the value of
+ * the composer.json file to see if dependencies are up to date.
+ */
+class CheckComposerLockUpToDate extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Checks whether your composer.lock file is up to date with the current composer.json';
+ }
+
+ public function execute() {
+ global $IP;
+ $lockLocation = "$IP/composer.lock";
+ $jsonLocation = "$IP/composer.json";
+ if ( !file_exists( $lockLocation ) ) {
+ // Maybe they're using mediawiki/vendor?
+ $lockLocation = "$IP/vendor/composer.lock";
+ if ( !file_exists( $lockLocation ) ) {
+ $this->error( 'Could not find composer.lock file. Have you run "composer install"?', 1 );
+ }
+ }
+
+ $lock = new ComposerLock( $lockLocation );
+ $json = new ComposerJson( $jsonLocation );
+
+ if ( $lock->getHash() === $json->getHash() ) {
+ $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
+ return;
+ }
+ // Out of date, lets figure out which dependencies are old
+ $found = false;
+ $installed = $lock->getInstalledDependencies();
+ foreach ( $json->getRequiredDependencies() as $name => $version ) {
+ if ( isset( $installed[$name] ) ) {
+ if ( $installed[$name]['version'] !== $version ) {
+ $this->output( "$name: {$installed[$name]['version']} installed, $version required.\n" );
+ $found = true;
+ }
+ } else {
+ $this->output( "$name: not installed, $version required.\n" );
+ $found = true;
+ }
+ }
+ if ( $found ) {
+ $this->error( 'Error: your composer.lock file is not up to date, run "composer update" to install newer dependencies', 1 );
+ } else {
+ // The hash is the entire composer.json file, so it can be updated without any of the dependencies changing
+ // We couldn't find any out-of-date dependencies, so assume everything is ok!
+ $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
+ }
+
+ }
+}
+
+$maintClass = 'CheckComposerLockUpToDate';
+require_once RUN_MAINTENANCE_IF_MAIN; \ No newline at end of file
diff --git a/maintenance/checkLess.php b/maintenance/checkLess.php
index b97e1b0b..2f533cf4 100644
--- a/maintenance/checkLess.php
+++ b/maintenance/checkLess.php
@@ -22,7 +22,6 @@
*/
require_once __DIR__ . '/Maintenance.php';
-require_once 'PHPUnit/Autoload.php';
/**
* @ingroup Maintenance
@@ -43,6 +42,17 @@ class CheckLess extends Maintenance {
// require it here.
require_once __DIR__ . '/../tests/TestsAutoLoader.php';
+ // If phpunit isn't available by autoloader try pulling it in
+ if ( !class_exists( 'PHPUnit_Framework_TestCase' ) ) {
+ require_once 'PHPUnit/Autoload.php';
+ }
+
+ // RequestContext::resetMain() will print warnings unless this
+ // is defined.
+ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+ define( 'MW_PHPUNIT_TEST', true );
+ }
+
$textUICommand = new PHPUnit_TextUI_Command();
$argv = array(
"$IP/tests/phpunit/phpunit.php",
diff --git a/maintenance/cleanupBlocks.php b/maintenance/cleanupBlocks.php
new file mode 100644
index 00000000..1736203b
--- /dev/null
+++ b/maintenance/cleanupBlocks.php
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Cleans up user blocks with user names not matching the 'user' table
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to clean up user blocks with user names not matching the
+ * 'user' table.
+ *
+ * @ingroup Maintenance
+ */
+class CleanupBlocks extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Cleanup user blocks with user names not matching the 'user' table";
+ $this->setBatchSize( 1000 );
+ }
+
+ public function execute() {
+ $db = wfGetDB( DB_MASTER );
+
+ $max = $db->selectField( 'ipblocks', 'MAX(ipb_user)' );
+
+ // Step 1: Clean up any duplicate user blocks
+ for ( $from = 1; $from <= $max; $from += $this->mBatchSize ) {
+ $to = min( $max, $from + $this->mBatchSize - 1 );
+ $this->output( "Cleaning up duplicate ipb_user ($from-$to of $max)\n" );
+
+ $delete = array();
+
+ $res = $db->select(
+ 'ipblocks',
+ array( 'ipb_user' ),
+ array(
+ "ipb_user >= $from",
+ "ipb_user <= $to",
+ ),
+ __METHOD__,
+ array(
+ 'GROUP BY' => 'ipb_user',
+ 'HAVING' => 'COUNT(*) > 1',
+ )
+ );
+ foreach ( $res as $row ) {
+ $bestBlock = null;
+ $res2 = $db->select(
+ 'ipblocks',
+ '*',
+ array(
+ 'ipb_user' => $row->ipb_user,
+ )
+ );
+ foreach ( $res2 as $row2 ) {
+ $block = Block::newFromRow( $row2 );
+ if ( !$bestBlock ) {
+ $bestBlock = $block;
+ continue;
+ }
+
+ // Find the most-restrictive block. Can't use
+ // Block::chooseBlock because that's for IP blocks, not
+ // user blocks.
+ $keep = null;
+ if ( $keep === null && $block->getExpiry() !== $bestBlock->getExpiry() ) {
+ // This works for infinite blocks because 'infinity' > '20141024234513'
+ $keep = $block->getExpiry() > $bestBlock->getExpiry();
+ }
+ if ( $keep === null ) {
+ foreach ( array( 'createaccount', 'sendemail', 'editownusertalk' ) as $action ) {
+ if ( $block->prevents( $action ) xor $bestBlock->prevents( $action ) ) {
+ $keep = $block->prevents( $action );
+ break;
+ }
+ }
+ }
+
+ if ( $keep ) {
+ $delete[] = $bestBlock->getId();
+ $bestBlock = $block;
+ } else {
+ $delete[] = $block->getId();
+ }
+ }
+ }
+
+ if ( $delete ) {
+ $db->delete(
+ 'ipblocks',
+ array( 'ipb_id' => $delete ),
+ __METHOD__
+ );
+ }
+ }
+
+ // Step 2: Update the user name in any blocks where it doesn't match
+ for ( $from = 1; $from <= $max; $from += $this->mBatchSize ) {
+ $to = min( $max, $from + $this->mBatchSize - 1 );
+ $this->output( "Cleaning up mismatched user name ($from-$to of $max)\n" );
+
+ $res = $db->select(
+ array( 'ipblocks', 'user' ),
+ array( 'ipb_id', 'user_name' ),
+ array(
+ 'ipb_user = user_id',
+ "ipb_user >= $from",
+ "ipb_user <= $to",
+ 'ipb_address != user_name',
+ ),
+ __METHOD__
+ );
+ foreach ( $res as $row ) {
+ $db->update(
+ 'ipblocks',
+ array( 'ipb_address' => $row->user_name ),
+ array( 'ipb_id' => $row->ipb_id ),
+ __METHOD__
+ );
+ }
+ }
+
+ $this->output( "Done!\n" );
+ }
+}
+
+$maintClass = "CleanupBlocks";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupCaps.php b/maintenance/cleanupCaps.php
index 9e88c135..6234db48 100644
--- a/maintenance/cleanupCaps.php
+++ b/maintenance/cleanupCaps.php
@@ -37,6 +37,9 @@ require_once __DIR__ . '/cleanupTable.inc';
* @ingroup Maintenance
*/
class CapsCleanup extends TableCleanup {
+
+ private $user;
+
public function __construct() {
parent::__construct();
$this->mDescription = "Script to cleanup capitalization";
@@ -44,13 +47,13 @@ class CapsCleanup extends TableCleanup {
}
public function execute() {
- global $wgCapitalLinks, $wgUser;
+ global $wgCapitalLinks;
if ( $wgCapitalLinks ) {
$this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
}
- $wgUser = User::newFromName( 'Conversion script' );
+ $this->user = User::newFromName( 'Conversion script' );
$this->namespace = intval( $this->getOption( 'namespace', 0 ) );
$this->dryrun = $this->hasOption( 'dry-run' );
@@ -87,7 +90,9 @@ class CapsCleanup extends TableCleanup {
$this->output( "\"$display\" -> \"$targetDisplay\": DRY RUN, NOT MOVED\n" );
$ok = true;
} else {
- $ok = $current->moveTo( $target, false, 'Converting page titles to lowercase' );
+ $mp = new MovePage( $current, $target );
+ $status = $mp->move( $this->user, 'Converting page titles to lowercase', true );
+ $ok = $status->isOK() ? 'OK' : $status->getWikiText();
$this->output( "\"$display\" -> \"$targetDisplay\": $ok\n" );
}
if ( $ok === true ) {
diff --git a/maintenance/convertExtensionToRegistration.php b/maintenance/convertExtensionToRegistration.php
new file mode 100644
index 00000000..acb8d3aa
--- /dev/null
+++ b/maintenance/convertExtensionToRegistration.php
@@ -0,0 +1,226 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+class ConvertExtensionToRegistration extends Maintenance {
+
+ protected $custom = array(
+ 'MessagesDirs' => 'handleMessagesDirs',
+ 'ExtensionMessagesFiles' => 'removeAbsolutePath',
+ 'AutoloadClasses' => 'removeAbsolutePath',
+ 'ExtensionCredits' => 'handleCredits',
+ 'ResourceModules' => 'handleResourceModules',
+ 'ResourceModuleSkinStyles' => 'handleResourceModules',
+ 'Hooks' => 'handleHooks',
+ 'ExtensionFunctions' => 'handleExtensionFunctions',
+ 'ParserTestFiles' => 'removeAbsolutePath',
+ );
+
+ /**
+ * Things that were formerly globals and should still be converted
+ *
+ * @var array
+ */
+ protected $formerGlobals = array(
+ 'TrackingCategories',
+ );
+
+ /**
+ * No longer supported globals (with reason) should not be converted and emit a warning
+ *
+ * @var array
+ */
+ protected $noLongerSupportedGlobals = array(
+ 'SpecialPageGroups' => 'deprecated',
+ );
+
+ /**
+ * Keys that should be put at the top of the generated JSON file (T86608)
+ *
+ * @var array
+ */
+ protected $promote = array(
+ 'name',
+ 'version',
+ 'author',
+ 'url',
+ 'description',
+ 'descriptionmsg',
+ 'namemsg',
+ 'license-name',
+ 'type',
+ );
+
+ private $json, $dir, $hasWarning = false;
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Converts extension entry points to the new JSON registration format';
+ $this->addArg( 'path', 'Location to the PHP entry point you wish to convert', /* $required = */ true );
+ $this->addOption( 'skin', 'Whether to write to skin.json', false, false );
+ }
+
+ protected function getAllGlobals() {
+ $processor = new ReflectionClass( 'ExtensionProcessor' );
+ $settings = $processor->getProperty( 'globalSettings' );
+ $settings->setAccessible( true );
+ return $settings->getValue() + $this->formerGlobals;
+ }
+
+ public function execute() {
+ // Extensions will do stuff like $wgResourceModules += array(...) which is a
+ // fatal unless an array is already set. So set an empty value.
+ // And use the weird $__settings name to avoid any conflicts
+ // with real poorly named settings.
+ $__settings = array_merge( $this->getAllGlobals(), array_keys( $this->custom ) );
+ foreach ( $__settings as $var ) {
+ $var = 'wg' . $var;
+ $$var = array();
+ }
+ unset( $var );
+ require $this->getArg( 0 );
+ // Try not to create any local variables before this line
+ $vars = get_defined_vars();
+ unset( $vars['this'] );
+ unset( $vars['__settings'] );
+ $this->dir = dirname( realpath( $this->getArg( 0 ) ) );
+ $this->json = array();
+ $globalSettings = $this->getAllGlobals();
+ foreach ( $vars as $name => $value ) {
+ $realName = substr( $name, 2 ); // Strip 'wg'
+
+ // If it's an empty array that we likely set, skip it
+ if ( is_array( $value ) && count( $value ) === 0 && in_array( $realName, $__settings ) ) {
+ continue;
+ }
+
+ if ( isset( $this->custom[$realName] ) ) {
+ call_user_func_array( array( $this, $this->custom[$realName] ), array( $realName, $value ) );
+ } elseif ( in_array( $realName, $globalSettings ) ) {
+ $this->json[$realName] = $value;
+ } elseif ( array_key_exists( $realName, $this->noLongerSupportedGlobals ) ) {
+ $this->output( 'Warning: Skipped global "' . $name . '" (' .
+ $this->noLongerSupportedGlobals[$realName] . '). ' .
+ "Please update the entry point before convert to registration.\n" );
+ $this->hasWarning = true;
+ } elseif ( strpos( $name, 'wg' ) === 0 ) {
+ // Most likely a config setting
+ $this->json['config'][$realName] = $value;
+ }
+ }
+
+ // Move some keys to the top
+ $out = array();
+ foreach ( $this->promote as $key ) {
+ if ( isset( $this->json[$key] ) ) {
+ $out[$key] = $this->json[$key];
+ unset( $this->json[$key] );
+ }
+ }
+ $out += $this->json;
+
+ $type = $this->hasOption( 'skin' ) ? 'skin' : 'extension';
+ $fname = "{$this->dir}/$type.json";
+ $prettyJSON = FormatJson::encode( $out, "\t", FormatJson::ALL_OK );
+ file_put_contents( $fname, $prettyJSON . "\n" );
+ $this->output( "Wrote output to $fname.\n" );
+ if ( $this->hasWarning ) {
+ $this->output( "Found warnings! Please resolve the warnings and rerun this script.\n" );
+ }
+ }
+
+ protected function handleExtensionFunctions( $realName, $value ) {
+ foreach ( $value as $func ) {
+ if ( $func instanceof Closure ) {
+ $this->error( "Error: Closures cannot be converted to JSON. Please move your extension function somewhere else.", 1 );
+ }
+ }
+
+ $this->json[$realName] = $value;
+ }
+
+ protected function handleMessagesDirs( $realName, $value ) {
+ foreach ( $value as $key => $dirs ) {
+ foreach ( (array)$dirs as $dir ) {
+ $this->json[$realName][$key][] = $this->stripPath( $dir, $this->dir );
+ }
+ }
+ }
+
+ private function stripPath( $val, $dir ) {
+ if ( $val === $dir ) {
+ $val = '';
+ } elseif ( strpos( $val, $dir ) === 0 ) {
+ // +1 is for the trailing / that won't be in $this->dir
+ $val = substr( $val, strlen( $dir ) + 1 );
+ }
+
+ return $val;
+ }
+
+ protected function removeAbsolutePath( $realName, $value ) {
+ $out = array();
+ foreach ( $value as $key => $val ) {
+ $out[$key] = $this->stripPath( $val, $this->dir );
+ }
+ $this->json[$realName] = $out;
+ }
+
+ protected function handleCredits( $realName, $value) {
+ $keys = array_keys( $value );
+ $this->json['type'] = $keys[0];
+ $values = array_values( $value );
+ foreach ( $values[0][0] as $name => $val ) {
+ if ( $name !== 'path' ) {
+ $this->json[$name] = $val;
+ }
+ }
+ }
+
+ public function handleHooks( $realName, $value ) {
+ foreach ( $value as $hookName => $handlers ) {
+ foreach ( $handlers as $func ) {
+ if ( $func instanceof Closure ) {
+ $this->error( "Error: Closures cannot be converted to JSON. Please move the handler for $hookName somewhere else.", 1 );
+ }
+ }
+ }
+ $this->json[$realName] = $value;
+ }
+
+ protected function handleResourceModules( $realName, $value ) {
+ $defaults = array();
+ $remote = $this->hasOption( 'skin' ) ? 'remoteSkinPath' : 'remoteExtPath';
+ foreach ( $value as $name => $data ) {
+ if ( isset( $data['localBasePath'] ) ) {
+ $data['localBasePath'] = $this->stripPath( $data['localBasePath'], $this->dir );
+ if ( !$defaults ) {
+ $defaults['localBasePath'] = $data['localBasePath'];
+ unset( $data['localBasePath'] );
+ if ( isset( $data[$remote] ) ) {
+ $defaults[$remote] = $data[$remote];
+ unset( $data[$remote] );
+ }
+ } else {
+ if ( $data['localBasePath'] === $defaults['localBasePath'] ) {
+ unset( $data['localBasePath'] );
+ }
+ if ( isset( $data[$remote] ) && isset( $defaults[$remote] )
+ && $data[$remote] === $defaults[$remote]
+ ) {
+ unset( $data[$remote] );
+ }
+ }
+ }
+
+
+ $this->json[$realName][$name] = $data;
+ }
+ if ( $defaults ) {
+ $this->json['ResourceFileModulePaths'] = $defaults;
+ }
+ }
+}
+
+$maintClass = 'ConvertExtensionToRegistration';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dev/includes/router.php b/maintenance/dev/includes/router.php
index 0a65e31e..97c8954a 100644
--- a/maintenance/dev/includes/router.php
+++ b/maintenance/dev/includes/router.php
@@ -98,5 +98,5 @@ if ( $mime ) {
return true;
}
-# Let the php server handle things on it's own otherwise
+# Let the php server handle things on its own otherwise
return false;
diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic
index df8a34ca..dd27c8ca 100644
--- a/maintenance/dictionary/mediawiki.dic
+++ b/maintenance/dictionary/mediawiki.dic
@@ -1811,7 +1811,6 @@ historysubmit
historywarning
hit
hitcount
-hitcounter
hits
hlist
hmac
@@ -2248,7 +2247,6 @@ logextract
loggedin
logid
login
-loginend
loginerror
loginfo
loginlanguagelinks
@@ -2259,7 +2257,6 @@ loginreqlink
loginreqpagetext
loginreqtitle
logins
-loginstart
logitem
loglink
loglist
@@ -2901,7 +2898,6 @@ numberofedits
numberoffiles
numberofpages
numberofusers
-numberofviews
numberofwatchingusers
numedits
numentries
@@ -4517,7 +4513,7 @@ what
whatlinkshere
whatwg
wheely
-wheter
+whether
whitelist
whitelisted
whitelistedittext
diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php
index 46844c9d..4b9ad9c2 100644
--- a/maintenance/doMaintenance.php
+++ b/maintenance/doMaintenance.php
@@ -56,8 +56,8 @@ $self = $maintenance->getName();
# Start the autoloader, so that extensions can derive classes from core files
require_once "$IP/includes/AutoLoader.php";
-# Stub the profiler
-require_once "$IP/includes/profiler/Profiler.php";
+# Grab profiling functions
+require_once "$IP/includes/profiler/ProfilerFunctions.php";
# Start the profiler
$wgProfiler = array();
@@ -68,6 +68,7 @@ if ( file_exists( "$IP/StartProfiler.php" ) ) {
// Some other requires
require_once "$IP/includes/Defines.php";
require_once "$IP/includes/DefaultSettings.php";
+require_once "$IP/includes/GlobalFunctions.php";
# Load composer's autoloader if present
if ( is_readable( "$IP/vendor/autoload.php" ) ) {
@@ -91,29 +92,26 @@ if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
}
}
-$maintenance->setConfig( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
$maintenance->finalSetup();
// Some last includes
require_once "$IP/includes/Setup.php";
+// Initialize main config instance
+$maintenance->setConfig( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+
// Do the work
-try {
- $maintenance->execute();
+$maintenance->execute();
- // Potentially debug globals
- $maintenance->globals();
+// Potentially debug globals
+$maintenance->globals();
- // Perform deferred updates.
- DeferredUpdates::doUpdates( 'commit' );
+// Perform deferred updates.
+DeferredUpdates::doUpdates( 'commit' );
- // log profiling info
- wfLogProfilingData();
+// log profiling info
+wfLogProfilingData();
- // Commit and close up!
- $factory = wfGetLBFactory();
- $factory->commitMasterChanges();
- $factory->shutdown();
-} catch ( MWException $mwe ) {
- echo $mwe->getText();
- exit( 1 );
-}
+// Commit and close up!
+$factory = wfGetLBFactory();
+$factory->commitMasterChanges();
+$factory->shutdown();
diff --git a/maintenance/dumpIterator.php b/maintenance/dumpIterator.php
index 4b2ff717..d8bc3a4d 100644
--- a/maintenance/dumpIterator.php
+++ b/maintenance/dumpIterator.php
@@ -54,7 +54,7 @@ abstract class DumpIterator extends Maintenance {
$this->checkOptions();
if ( $this->hasOption( 'file' ) ) {
- $revision = new WikiRevision;
+ $revision = new WikiRevision( $this->getConfig() );
$revision->setText( file_get_contents( $this->getOption( 'file' ) ) );
$revision->setTitle( Title::newFromText(
@@ -73,7 +73,7 @@ abstract class DumpIterator extends Maintenance {
$this->error( "Sorry, I don't support dump filenames yet. "
. "Use - and provide it on stdin on the meantime.", true );
}
- $importer = new WikiImporter( $source );
+ $importer = new WikiImporter( $source, $this->getConfig() );
$importer->setRevisionCallback(
array( &$this, 'handleRevision' ) );
diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
index 7c176071..bde5a076 100644
--- a/maintenance/dumpTextPass.php
+++ b/maintenance/dumpTextPass.php
@@ -59,6 +59,8 @@ Options:
--server=h Force reading from MySQL server h
--current Base ETA on number of pages in database instead of all revisions
--spawn Spawn a subprocess for loading text records
+ --buffersize=<size> Buffer size in bytes to use for reading the stub.
+ (Default: 512KB, Minimum: 4KB)
--help Display this help message
ENDS
);
diff --git a/maintenance/eval.php b/maintenance/eval.php
index 51f2cace..e20c477a 100644
--- a/maintenance/eval.php
+++ b/maintenance/eval.php
@@ -49,23 +49,20 @@ if ( isset( $options['d'] ) ) {
$lb->setServerInfo( $i, $server );
}
}
- if ( $d > 2 ) {
- $wgDebugFunctionEntry = true;
- }
}
-$useReadline = function_exists( 'readline_add_history' )
+$__useReadline = function_exists( 'readline_add_history' )
&& Maintenance::posix_isatty( 0 /*STDIN*/ );
-if ( $useReadline ) {
- $historyFile = isset( $_ENV['HOME'] ) ?
+if ( $__useReadline ) {
+ $__historyFile = isset( $_ENV['HOME'] ) ?
"{$_ENV['HOME']}/.mweval_history" : "$IP/maintenance/.mweval_history";
- readline_read_history( $historyFile );
+ readline_read_history( $__historyFile );
}
-$e = null; // PHP exception
-while ( ( $line = Maintenance::readconsole() ) !== false ) {
- if ( $e && !preg_match( '/^(exit|die);?$/', $line ) ) {
+$__e = null; // PHP exception
+while ( ( $__line = Maintenance::readconsole() ) !== false ) {
+ if ( $__e && !preg_match( '/^(exit|die);?$/', $__line ) ) {
// Internal state may be corrupted or fatals may occur later due
// to some object not being set. Don't drop out of eval in case
// lines were being pasted in (which would then get dumped to the shell).
@@ -73,23 +70,23 @@ while ( ( $line = Maintenance::readconsole() ) !== false ) {
echo "Exception was thrown before; please restart eval.php\n";
continue;
}
- if ( $useReadline ) {
- readline_add_history( $line );
- readline_write_history( $historyFile );
+ if ( $__useReadline ) {
+ readline_add_history( $__line );
+ readline_write_history( $__historyFile );
}
try {
- $val = eval( $line . ";" );
- } catch ( Exception $e ) {
- echo "Caught exception " . get_class( $e ) .
- ": {$e->getMessage()}\n" . $e->getTraceAsString() . "\n";
+ $__val = eval( $__line . ";" );
+ } catch ( Exception $__e ) {
+ echo "Caught exception " . get_class( $__e ) .
+ ": {$__e->getMessage()}\n" . $__e->getTraceAsString() . "\n";
continue;
}
- if ( wfIsHHVM() || is_null( $val ) ) {
+ if ( wfIsHHVM() || is_null( $__val ) ) {
echo "\n";
- } elseif ( is_string( $val ) || is_numeric( $val ) ) {
- echo "$val\n";
+ } elseif ( is_string( $__val ) || is_numeric( $__val ) ) {
+ echo "$__val\n";
} else {
- var_dump( $val );
+ var_dump( $__val );
}
}
diff --git a/maintenance/exportSites.php b/maintenance/exportSites.php
new file mode 100644
index 00000000..1c71dc0e
--- /dev/null
+++ b/maintenance/exportSites.php
@@ -0,0 +1,54 @@
+<?php
+
+$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/..';
+
+require_once $basePath . '/maintenance/Maintenance.php';
+
+/**
+ * Maintenance script for exporting site definitions from XML into the sites table.
+ *
+ * @since 1.25
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+class ExportSites extends Maintenance {
+
+ public function __construct() {
+ $this->mDescription = 'Exports site definitions the sites table to XML file';
+
+ $this->addArg( 'file', 'A file to write the XML to (see docs/sitelist.txt). Use "php://stdout" to write to stdout.', true );
+
+ parent::__construct();
+ }
+
+ /**
+ * Do the actual work. All child classes will need to implement this
+ */
+ public function execute() {
+ $file = $this->getArg( 0 );
+
+ if ( $file === 'php://output' || $file === 'php://stdout' ) {
+ $this->mQuiet = true;
+ }
+
+ $handle = fopen( $file, 'w' );
+
+ if ( !$handle ) {
+ $this->error( "Failed to open $file for writing.\n", 1 );
+ }
+
+ $exporter = new SiteExporter( $handle );
+
+ $sites = SiteSQLStore::newInstance()->getSites( 'recache' );
+ $exporter->exportSites( $sites );
+
+ fclose( $handle );
+
+ $this->output( "Exported sites to " . realpath( $file ) . ".\n" );
+ }
+
+}
+
+$maintClass = 'ExportSites';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php
index fc676b89..dd4f760f 100644
--- a/maintenance/fetchText.php
+++ b/maintenance/fetchText.php
@@ -32,7 +32,8 @@ require_once __DIR__ . '/Maintenance.php';
class FetchText extends Maintenance {
public function __construct() {
parent::__construct();
- $this->mDescription = "Fetch the revision text from an old_id";
+ $this->mDescription = "Fetch the raw revision blob from an old_id.";
+ $this->mDescription .= "\nNOTE: Export transformations are NOT applied. This is left to backupTextPass.php";
}
/**
@@ -43,7 +44,7 @@ class FetchText extends Maintenance {
* \n
* text (may be empty)
*
- * note that that the text string itself is *not* followed by newline
+ * note that the text string itself is *not* followed by newline
*/
public function execute() {
$db = wfGetDB( DB_SLAVE );
diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php
index 36760d7e..5cf45367 100644
--- a/maintenance/findHooks.php
+++ b/maintenance/findHooks.php
@@ -91,6 +91,7 @@ class FindHooks extends Maintenance {
$IP . '/includes/jobqueue/',
$IP . '/includes/json/',
$IP . '/includes/logging/',
+ $IP . '/includes/mail/',
$IP . '/includes/media/',
$IP . '/includes/page/',
$IP . '/includes/parser/',
@@ -163,36 +164,39 @@ class FindHooks extends Maintenance {
* @return array Array of documented hooks
*/
private function getHooksFromOnlineDoc() {
- // All hooks
- $allhookdata = Http::get(
- 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
- . 'cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php'
+ $allhooks = $this->getHooksFromOnlineDocCategory( 'MediaWiki_hooks' );
+ $removed = $this->getHooksFromOnlineDocCategory( 'Removed_hooks' );
+ return array_diff( $allhooks, $removed );
+ }
+
+ /**
+ * @param string $title
+ * @return array
+ */
+ private function getHooksFromOnlineDocCategory( $title ) {
+ $params = array(
+ 'action' => 'query',
+ 'list' => 'categorymembers',
+ 'cmtitle' => "Category:$title",
+ 'cmlimit' => 500,
+ 'format' => 'json',
+ 'continue' => '',
);
- $allhookdata = unserialize( $allhookdata );
- $allhooks = array();
- foreach ( $allhookdata['query']['categorymembers'] as $page ) {
- $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
- if ( $found ) {
- $hook = str_replace( ' ', '_', $matches[1] );
- $allhooks[] = $hook;
+
+ $retval = array();
+ while ( true ) {
+ $json = Http::get( wfAppendQuery( 'http://www.mediawiki.org/w/api.php', $params ), array(), __METHOD__ );
+ $data = FormatJson::decode( $json, true );
+ foreach ( $data['query']['categorymembers'] as $page ) {
+ if ( preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $m ) ) {
+ $retval[] = str_replace( ' ', '_', $m[1] );
+ }
}
- }
- // Removed hooks
- $oldhookdata = Http::get(
- 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
- . 'cmtitle=Category:Removed_hooks&cmlimit=500&format=php'
- );
- $oldhookdata = unserialize( $oldhookdata );
- $removed = array();
- foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
- $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
- if ( $found ) {
- $hook = str_replace( ' ', '_', $matches[1] );
- $removed[] = $hook;
+ if ( !isset( $data['continue'] ) ) {
+ return $retval;
}
+ $params = array_replace( $params, $data['continue'] );
}
-
- return array_diff( $allhooks, $removed );
}
/**
diff --git a/maintenance/findMissingFiles.php b/maintenance/findMissingFiles.php
index 5f9f643a..5818ee25 100644
--- a/maintenance/findMissingFiles.php
+++ b/maintenance/findMissingFiles.php
@@ -26,7 +26,7 @@ class FindMissingFiles extends Maintenance {
parent::__construct();
$this->mDescription = 'Find registered files with no corresponding file.';
- $this->addOption( 'start', 'Starting file name', false, true );
+ $this->addOption( 'start', 'Start after this file name', false, true );
$this->addOption( 'mtimeafter', 'Only include files changed since this time', false, true );
$this->addOption( 'mtimebefore', 'Only includes files changed before this time', false, true );
$this->setBatchSize( 300 );
@@ -42,9 +42,12 @@ class FindMissingFiles extends Maintenance {
$mtime1 = $dbr->timestampOrNull( $this->getOption( 'mtimeafter', null ) );
$mtime2 = $dbr->timestampOrNull( $this->getOption( 'mtimebefore', null ) );
- $joinTables = array( 'image' );
- $joinConds = array( 'image' => array( 'INNER JOIN', 'img_name = page_title' ) );
+ $joinTables = array();
+ $joinConds = array();
if ( $mtime1 || $mtime2 ) {
+ $joinTables[] = 'page';
+ $joinConds['page'] = array( 'INNER JOIN',
+ array( 'page_title = img_name', 'page_namespace' => NS_FILE ) );
$joinTables[] = 'logging';
$on = array( 'log_page = page_id', 'log_type' => array( 'upload', 'move', 'delete' ) );
if ( $mtime1 ) {
@@ -58,21 +61,22 @@ class FindMissingFiles extends Maintenance {
do {
$res = $dbr->select(
- array_merge( array( 'page' ), $joinTables ),
- array( 'img_name' => 'DISTINCT(page_title)' ),
- array( 'page_namespace' => NS_FILE,
- "page_title >= " . $dbr->addQuotes( $lastName ) ),
+ array_merge( array( 'image' ), $joinTables ),
+ array( 'name' => 'img_name' ),
+ array( "img_name > " . $dbr->addQuotes( $lastName ) ),
__METHOD__,
- array( 'ORDER BY' => 'page_title', 'LIMIT' => $this->mBatchSize ),
+ // DISTINCT causes a pointless filesort
+ array( 'ORDER BY' => 'name', 'GROUP BY' => 'name',
+ 'LIMIT' => $this->mBatchSize ),
$joinConds
);
// Check if any of these files are missing...
$pathsByName = array();
foreach ( $res as $row ) {
- $file = $repo->newFile( $row->img_name );
- $pathsByName[$row->img_name] = $file->getPath();
- $lastName = $row->img_name;
+ $file = $repo->newFile( $row->name );
+ $pathsByName[$row->name] = $file->getPath();
+ $lastName = $row->name;
}
$be->preloadFileStat( array( 'srcs' => $pathsByName ) );
foreach ( $pathsByName as $path ) {
diff --git a/maintenance/fixUserRegistration.php b/maintenance/fixUserRegistration.php
index 878593c7..40e09159 100644
--- a/maintenance/fixUserRegistration.php
+++ b/maintenance/fixUserRegistration.php
@@ -33,37 +33,57 @@ class FixUserRegistration extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Fix the user_registration field";
+ $this->setBatchSize( 1000 );
}
public function execute() {
- $dbr = wfGetDB( DB_SLAVE );
$dbw = wfGetDB( DB_MASTER );
- // Get user IDs which need fixing
- $res = $dbr->select( 'user', 'user_id', 'user_registration IS NULL', __METHOD__ );
- foreach ( $res as $row ) {
- $id = $row->user_id;
- // Get first edit time
- $timestamp = $dbr->selectField(
- 'revision',
- 'MIN(rev_timestamp)',
- array( 'rev_user' => $id ),
- __METHOD__
+ $lastId = 0;
+ do {
+ // Get user IDs which need fixing
+ $res = $dbw->select(
+ 'user',
+ 'user_id',
+ array(
+ 'user_id > ' . $dbw->addQuotes( $lastId ),
+ 'user_registration IS NULL'
+ ),
+ __METHOD__,
+ array(
+ 'LIMIT' => $this->mBatchSize,
+ 'ORDER BY' => 'user_id',
+ )
);
- // Update
- if ( !empty( $timestamp ) ) {
- $dbw->update(
- 'user',
- array( 'user_registration' => $timestamp ),
- array( 'user_id' => $id ),
+ foreach ( $res as $row ) {
+ $id = $row->user_id;
+ $lastId = $id;
+ // Get first edit time
+ $timestamp = $dbw->selectField(
+ 'revision',
+ 'MIN(rev_timestamp)',
+ array( 'rev_user' => $id ),
__METHOD__
);
- $this->output( "$id $timestamp\n" );
- } else {
- $this->output( "$id NULL\n" );
+ // Update
+ if ( $timestamp !== null ) {
+ $dbw->update(
+ 'user',
+ array( 'user_registration' => $timestamp ),
+ array( 'user_id' => $id ),
+ __METHOD__
+ );
+ $user = User::newFromId( $id );
+ $user->invalidateCache();
+ $this->output( "Set registration for #$id to $timestamp\n" );
+ } else {
+ $this->output( "Could not find registration for #$id NULL\n" );
+ }
}
- }
- $this->output( "\n" );
+ $this->output( "Waiting for slaves..." );
+ wfWaitForSlaves();
+ $this->output( " done.\n" );
+ } while ( $res->numRows() >= $this->mBatchSize );
}
}
diff --git a/maintenance/generateLocalAutoload.php b/maintenance/generateLocalAutoload.php
new file mode 100644
index 00000000..b8caa4d9
--- /dev/null
+++ b/maintenance/generateLocalAutoload.php
@@ -0,0 +1,25 @@
+<?php
+
+if ( PHP_SAPI != 'cli' ) {
+ die( "This script can only be run from the command line.\n" );
+}
+
+require_once __DIR__ . '/../includes/utils/AutoloadGenerator.php';
+
+// Mediawiki installation directory
+$base = dirname( __DIR__ );
+
+$generator = new AutoloadGenerator( $base, 'local' );
+foreach ( array( 'includes', 'languages', 'maintenance', 'mw-config' ) as $dir ) {
+ $generator->readDir( $base . '/' . $dir );
+}
+foreach ( glob( $base . '/*.php' ) as $file ) {
+ $generator->readFile( $file );
+}
+
+// This class is not defined, but might be added by the installer
+$generator->forceClassPath( 'MyLocalSettingsGenerator', "$base/mw-config/overrides.php" );
+
+// Write out the autoload
+$generator->generateAutoload( 'maintenance/generateLocalAutoload.php' );
+
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index 1930a22a..12711ea3 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -181,7 +181,14 @@ class GenerateSitemap extends Maintenance {
$this->setNamespacePriorities();
$this->url_limit = 50000;
$this->size_limit = pow( 2, 20 ) * 10;
- $this->fspath = self::init_path( $this->getOption( 'fspath', getcwd() ) );
+
+ # Create directory if needed
+ $fspath = $this->getOption( 'fspath', getcwd() );
+ if ( !wfMkdirParents( $fspath, null, __METHOD__ ) ) {
+ $this->error( "Can not create directory $fspath.", 1 );
+ }
+
+ $this->fspath = realpath( $fspath ) . DIRECTORY_SEPARATOR;
$this->urlpath = $this->getOption( 'urlpath', "" );
if ( $this->urlpath !== "" && substr( $this->urlpath, -1 ) !== '/' ) {
$this->urlpath .= '/';
@@ -239,20 +246,6 @@ class GenerateSitemap extends Maintenance {
}
/**
- * Create directory if it does not exist and return pathname with a trailing slash
- * @param string $fspath
- * @return null|string
- */
- private static function init_path( $fspath ) {
- # Create directory if needed
- if ( $fspath && !is_dir( $fspath ) ) {
- wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
- }
-
- return realpath( $fspath ) . DIRECTORY_SEPARATOR;
- }
-
- /**
* Generate a one-dimensional array of existing namespaces
*/
function generateNamespaces() {
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index 1f75bccf..ea8c84bb 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -270,7 +270,7 @@ TEXT;
$this->startTime = microtime( true );
$source = new ImportStreamSource( $handle );
- $importer = new WikiImporter( $source );
+ $importer = new WikiImporter( $source, $this->getConfig() );
if ( $this->hasOption( 'debug' ) ) {
$importer->setDebug( true );
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
index b803e3da..4b839a0f 100644
--- a/maintenance/importImages.inc
+++ b/maintenance/importImages.inc
@@ -117,7 +117,7 @@ function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
function getFileCommentFromSourceWiki( $wiki_host, $file ) {
$url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
. rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
- $body = Http::get( $url );
+ $body = Http::get( $url, array(), __METHOD__ );
if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
return false;
}
@@ -128,7 +128,7 @@ function getFileCommentFromSourceWiki( $wiki_host, $file ) {
function getFileUserFromSourceWiki( $wiki_host, $file ) {
$url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
. rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
- $body = Http::get( $url );
+ $body = Http::get( $url, array(), __METHOD__ );
if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
return false;
}
diff --git a/maintenance/importSiteScripts.php b/maintenance/importSiteScripts.php
index 7705ec9c..6566a60d 100644
--- a/maintenance/importSiteScripts.php
+++ b/maintenance/importSiteScripts.php
@@ -59,7 +59,7 @@ class ImportSiteScripts extends Maintenance {
$url = wfAppendQuery( $baseUrl, array(
'action' => 'raw',
'title' => "MediaWiki:{$page}" ) );
- $text = Http::get( $url );
+ $text = Http::get( $url, array(), __METHOD__ );
$wikiPage = WikiPage::factory( $title );
$content = ContentHandler::makeContent( $text, $wikiPage->getTitle() );
@@ -70,33 +70,40 @@ class ImportSiteScripts extends Maintenance {
protected function fetchScriptList() {
$data = array(
'action' => 'query',
- 'format' => 'php', //'json',
+ 'format' => 'json',
'list' => 'allpages',
'apnamespace' => '8',
'aplimit' => '500',
+ 'continue' => '',
);
$baseUrl = $this->getArg( 0 );
$pages = array();
- do {
+ while ( true ) {
$url = wfAppendQuery( $baseUrl, $data );
- $strResult = Http::get( $url );
- //$result = FormatJson::decode( $strResult ); // Still broken
- $result = unserialize( $strResult );
+ $strResult = Http::get( $url, array(), __METHOD__ );
+ $result = FormatJson::decode( $strResult, true );
- if ( !empty( $result['query']['allpages'] ) ) {
- foreach ( $result['query']['allpages'] as $page ) {
- if ( substr( $page['title'], -3 ) === '.js' ) {
- strtok( $page['title'], ':' );
- $pages[] = strtok( '' );
- }
+ $page = null;
+ foreach ( $result['query']['allpages'] as $page ) {
+ if ( substr( $page['title'], -3 ) === '.js' ) {
+ strtok( $page['title'], ':' );
+ $pages[] = strtok( '' );
}
}
- if ( !empty( $result['query-continue'] ) ) {
- $data['apfrom'] = $result['query-continue']['allpages']['apfrom'];
- $this->output( "Fetching new batch from {$data['apfrom']}\n" );
+
+ if ( $page !== null ) {
+ $this->output( "Fetched list up to {$page['title']}\n" );
+ }
+
+ if ( isset( $result['continue'] ) ) { // >= 1.21
+ $data = array_replace( $data, $result['continue'] );
+ } elseif ( isset( $result['query-continue']['allpages'] ) ) { // <= 1.20
+ $data = array_replace( $data, $result['query-continue']['allpages'] );
+ } else {
+ break;
}
- } while ( isset( $result['query-continue'] ) );
+ }
return $pages;
}
diff --git a/maintenance/importSites.php b/maintenance/importSites.php
new file mode 100644
index 00000000..7abb8d72
--- /dev/null
+++ b/maintenance/importSites.php
@@ -0,0 +1,52 @@
+<?php
+
+$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/..';
+
+require_once $basePath . '/maintenance/Maintenance.php';
+
+/**
+ * Maintenance script for importing site definitions from XML into the sites table.
+ *
+ * @since 1.25
+ *
+ * @license GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+class ImportSites extends Maintenance {
+
+ public function __construct() {
+ $this->mDescription = 'Imports site definitions from XML into the sites table.';
+
+ $this->addArg( 'file', 'An XML file containing site definitions (see docs/sitelist.txt). Use "php://stdin" to read from stdin.', true );
+
+ parent::__construct();
+ }
+
+
+ /**
+ * Do the import.
+ */
+ public function execute() {
+ $file = $this->getArg( 0 );
+
+ $importer = new SiteImporter( SiteSQLStore::newInstance() );
+ $importer->setExceptionCallback( array( $this, 'reportException' ) );
+
+ $importer->importFromFile( $file );
+
+ $this->output( "Done.\n" );
+ }
+
+ /**
+ * Outputs a message via the output() method.
+ *
+ * @param Exception $ex
+ */
+ public function reportException( Exception $ex ) {
+ $msg = $ex->getMessage();
+ $this->output( "$msg\n" );
+ }
+}
+
+$maintClass = 'ImportSites';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/initSiteStats.php b/maintenance/initSiteStats.php
index 49e0e9d7..cac33ecc 100644
--- a/maintenance/initSiteStats.php
+++ b/maintenance/initSiteStats.php
@@ -34,11 +34,7 @@ class InitSiteStats extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Re-initialise the site statistics tables";
- $this->addOption(
- 'update',
- 'Update the existing statistics (preserves the ss_total_views field)'
- );
- $this->addOption( 'noviews', "Don't update the page view counter" );
+ $this->addOption( 'update', 'Update the existing statistics' );
$this->addOption( 'active', 'Also update active users count' );
$this->addOption( 'use-master', 'Count using the master database' );
}
@@ -63,12 +59,6 @@ class InitSiteStats extends Maintenance {
$image = $counter->files();
$this->output( "{$image}\n" );
- if ( !$this->hasOption( 'noviews' ) ) {
- $this->output( "Counting total page views..." );
- $views = $counter->views();
- $this->output( "{$views}\n" );
- }
-
if ( $this->hasOption( 'update' ) ) {
$this->output( "\nUpdating site statistics..." );
$counter->refresh();
diff --git a/maintenance/interwiki.list b/maintenance/interwiki.list
index 0660e55f..91c60c1c 100644
--- a/maintenance/interwiki.list
+++ b/maintenance/interwiki.list
@@ -1,77 +1,77 @@
# Based more or less on the public interwiki map from MeatballWiki
# Default interwiki prefixes...
-acronym|http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1|0
-advogato|http://www.advogato.org/$1|0
-arxiv|http://www.arxiv.org/abs/$1|0
-c2find|http://c2.com/cgi/wiki?FindPage&value=$1|0
-cache|http://www.google.com/search?q=cache:$1|0
-commons|https://commons.wikimedia.org/wiki/$1|0
-dictionary|http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1|0
-docbook|http://wiki.docbook.org/$1|0
-doi|http://dx.doi.org/$1|0
-drumcorpswiki|http://www.drumcorpswiki.com/$1|0
-dwjwiki|http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1|0
-elibre|http://enciclopedia.us.es/index.php/$1|0
-emacswiki|http://www.emacswiki.org/cgi-bin/wiki.pl?$1|0
-foldoc|http://foldoc.org/?$1|0
-foxwiki|http://fox.wikis.com/wc.dll?Wiki~$1|0
-freebsdman|http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1|0
-gej|http://www.esperanto.de/dej.malnova/aktivikio.pl?$1|0
-gentoo-wiki|http://gentoo-wiki.com/$1|0
-google|http://www.google.com/search?q=$1|0
-googlegroups|http://groups.google.com/groups?q=$1|0
-hammondwiki|http://www.dairiki.org/HammondWiki/$1|0
-hrwiki|http://www.hrwiki.org/wiki/$1|0
-imdb|http://www.imdb.com/find?q=$1&tt=on|0
-jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0
-kmwiki|http://kmwiki.wikispaces.com/$1|0
-linuxwiki|http://linuxwiki.de/$1|0
-lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0
-lqwiki|http://wiki.linuxquestions.org/wiki/$1|0
-lugkr|http://www.lug-kr.de/wiki/$1|0
-meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0
-mediawikiwiki|https://www.mediawiki.org/wiki/$1|0
-mediazilla|https://bugzilla.wikimedia.org/$1|0
-memoryalpha|http://en.memory-alpha.org/wiki/$1|0
-metawiki|http://sunir.org/apps/meta.pl?$1|0
-metawikimedia|https://meta.wikimedia.org/wiki/$1|0
-mozillawiki|http://wiki.mozilla.org/$1|0
-mw|http://www.mediawiki.org/wiki/$1|0
-oeis|http://oeis.org/$1|0
-openwiki|http://openwiki.com/ow.asp?$1|0
-ppr|http://c2.com/cgi/wiki?$1|0
-pythoninfo|http://wiki.python.org/moin/$1|0
-rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0
-s23wiki|http://s23.org/wiki/$1|0
-seattlewireless|http://seattlewireless.net/$1|0
-senseislibrary|http://senseis.xmp.net/?$1|0
-shoutwiki|http://www.shoutwiki.com/wiki/$1|0
-sourceforge|http://sourceforge.net/$1|0
-sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0
-squeak|http://wiki.squeak.org/squeak/$1|0
-tejo|http://www.tejo.org/vikio/$1|0
-tmbw|http://www.tmbw.net/wiki/$1|0
-tmnet|http://www.technomanifestos.net/?$1|0
-theopedia|http://www.theopedia.com/$1|0
-twiki|http://twiki.org/cgi-bin/view/$1|0
-uea|http://uea.org/vikio/index.php/$1|0
-uncyclopedia|http://en.uncyclopedia.co/wiki/$1|0
-unreal|http://wiki.beyondunreal.com/$1|0
-usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0
-webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0
-wiki|http://c2.com/cgi/wiki?$1|0
-wikia|http://www.wikia.com/wiki/$1|0
-wikibooks|https://en.wikibooks.org/wiki/$1|0
-wikif1|http://www.wikif1.org/$1|0
-wikihow|http://www.wikihow.com/$1|0
-wikinfo|http://wikinfo.co/English/index.php/$1|0
-wikimedia|https://wikimediafoundation.org/wiki/$1|0
-wikinews|https://en.wikinews.org/wiki/$1|0
-wikipedia|https://en.wikipedia.org/wiki/$1|0
-wikiquote|https://en.wikiquote.org/wiki/$1|0
-wikisource|https://wikisource.org/wiki/$1|0
-wikispecies|https://species.wikimedia.org/wiki/$1|0
-wikiversity|https://en.wikiversity.org/wiki/$1|0
-wikivoyage|https://en.wikivoyage.org/wiki/$1|0
-wikt|https://en.wiktionary.org/wiki/$1|0
-wiktionary|https://en.wiktionary.org/wiki/$1|0
+acronym|http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1|0|
+advogato|http://www.advogato.org/$1|0|
+arxiv|http://www.arxiv.org/abs/$1|0|
+c2find|http://c2.com/cgi/wiki?FindPage&value=$1|0|
+cache|http://www.google.com/search?q=cache:$1|0|
+commons|https://commons.wikimedia.org/wiki/$1|0|https://commons.wikimedia.org/w/api.php
+dictionary|http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1|0|
+docbook|http://wiki.docbook.org/$1|0|
+doi|http://dx.doi.org/$1|0|
+drumcorpswiki|http://www.drumcorpswiki.com/$1|0|http://drumcorpswiki.com/api.php
+dwjwiki|http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1|0|
+elibre|http://enciclopedia.us.es/index.php/$1|0|http://enciclopedia.us.es/api.php
+emacswiki|http://www.emacswiki.org/cgi-bin/wiki.pl?$1|0|
+foldoc|http://foldoc.org/?$1|0|
+foxwiki|http://fox.wikis.com/wc.dll?Wiki~$1|0|
+freebsdman|http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1|0|
+gej|http://www.esperanto.de/dej.malnova/aktivikio.pl?$1|0|
+gentoo-wiki|http://gentoo-wiki.com/$1|0|
+google|http://www.google.com/search?q=$1|0|
+googlegroups|http://groups.google.com/groups?q=$1|0|
+hammondwiki|http://www.dairiki.org/HammondWiki/$1|0|
+hrwiki|http://www.hrwiki.org/wiki/$1|0|http://www.hrwiki.org/w/api.php
+imdb|http://www.imdb.com/find?q=$1&tt=on|0|
+jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0|
+kmwiki|http://kmwiki.wikispaces.com/$1|0|
+linuxwiki|http://linuxwiki.de/$1|0|
+lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0|
+lqwiki|http://wiki.linuxquestions.org/wiki/$1|0|
+lugkr|http://www.lug-kr.de/wiki/$1|0|
+meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0|
+mediawikiwiki|https://www.mediawiki.org/wiki/$1|0|https://www.mediawiki.org/w/api.php
+mediazilla|https://bugzilla.wikimedia.org/$1|0|
+memoryalpha|http://en.memory-alpha.org/wiki/$1|0|http://en.memory-alpha.org/api.php
+metawiki|http://sunir.org/apps/meta.pl?$1|0|
+metawikimedia|https://meta.wikimedia.org/wiki/$1|0|https://meta.wikimedia.org/w/api.php
+mozillawiki|http://wiki.mozilla.org/$1|0|https://wiki.mozilla.org/api.php
+mw|https://www.mediawiki.org/wiki/$1|0|https://www.mediawiki.org/w/api.php
+oeis|http://oeis.org/$1|0|
+openwiki|http://openwiki.com/ow.asp?$1|0|
+ppr|http://c2.com/cgi/wiki?$1|0|
+pythoninfo|http://wiki.python.org/moin/$1|0|
+rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0|
+s23wiki|http://s23.org/wiki/$1|0|http://s23.org/w/api.php
+seattlewireless|http://seattlewireless.net/$1|0|
+senseislibrary|http://senseis.xmp.net/?$1|0|
+shoutwiki|http://www.shoutwiki.com/wiki/$1|0|http://www.shoutwiki.com/w/api.php
+sourceforge|http://sourceforge.net/$1|0|
+sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0|http://www.sourcewatch.org/api.php
+squeak|http://wiki.squeak.org/squeak/$1|0|
+tejo|http://www.tejo.org/vikio/$1|0|
+tmbw|http://www.tmbw.net/wiki/$1|0|http://tmbw.net/wiki/api.php
+tmnet|http://www.technomanifestos.net/?$1|0|
+theopedia|http://www.theopedia.com/$1|0|
+twiki|http://twiki.org/cgi-bin/view/$1|0|
+uea|http://uea.org/vikio/index.php/$1|0|http://uea.org/vikio/api.php
+uncyclopedia|http://en.uncyclopedia.co/wiki/$1|0|http://en.uncyclopedia.co/w/api.php
+unreal|http://wiki.beyondunreal.com/$1|0|http://wiki.beyondunreal.com/w/api.php
+usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0|
+webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0|
+wiki|http://c2.com/cgi/wiki?$1|0|
+wikia|http://www.wikia.com/wiki/$1|0|
+wikibooks|https://en.wikibooks.org/wiki/$1|0|https://en.wikibooks.org/w/api.php
+wikif1|http://www.wikif1.org/$1|0|
+wikihow|http://www.wikihow.com/$1|0|http://www.wikihow.com/api.php
+wikinfo|http://wikinfo.co/English/index.php/$1|0|
+wikimedia|https://wikimediafoundation.org/wiki/$1|0|https://wikimediafoundation.org/w/api.php
+wikinews|https://en.wikinews.org/wiki/$1|0|https://en.wikinews.org/w/api.php
+wikipedia|https://en.wikipedia.org/wiki/$1|0|https://en.wikipedia.org/w/api.php
+wikiquote|https://en.wikiquote.org/wiki/$1|0|https://en.wikiquote.org/w/api.php
+wikisource|https://wikisource.org/wiki/$1|0|https://wikisource.org/w/api.php
+wikispecies|https://species.wikimedia.org/wiki/$1|0|https://species.wikimedia.org/w/api.php
+wikiversity|https://en.wikiversity.org/wiki/$1|0|https://en.wikiversity.org/w/api.php
+wikivoyage|https://en.wikivoyage.org/wiki/$1|0|https://en.wikivoyage.org/w/api.php
+wikt|https://en.wiktionary.org/wiki/$1|0|https://en.wiktionary.org/w/api.php
+wiktionary|https://en.wiktionary.org/wiki/$1|0|https://en.wiktionary.org/w/api.php
diff --git a/maintenance/interwiki.sql b/maintenance/interwiki.sql
index aad0cc3b..0628773e 100644
--- a/maintenance/interwiki.sql
+++ b/maintenance/interwiki.sql
@@ -1,80 +1,80 @@
-- Based more or less on the public interwiki map from MeatballWiki
-- Default interwiki prefixes...
-REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
-('acronym','http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1',0),
-('advogato','http://www.advogato.org/$1',0),
-('arxiv','http://www.arxiv.org/abs/$1',0),
-('c2find','http://c2.com/cgi/wiki?FindPage&value=$1',0),
-('cache','http://www.google.com/search?q=cache:$1',0),
-('commons','https://commons.wikimedia.org/wiki/$1',0),
-('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1',0),
-('docbook','http://wiki.docbook.org/$1',0),
-('doi','http://dx.doi.org/$1',0),
-('drumcorpswiki','http://www.drumcorpswiki.com/$1',0),
-('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1',0),
-('elibre','http://enciclopedia.us.es/index.php/$1',0),
-('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1',0),
-('foldoc','http://foldoc.org/?$1',0),
-('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1',0),
-('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1',0),
-('gej','http://www.esperanto.de/dej.malnova/aktivikio.pl?$1',0),
-('gentoo-wiki','http://gentoo-wiki.com/$1',0),
-('google','http://www.google.com/search?q=$1',0),
-('googlegroups','http://groups.google.com/groups?q=$1',0),
-('hammondwiki','http://www.dairiki.org/HammondWiki/$1',0),
-('hrwiki','http://www.hrwiki.org/wiki/$1',0),
-('imdb','http://www.imdb.com/find?q=$1&tt=on',0),
-('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1',0),
-('kmwiki','http://kmwiki.wikispaces.com/$1',0),
-('linuxwiki','http://linuxwiki.de/$1',0),
-('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1',0),
-('lqwiki','http://wiki.linuxquestions.org/wiki/$1',0),
-('lugkr','http://www.lug-kr.de/wiki/$1',0),
-('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1',0),
-('mediawikiwiki','https://www.mediawiki.org/wiki/$1',0),
-('mediazilla','https://bugzilla.wikimedia.org/$1',0),
-('memoryalpha','http://en.memory-alpha.org/wiki/$1',0),
-('metawiki','http://sunir.org/apps/meta.pl?$1',0),
-('metawikimedia','https://meta.wikimedia.org/wiki/$1',0),
-('mozillawiki','http://wiki.mozilla.org/$1',0),
-('mw','http://www.mediawiki.org/wiki/$1',0),
-('oeis','http://oeis.org/$1',0),
-('openwiki','http://openwiki.com/ow.asp?$1',0),
-('ppr','http://c2.com/cgi/wiki?$1',0),
-('pythoninfo','http://wiki.python.org/moin/$1',0),
-('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt',0),
-('s23wiki','http://s23.org/wiki/$1',0),
-('seattlewireless','http://seattlewireless.net/$1',0),
-('senseislibrary','http://senseis.xmp.net/?$1',0),
-('shoutwiki','http://www.shoutwiki.com/wiki/$1',0),
-('sourceforge','http://sourceforge.net/$1',0),
-('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0),
-('squeak','http://wiki.squeak.org/squeak/$1',0),
-('tejo','http://www.tejo.org/vikio/$1',0),
-('tmbw','http://www.tmbw.net/wiki/$1',0),
-('tmnet','http://www.technomanifestos.net/?$1',0),
-('theopedia','http://www.theopedia.com/$1',0),
-('twiki','http://twiki.org/cgi-bin/view/$1',0),
-('uea','http://uea.org/vikio/index.php/$1',0),
-('uncyclopedia','http://en.uncyclopedia.co/wiki/$1',0),
-('unreal','http://wiki.beyondunreal.com/$1',0),
-('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0),
-('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0),
-('wiki','http://c2.com/cgi/wiki?$1',0),
-('wikia','http://www.wikia.com/wiki/$1',0),
-('wikibooks','https://en.wikibooks.org/wiki/$1',0),
-('wikif1','http://www.wikif1.org/$1',0),
-('wikihow','http://www.wikihow.com/$1',0),
-('wikinfo','http://wikinfo.co/English/index.php/$1',0),
-('wikimedia','https://wikimediafoundation.org/wiki/$1',0),
-('wikinews','https://en.wikinews.org/wiki/$1',0),
-('wikipedia','https://en.wikipedia.org/wiki/$1',0),
-('wikiquote','https://en.wikiquote.org/wiki/$1',0),
-('wikisource','https://wikisource.org/wiki/$1',0),
-('wikispecies','https://species.wikimedia.org/wiki/$1',0),
-('wikiversity','https://en.wikiversity.org/wiki/$1',0),
-('wikivoyage','https://en.wikivoyage.org/wiki/$1',0),
-('wikt','https://en.wiktionary.org/wiki/$1',0),
-('wiktionary','https://en.wiktionary.org/wiki/$1',0)
+REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local,iw_api) VALUES
+('acronym','http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1',0,''),
+('advogato','http://www.advogato.org/$1',0,''),
+('arxiv','http://www.arxiv.org/abs/$1',0,''),
+('c2find','http://c2.com/cgi/wiki?FindPage&value=$1',0,''),
+('cache','http://www.google.com/search?q=cache:$1',0,''),
+('commons','https://commons.wikimedia.org/wiki/$1',0,'https://commons.wikimedia.org/w/api.php'),
+('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1',0,''),
+('docbook','http://wiki.docbook.org/$1',0,''),
+('doi','http://dx.doi.org/$1',0,''),
+('drumcorpswiki','http://www.drumcorpswiki.com/$1',0,'http://drumcorpswiki.com/api.php'),
+('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1',0,''),
+('elibre','http://enciclopedia.us.es/index.php/$1',0,'http://enciclopedia.us.es/api.php'),
+('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1',0,''),
+('foldoc','http://foldoc.org/?$1',0,''),
+('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1',0,''),
+('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1',0,''),
+('gej','http://www.esperanto.de/dej.malnova/aktivikio.pl?$1',0,''),
+('gentoo-wiki','http://gentoo-wiki.com/$1',0,''),
+('google','http://www.google.com/search?q=$1',0,''),
+('googlegroups','http://groups.google.com/groups?q=$1',0,''),
+('hammondwiki','http://www.dairiki.org/HammondWiki/$1',0,''),
+('hrwiki','http://www.hrwiki.org/wiki/$1',0,'http://www.hrwiki.org/w/api.php'),
+('imdb','http://www.imdb.com/find?q=$1&tt=on',0,''),
+('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1',0,''),
+('kmwiki','http://kmwiki.wikispaces.com/$1',0,''),
+('linuxwiki','http://linuxwiki.de/$1',0,''),
+('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1',0,''),
+('lqwiki','http://wiki.linuxquestions.org/wiki/$1',0,''),
+('lugkr','http://www.lug-kr.de/wiki/$1',0,''),
+('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1',0,''),
+('mediawikiwiki','https://www.mediawiki.org/wiki/$1',0,'https://www.mediawiki.org/w/api.php'),
+('mediazilla','https://bugzilla.wikimedia.org/$1',0,''),
+('memoryalpha','http://en.memory-alpha.org/wiki/$1',0,'http://en.memory-alpha.org/api.php'),
+('metawiki','http://sunir.org/apps/meta.pl?$1',0,''),
+('metawikimedia','https://meta.wikimedia.org/wiki/$1',0,'https://meta.wikimedia.org/w/api.php'),
+('mozillawiki','http://wiki.mozilla.org/$1',0,'https://wiki.mozilla.org/api.php'),
+('mw','https://www.mediawiki.org/wiki/$1',0,'https://www.mediawiki.org/w/api.php'),
+('oeis','http://oeis.org/$1',0,''),
+('openwiki','http://openwiki.com/ow.asp?$1',0,''),
+('ppr','http://c2.com/cgi/wiki?$1',0,''),
+('pythoninfo','http://wiki.python.org/moin/$1',0,''),
+('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt',0,''),
+('s23wiki','http://s23.org/wiki/$1',0,'http://s23.org/w/api.php'),
+('seattlewireless','http://seattlewireless.net/$1',0,''),
+('senseislibrary','http://senseis.xmp.net/?$1',0,''),
+('shoutwiki','http://www.shoutwiki.com/wiki/$1',0,'http://www.shoutwiki.com/w/api.php'),
+('sourceforge','http://sourceforge.net/$1',0,''),
+('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0,'http://www.sourcewatch.org/api.php'),
+('squeak','http://wiki.squeak.org/squeak/$1',0,''),
+('tejo','http://www.tejo.org/vikio/$1',0,''),
+('tmbw','http://www.tmbw.net/wiki/$1',0,'http://tmbw.net/wiki/api.php'),
+('tmnet','http://www.technomanifestos.net/?$1',0,''),
+('theopedia','http://www.theopedia.com/$1',0,''),
+('twiki','http://twiki.org/cgi-bin/view/$1',0,''),
+('uea','http://uea.org/vikio/index.php/$1',0,'http://uea.org/vikio/api.php'),
+('uncyclopedia','http://en.uncyclopedia.co/wiki/$1',0,'http://en.uncyclopedia.co/w/api.php'),
+('unreal','http://wiki.beyondunreal.com/$1',0,'http://wiki.beyondunreal.com/w/api.php'),
+('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0,''),
+('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0,''),
+('wiki','http://c2.com/cgi/wiki?$1',0,''),
+('wikia','http://www.wikia.com/wiki/$1',0,''),
+('wikibooks','https://en.wikibooks.org/wiki/$1',0,'https://en.wikibooks.org/w/api.php'),
+('wikif1','http://www.wikif1.org/$1',0,''),
+('wikihow','http://www.wikihow.com/$1',0,'http://www.wikihow.com/api.php'),
+('wikinfo','http://wikinfo.co/English/index.php/$1',0,''),
+('wikimedia','https://wikimediafoundation.org/wiki/$1',0,'https://wikimediafoundation.org/w/api.php'),
+('wikinews','https://en.wikinews.org/wiki/$1',0,'https://en.wikinews.org/w/api.php'),
+('wikipedia','https://en.wikipedia.org/wiki/$1',0,'https://en.wikipedia.org/w/api.php'),
+('wikiquote','https://en.wikiquote.org/wiki/$1',0,'https://en.wikiquote.org/w/api.php'),
+('wikisource','https://wikisource.org/wiki/$1',0,'https://wikisource.org/w/api.php'),
+('wikispecies','https://species.wikimedia.org/wiki/$1',0,'https://species.wikimedia.org/w/api.php'),
+('wikiversity','https://en.wikiversity.org/wiki/$1',0,'https://en.wikiversity.org/w/api.php'),
+('wikivoyage','https://en.wikivoyage.org/wiki/$1',0,'https://en.wikivoyage.org/w/api.php'),
+('wikt','https://en.wiktionary.org/wiki/$1',0,'https://en.wiktionary.org/w/api.php'),
+('wiktionary','https://en.wiktionary.org/wiki/$1',0,'https://en.wiktionary.org/w/api.php')
;
diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json
index d6163bde..eab2b632 100644
--- a/maintenance/jsduck/categories.json
+++ b/maintenance/jsduck/categories.json
@@ -13,7 +13,9 @@
"mw.html",
"mw.html.Cdata",
"mw.html.Raw",
- "mw.hook"
+ "mw.hook",
+ "mw.template",
+ "mw.errorLogger"
]
},
{
@@ -21,6 +23,7 @@
"classes": [
"mw.Title",
"mw.Uri",
+ "mw.messagePoster.*",
"mw.notification",
"mw.Notification_",
"mw.user",
@@ -54,7 +57,8 @@
{
"name": "Interfaces",
"classes": [
- "mw.Feedback"
+ "mw.Feedback",
+ "mw.Feedback.Dialog"
]
},
{
@@ -69,8 +73,7 @@
"mw.log",
"mw.inspect",
"mw.inspect.reports",
- "mw.Debug",
- "mw.Debug.profile"
+ "mw.Debug"
]
}
]
diff --git a/maintenance/jsduck/CustomTags.rb b/maintenance/jsduck/custom_tags.rb
index 2aff9881..39589a06 100644
--- a/maintenance/jsduck/CustomTags.rb
+++ b/maintenance/jsduck/custom_tags.rb
@@ -11,16 +11,16 @@ class CommonTag < JsDuck::Tag::Tag
@repeatable = true
end
- def parse_doc(scanner, position)
+ def parse_doc(scanner, _position)
if @multiline
- return { :tagname => @tagname, :doc => :multiline }
+ return { tagname: @tagname, doc: :multiline }
else
text = scanner.match(/.*$/)
- return { :tagname => @tagname, :doc => text }
+ return { tagname: @tagname, doc: text }
end
end
- def process_doc(context, tags, position)
+ def process_doc(context, tags, _position)
context[@tagname] = tags
end
@@ -34,7 +34,7 @@ end
class SourceTag < CommonTag
def initialize
@tagname = :source
- @pattern = "source"
+ @pattern = 'source'
super
end
@@ -51,7 +51,7 @@ end
class SeeTag < CommonTag
def initialize
@tagname = :see
- @pattern = "see"
+ @pattern = 'see'
super
end
@@ -66,18 +66,20 @@ class SeeTag < CommonTag
<<-EOHTML
<h3 class="pa">Related</h3>
<ul>
- #{ context[@tagname].map {|tag| tag[:doc] }.join("\n") }
+ #{ context[@tagname].map { |tag| tag[:doc] }.join("\n") }
</ul>
EOHTML
end
def render_long_see(tag, formatter, position)
- if tag =~ /\A([^\s]+)( .*)?\Z/m
- name = $1
- doc = $2 ? ': ' + $2 : ''
+ match = /\A([^\s]+)( .*)?\Z/m.match(tag)
+
+ if match
+ name = match[1]
+ doc = match[2] ? ': ' + match[2] : ''
return formatter.format("{@link #{name}} #{doc}")
else
- JsDuck::Logger.warn(nil, 'Unexpected @see argument: "'+tag+'"', position)
+ JsDuck::Logger.warn(nil, 'Unexpected @see argument: "' + tag + '"', position)
return tag
end
end
@@ -105,11 +107,13 @@ class ContextTag < CommonTag
end
def render_long_context(tag, formatter, position)
- if tag =~ /\A([^\s]+)/m
- name = $1
+ match = /\A([^\s]+)/m.match(tag)
+
+ if match
+ name = match[1]
return formatter.format("`context` : {@link #{name}}")
else
- JsDuck::Logger.warn(nil, 'Unexpected @context argument: "'+tag+'"', position)
+ JsDuck::Logger.warn(nil, 'Unexpected @context argument: "' + tag + '"', position)
return tag
end
end
diff --git a/maintenance/jsduck/eg-iframe.html b/maintenance/jsduck/eg-iframe.html
index 7dc4afa8..fca839d9 100644
--- a/maintenance/jsduck/eg-iframe.html
+++ b/maintenance/jsduck/eg-iframe.html
@@ -3,14 +3,46 @@
<head>
<meta charset="utf-8">
<title>MediaWiki Code Example</title>
- <script src="modules/startup.js"></script>
+ <script>
+ /**
+ * Basic log console for the example iframe in documentation pages.
+ */
+ var log = ( function () {
+ var pre;
+ return function () {
+ var str, i, len, line;
+ if ( !pre ) {
+ pre = document.createElement( 'pre' );
+ pre.className = 'mw-jsduck-log';
+ ( document.body || document.documentElement ).appendChild( pre );
+ }
+ str = [];
+ for ( i = 0, len = arguments.length; i < len; i++ ) {
+ str.push( String( arguments[ i ] ) );
+ }
+ line = document.createElement( 'div' );
+ line.className = 'mw-jsduck-log-line';
+ line.appendChild(
+ document.createTextNode( str.join( ' , ' ) + '\n' )
+ );
+ pre.appendChild( line );
+ };
+ }() );
+
+ window.onerror = function ( error, filePath, linerNr ) {
+ log( error + '\n' + filePath + ':' + linerNr );
+ };
+ </script>
+ <script src="modules/src/startup.js"></script>
<script>
function startUp() {
mw.config = new mw.Map();
}
</script>
- <script src="modules/jquery/jquery.js"></script>
- <script src="modules/mediawiki/mediawiki.js"></script>
+ <script src="modules/lib/jquery/jquery.js"></script>
+ <script src="modules/src/mediawiki/mediawiki.js"></script>
+ <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
+ <script src="modules/src/mediawiki/mediawiki.startUp.js"></script>
<style>
.mw-jsduck-log {
position: relative;
@@ -45,30 +77,13 @@
</head>
<body>
<script>
- /**
- * Basic log console for the example iframe in documentation pages.
- */
- ( function () {
- var pre;
- mw.log = function () {
- var str, i, len, line;
- if ( !pre ) {
- pre = document.createElement( 'pre' );
- pre.className = 'mw-jsduck-log';
- document.body.appendChild( pre );
- }
- str = [];
- for ( i = 0, len = arguments.length; i < len; i++ ) {
- str.push( String( arguments[ i ] ) );
- }
- line = document.createElement( 'div' );
- line.className = 'mw-jsduck-log-line';
- line.appendChild(
- document.createTextNode( str.join( ' , ' ) + '\n' )
- );
- pre.appendChild( line );
- };
- }() );
+ if ( window.mw ) {
+ mw.log = log;
+ }
+
+ window.onerror = function ( error, filePath, linerNr ) {
+ log( filePath + ':' + linerNr );
+ };
/**
* Method called by jsduck to execute the example code.
@@ -78,7 +93,7 @@
eval( code );
callback && callback( true );
} catch ( e ) {
- mw.log( 'Uncaught exception: ' + e );
+ log( 'Uncaught ' + e );
callback && callback( false, e );
throw e;
}
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php
index 31ce7024..257fe146 100644
--- a/maintenance/language/StatOutputs.php
+++ b/maintenance/language/StatOutputs.php
@@ -23,7 +23,7 @@
* @author Antoine Musso <hashar at free dot fr>
*/
-/** A general output object. Need to be overriden */
+/** A general output object. Need to be overridden */
class StatsOutput {
function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
wfSuppressWarnings();
diff --git a/maintenance/language/checkLanguage.php b/maintenance/language/checkLanguage.php
index ec6e1226..bd9f9af8 100644
--- a/maintenance/language/checkLanguage.php
+++ b/maintenance/language/checkLanguage.php
@@ -29,6 +29,6 @@ $cli = new CheckLanguageCLI( $options );
try {
$cli->execute();
-} catch ( MWException $e ) {
+} catch ( Exception $e ) {
print 'Error: ' . $e->getMessage() . "\n";
}
diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php
index 973cf7bc..550f4a33 100644
--- a/maintenance/language/generateCollationData.php
+++ b/maintenance/language/generateCollationData.php
@@ -323,7 +323,7 @@ class GenerateCollationData extends Maintenance {
$tertiaryCollator->sort( $x );
$cp = $x[0];
- $char = codepointToUtf8( $cp );
+ $char = UtfNormal\Utils::codepointToUtf8( $cp );
$headerChars[] = $char;
if ( $primaryCollator->compare( $char, $prevChar ) <= 0 ) {
$numOutOfOrder++;
@@ -337,7 +337,7 @@ class GenerateCollationData extends Maintenance {
if ( $this->debugOutFile ) {
fwrite( $this->debugOutFile, sprintf( "%05X %s %s (%s)\n", $cp, $weight, $char,
- implode( ' ', array_map( 'codepointToUtf8', $group ) ) ) );
+ implode( ' ', array_map( 'UtfNormal\Utils::codepointToUtf8', $group ) ) ) );
}
}
diff --git a/maintenance/language/generateNormalizerDataAr.php b/maintenance/language/generateNormalizerDataAr.php
index ece0450f..ac50d291 100644
--- a/maintenance/language/generateNormalizerDataAr.php
+++ b/maintenance/language/generateNormalizerDataAr.php
@@ -25,7 +25,7 @@ require_once __DIR__ . '/../Maintenance.php';
/**
* Generates the normalizer data file for Arabic.
- * For NFC see includes/normal.
+ * For NFC see includes/libs/normal.
*
* @ingroup MaintenanceLanguage
*/
@@ -117,8 +117,8 @@ class GenerateNormalizerDataAr extends Maintenance {
continue;
}
- $source = hexSequenceToUtf8( $data['Code'] );
- $dest = hexSequenceToUtf8( $m[2] );
+ $source = UtfNormal\Utils::hexSequenceToUtf8( $data['Code'] );
+ $dest = UtfNormal\Utils::hexSequenceToUtf8( $m[2] );
$pairs[$source] = $dest;
}
}
diff --git a/maintenance/language/generateNormalizerDataMl.php b/maintenance/language/generateNormalizerDataMl.php
index c7237cfe..8580187d 100644
--- a/maintenance/language/generateNormalizerDataMl.php
+++ b/maintenance/language/generateNormalizerDataMl.php
@@ -25,7 +25,7 @@ require_once __DIR__ . '/../Maintenance.php';
/**
* Generates the normalizer data file for Malayalam.
- * For NFC see includes/normal.
+ * For NFC see includes/libs/normal.
*
* @ingroup MaintenanceLanguage
*/
@@ -54,8 +54,8 @@ class GenerateNormalizerDataMl extends Maintenance {
$pairs = array();
foreach ( $hexPairs as $hexSource => $hexDest ) {
- $source = hexSequenceToUtf8( $hexSource );
- $dest = hexSequenceToUtf8( $hexDest );
+ $source = UtfNormal\Utils::hexSequenceToUtf8( $hexSource );
+ $dest = UtfNormal\Utils::hexSequenceToUtf8( $hexDest );
$pairs[$source] = $dest;
}
diff --git a/maintenance/language/generateUtf8Case.php b/maintenance/language/generateUtf8Case.php
index 0fd32427..3520b874 100644
--- a/maintenance/language/generateUtf8Case.php
+++ b/maintenance/language/generateUtf8Case.php
@@ -108,12 +108,12 @@ class GenerateUtf8Case extends Maintenance {
$data[$name] = $numberedData[$number];
}
- $source = hexSequenceToUtf8( $data['Code'] );
+ $source = UtfNormal\Utils::hexSequenceToUtf8( $data['Code'] );
if ( $data['Simple_Uppercase_Mapping'] ) {
- $upper[$source] = hexSequenceToUtf8( $data['Simple_Uppercase_Mapping'] );
+ $upper[$source] = UtfNormal\Utils::hexSequenceToUtf8( $data['Simple_Uppercase_Mapping'] );
}
if ( $data['Simple_Lowercase_Mapping'] ) {
- $lower[$source] = hexSequenceToUtf8( $data['Simple_Lowercase_Mapping'] );
+ $lower[$source] = UtfNormal\Utils::hexSequenceToUtf8( $data['Simple_Lowercase_Mapping'] );
}
}
diff --git a/maintenance/language/zhtable/Makefile.py b/maintenance/language/zhtable/Makefile.py
index f902e581..71641ef1 100644
--- a/maintenance/language/zhtable/Makefile.py
+++ b/maintenance/language/zhtable/Makefile.py
@@ -152,14 +152,12 @@ def applyExcludes( mlist, path ):
return mlist
def charManualTable( path ):
- fp = open( path, 'r', encoding = 'U8' )
- ret = {}
- for line in fp:
- elems = line.split( '#' )[0].split( '|' )
- elems = unichr3( *elems )
- if len( elems ) > 1:
- ret[elems[0]] = elems[1:]
- return ret
+ fp = open( path, 'r', encoding = 'U8' )
+ for line in fp:
+ elems = line.split( '#' )[0].split( '|' )
+ elems = unichr3( *elems )
+ if len( elems ) > 1:
+ yield elems[0], elems[1:]
def toManyRules( src_table ):
tomany = set()
@@ -299,7 +297,9 @@ def main():
# Unihan.txt
( t2s_1tomany, s2t_1tomany ) = unihanParser( han_dest )
+ t2s_1tomany.update( charManualTable( 'symme_supp.manual' ) )
t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
+ s2t_1tomany.update( ( t[0], [f] ) for ( f, t ) in charManualTable( 'symme_supp.manual' ) )
s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
if pyversion[:1] in ['2']:
@@ -369,8 +369,6 @@ def main():
toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
# sorted list toHK
toHK = dictToSortedList( customRules( 'toHK.manual' ), 1 )
- # sorted list toSG
- toSG = dictToSortedList( customRules( 'toSG.manual' ), 1 )
# sorted list toTW
toTW = dictToSortedList( customRules( 'toTW.manual' ), 1 )
@@ -395,8 +393,6 @@ $zh2Hant = array(\n'''
+ PHPArray( toHK ) \
+ '\n);\n\n$zh2CN = array(\n' \
+ PHPArray( toCN ) \
- + '\n);\n\n$zh2SG = array(\n' \
- + PHPArray( toSG ) \
+ '\n);\n'
if pyversion[:1] in ['2']:
diff --git a/maintenance/language/zhtable/README b/maintenance/language/zhtable/README
index 7e3f87e2..e183e56c 100644
--- a/maintenance/language/zhtable/README
+++ b/maintenance/language/zhtable/README
@@ -1,13 +1,12 @@
The various .manual files contains special mappings not included in the
-unihan database, and phrases not included in the SCIM package.
+unihan database, and phrases not included in the SCIM package.
-- simp2trad.manual: Simplified to Traditional character mapping. Most
- data adapted from
+- symme_supp.manual: Supplementary character mapping of symmetric conversion
+ (1 to 1) between Simplified and Traditional Chinese.
- 冯寿忠,“非对称繁简字”对照表, 《语文建设通讯》1997-9第53期.
- /http://www.yywzw.com/jt/feng/fengb01.htm
+- simp2trad.manual: Simplified to Traditional asymmetric charactermapping.
-- trad2simp.manual: Traditional to Simplified character mapping.
+- trad2simp.manual: Traditional to Simplified asymmetric character mapping.
- simp2trad_noconvert.manual: Do not convert the chars as inapporiate.
@@ -18,16 +17,19 @@ unihan database, and phrases not included in the SCIM package.
- simpphrases.manual: Phrases in Simplified Chinese.
-- tradphrases_exclude.manual: Excluding several phrases from
- the SCIM phrases as inappoiated.
+- tradphrases_exclude.manual: Excluding several phrases from
+ the SCIM phrasesas inappoiated.
- simpphrases_exclude.manual: Excluding several phrases from
the SCIM phrases as inapporated.
-- toTrad.manual, toSimp.manual: Special phrase mappings that
+- toTrad.manual, toSimp.manual: Special phrase mappings that
tradphrases.manual or simphrases.manual cannot be handled.
-- toTW.manual, toCN.manual, toSG.manual and toHK.manual: Special phrase
- mappings.
+- toTW.manual, toCN.manual and toHK.manual: Special phrase mappings.
+
+* 為方便轉換,以上均含不完整詞組,請勿隨意刪除。
zhengzhu at gmail dot com & shinjiman at gmail dot com
+
+Modified by User:Chiefwei at Chinese Wikipedia in 2015. \ No newline at end of file
diff --git a/maintenance/language/zhtable/simp2trad.manual b/maintenance/language/zhtable/simp2trad.manual
index 1b84f8e7..da75c446 100644
--- a/maintenance/language/zhtable/simp2trad.manual
+++ b/maintenance/language/zhtable/simp2trad.manual
@@ -1,23 +1,10 @@
-U+03CE0㳠|U+06FBE澾|
-U+0447D䑽|U+26A99𦪙|
-U+0497A䥺|U+091FE釾|
-U+0497D䥽|U+093FA鏺|
-U+04983䦃|U+0942F鐯|
-U+04985䦅|U+09425鐥|
-U+04B6A䭪|U+297AF𩞯|
-U+04C9F䲟|U+09BA3鮣|
-U+04CA0䲠|U+09C06鰆|
-U+04CA1䲡|U+09C0C鰌|
-U+04CA2䲢|U+09C27鰧|
-U+04CA3䲣|U+04C77䱷|
-U+04DAE䶮|U+09F91龑|
U+04E07万|U+0842C萬|U+04E07万|
U+04E0E与|U+08207與|U+04E0E与|
U+04E11丑|U+04E11丑|U+0919C醜|
U+04E2A个|U+0500B個|U+07B87箇|
U+04E30丰|U+08C50豐|U+04E30丰|
U+04E3A为|U+070BA為|U+07232爲|
-U+04E48么|U+04E48么|U+09EBD麽|U+05E7A幺|U+09EBC麼|
+U+04E48么|U+09EBC麼|U+04E48么|U+09EBD麽|U+05E7A幺|
U+04E86了|U+04E86了|U+077AD瞭|
U+04E8E于|U+065BC於|U+04E8E于|
U+04E91云|U+096F2雲|U+04E91云|
@@ -31,13 +18,14 @@ U+04F19伙|U+04F19伙|U+05925夥|
U+04F2A伪|U+0507D偽|U+050DE僞|
U+04F53体|U+09AD4體|U+04F53体|
U+04F59余|U+04F59余|U+09918餘|
-U+04F63佣|U+04F63佣|U+050AD傭|
+U+04F63佣|U+050AD傭|U+04F63佣|
U+0501F借|U+0501F借|U+085C9藉|
U+0513F儿|U+05152兒|U+0513F儿|
U+0514B克|U+0514B克|U+0524B剋|
U+0515A党|U+09EE8黨|U+0515A党|
U+051AC冬|U+051AC冬|U+09F15鼕|
U+051B2冲|U+06C96沖|U+0885D衝|
+U+051C4凄|U+06DD2淒|U+060BD悽|
U+051C6准|U+051C6准|U+06E96準|
U+051E0几|U+05E7E幾|U+051E0几|
U+051EB凫|U+09CE7鳧|U+09CEC鳬|
@@ -52,7 +40,6 @@ U+0535C卜|U+0535C卜|U+08514蔔|
U+05360占|U+05360占|U+04F54佔|
U+05364卤|U+09E75鹵|U+06EF7滷|
U+05377卷|U+05377卷|U+06372捲|
-U+0537A卺|U+05DF9巹|
U+05382厂|U+05EE0廠|U+05382厂|
U+05386历|U+06B77歷|U+066C6曆|U+053A4厤|
U+05395厕|U+05EC1廁|U+053A0厠|
@@ -66,11 +53,12 @@ U+05408合|U+05408合|U+095A4閤|
U+0540A吊|U+0540A吊|U+05F14弔|
U+0540C同|U+0540C同|U+08855衕|
U+0540E后|U+05F8C後|U+0540E后|
-U+05411向|U+05411向|U+056AE嚮|U+066CF曏|
+U+05411向|U+05411向|U+056AE嚮|
U+0542F启|U+0555F啟|U+05553啓|
U+05446呆|U+05446呆|U+07343獃|
U+054B8咸|U+054B8咸|U+09E79鹹|
U+054C4哄|U+054C4哄|U+09B28鬨|
+U+0556E啮|U+09F67齧|U+056D3囓|U+05699嚙|
U+05582喂|U+05582喂|U+09935餵|
U+056DE回|U+056DE回|U+08FF4迴|
U+056E2团|U+05718團|U+07CF0糰|
@@ -78,10 +66,10 @@ U+056F0困|U+056F0困|U+0774F睏|
U+05742坂|U+05742坂|U+0962A阪|
U+0574F坏|U+058DE壞|U+0574F坏|
U+0575B坛|U+058C7壇|U+07F48罈|
-U+057FC埼|U+057FC埼|U+07895碕|
U+05899墙|U+07246牆|U+058BB墻|
U+058F3壳|U+06BBC殼|U+06BBB殻|
U+0590D复|U+05FA9復|U+08907複|
+U+05938夸|U+05938夸|U+08A87誇|
U+05956奖|U+0734E獎|U+0596C奬|
U+05978奸|U+05978奸|U+059E6姦|
U+059AB妫|U+05AAF媯|U+05B00嬀|
@@ -92,12 +80,13 @@ U+05C3D尽|U+076E1盡|U+05118儘|
U+05CB3岳|U+05CB3岳|U+05DBD嶽|
U+05E03布|U+05E03布|U+04F48佈|
U+05E18帘|U+07C3E簾|U+05E18帘|
-U+05E5E幞|U+08946襆|
+U+05E2D席|U+05E2D席|U+084C6蓆|
U+05E72干|U+05E72干|U+04E7E乾|U+05E79幹|U+069A6榦|
+U+05E7A幺|U+04E48么|
U+05E76并|U+04E26並|U+04F75併|
U+05E78幸|U+05E78幸|U+05016倖|
U+05E7F广|U+05EE3廣|U+05E7F广|
-U+05E84庄|U+05E84庄|U+0838A莊|
+U+05E84庄|U+0838A莊|U+05E84庄|
U+05EB5庵|U+05EB5庵|U+083F4菴|
U+05F25弥|U+05F4C彌|U+07030瀰|
U+05F53当|U+07576當|U+05679噹|
@@ -126,6 +115,7 @@ U+066F2曲|U+066F2曲|U+09EAF麯|U+09EB4麯|
U+0672F术|U+08853術|U+0672E朮|
U+06731朱|U+06731朱|U+07843硃|
U+06734朴|U+06734朴|U+06A38樸|
+U+06760杠|U+069D3槓|U+06760杠|
U+0676F杯|U+0676F杯|U+076C3盃|
U+0677E松|U+0677E松|U+09B06鬆|
U+0677F板|U+0677F板|U+095C6闆|
@@ -143,15 +133,18 @@ U+06CE8注|U+06CE8注|U+08A3B註|
U+06D82涂|U+05857塗|U+06D82涂|
U+06D8C涌|U+06D8C涌|U+06E67湧|
U+06DC0淀|U+06DC0淀|U+06FB1澱|
+U+06E16渖|U+0700B瀋|
U+06E38游|U+06E38游|U+0904A遊|
U+06EAF溯|U+06EAF溯|U+06CDD泝|
U+06F13漓|U+06F13漓|U+07055灕|
U+070BC炼|U+07149煉|U+0934A鍊|
+U+07096炖|U+071C9燉|
U+0753B画|U+0756B畫|U+07575畵|
U+075C7症|U+075C7症|U+07665癥|
U+07618瘘|U+0763A瘺|U+0763B瘻|
U+0786E确|U+078BA確|U+0786E确|
-U+07877硷|U+07906礆|U+09E7C鹼|
+U+07877硷|U+09E7C鹼|U+07906礆|
+U+078B1碱|U+09E7C鹼|
U+079CB秋|U+079CB秋|U+097A6鞦|
U+079CD种|U+07A2E種|U+079CD种|
U+07A57穗|U+07A57穗|U+07E50繐|
@@ -163,35 +156,33 @@ U+07D2F累|U+07D2F累|U+07E8D纍|
U+07EA4纤|U+07E96纖|U+07E34縴|
U+07EBF线|U+07DDA線|U+07DAB綫|
U+07EDD绝|U+07D55絕|U+07D76絶|
-U+07EE3绣|U+07D89綉|U+07E61繡|
+U+07EE3绣|U+07E61繡|U+07D89綉|
U+07EE6绦|U+07D5B絛|U+07E27縧|
-U+07EF1绱|U+07DD4緔|U+0979D鞝|
-U+07EF7绷|U+07DB3綳|U+07E43繃|
+U+07EF1绱|U+0979D鞝|U+07DD4緔|
+U+07EF7绷|U+07E43繃|U+07DB3綳|
U+07EFF绿|U+07DA0綠|U+07DD1緑|
+U+07F10缐|U+07DDA線|
U+07F30缰|U+097C1韁|U+07E6E繮|
U+07FA1羡|U+07FA8羨|
U+080DC胜|U+052DD勝|U+080DC胜|
U+080E1胡|U+080E1胡|U+09B0D鬍|U+0885A衚|
-U+0810F脏|U+081DF臟|U+09AD2髒|
+U+0810F脏|U+09AD2髒|U+081DF臟|
U+0814A腊|U+081D8臘|U+0814A腊|
U+081F4致|U+081F4致|U+07DFB緻|
U+0820D舍|U+0820D舍|U+06368捨|
U+082B8芸|U+082B8芸|U+08553蕓|
-U+082CE苎|U+082E7苧|
U+082CF苏|U+08607蘇|U+056CC囌|U+07C64甦|
-U+082E7苧|U+085B4薴|
-U+082F9苹|U+0860B蘋|U+082F9苹|
U+08303范|U+08303范|U+07BC4範|
-U+0836F药|U+0846F葯|U+085E5藥|
+U+0836F药|U+085E5藥|U+0846F葯|
U+083B7获|U+07372獲|U+07A6B穫|
-U+083BC莼|U+08493蒓|U+084F4蓴|
+U+083BC莼|U+084F4蓴|U+08493蒓|
U+08499蒙|U+08499蒙|U+077C7矇|U+06FDB濛|U+061DE懞|
U+084D1蓑|U+084D1蓑|U+07C11簑|
U+08511蔑|U+08511蔑|U+0884A衊|
U+08574蕴|U+0860A蘊|U+085F4藴|
U+0866B虫|U+087F2蟲|U+0866B虫|
U+08721蜡|U+0881F蠟|U+08721蜡|
-U+0874E蝎|U+0880D蠍|
+U+0874E蝎|U+0880D蠍|U+0874E蝎|
U+08868表|U+08868表|U+09336錶|
U+08BF4说|U+08AAA說|U+08AAC説|
U+08C23谣|U+08B20謠|U+08B21謡|
@@ -209,22 +200,22 @@ U+09170酰|U+09170酰|U+091AF醯|
U+09178酸|U+09178酸|U+075E0痠|
U+091C7采|U+091C7采|U+063A1採|U+057F0埰|
U+091CC里|U+091CC里|U+088E1裡|U+088CF裏|
-U+093AD鎭|U+093AE鎮|
U+0949F钟|U+0937E鍾|U+09418鐘|
-U+094A9钩|U+09264鉤|U+0920E鈎|
+U+094A9钩|U+0920E鈎|U+09264鉤|
U+094B5钵|U+07F3D缽|U+09262鉢|
U+094F2铲|U+093DF鏟|U+05277剷|
U+09508锈|U+092B9銹|U+093FD鏽|
U+09510锐|U+092B3銳|U+092ED鋭|
U+09528锨|U+06774杴|U+09341鍁|
+U+0954B镋|U+09482钂|U+093B2鎲|
U+0954C镌|U+0942B鐫|U+093B8鎸|
U+09562镢|U+09481钁|U+0941D鐝|
U+09605阅|U+095B1閱|U+095B2閲|
U+096C7雇|U+096C7雇|U+050F1僱|
U+096D5雕|U+096D5雕|U+09D70鵰|
+U+095F2闲|U+09592閒|U+09591閑|
U+09709霉|U+09709霉|U+09EF4黴|
U+09762面|U+09762面|U+09EB5麵|U+09EAA麪|U+09EAB麫|
-U+097B2鞲|U+097DD韝|
U+0987B须|U+09808須|U+09B1A鬚|
U+09893颓|U+09839頹|U+0983D頽|
U+0989C颜|U+0984F顏|U+09854顔|
@@ -232,141 +223,11 @@ U+09965饥|U+098E2飢|U+09951饑|
U+09980馀|U+09918餘|
U+09986馆|U+09928館|U+08218舘|
U+09A82骂|U+07F75罵|U+099E1駡|
+U+09CC1鳁|U+09C2E鰮|
U+09C87鲇|U+09BF0鯰|U+09B8E鮎|
U+09C9E鲞|U+09BD7鯗|U+09B9D鮝|
U+09CC4鳄|U+09C77鱷|U+09C10鰐|
U+09E21鸡|U+096DE雞|U+09DC4鷄|
U+09E5A鹚|U+09DBF鶿|U+09DC0鷀|
-U+09E6E鹮|U+04D09䴉|
-U+09F44齄|U+09F47齇|
-U+20BB6𠮶|U+055F0嗰|
-U+26216𦈖|U+04308䌈|
-U+28C3E𨰾|U+093B7鎷|
-U+28C3F𨰿|U+091F3釳|
-U+28C40𨱀|U+2895B𨥛|
-U+28C41𨱁|U+09220鈠|
-U+28C42𨱂|U+0920B鈋|
-U+28C43𨱃|U+09232鈲|
-U+28C44𨱄|U+0922F鈯|
-U+28C45𨱅|U+09241鉁|
-U+28C47𨱇|U+092B6銶|
-U+28C48𨱈|U+092C9鋉|
-U+28C49𨱉|U+09344鍄|
-U+28C4A𨱊|U+289F1𨧱|
-U+28C4B𨱋|U+09302錂|
-U+28C4C𨱌|U+093C6鏆|
-U+28C4D𨱍|U+093AF鎯|
-U+28C4E𨱎|U+0936E鍮|
-U+28C4F𨱏|U+0939D鎝|
-U+28C50𨱐|U+28AD2𨫒|
-U+28C52𨱒|U+093C9鏉|
-U+28C53𨱓|U+0940E鐎|
-U+28C54𨱔|U+0940F鐏|
-U+28C55𨱕|U+28B82𨮂|
-U+28E02𨸂|U+0958D閍|
-U+28E03𨸃|U+09590閐|
-U+293FC𩏼|U+04A8F䪏|
-U+293FD𩏽|U+293EA𩏪|
-U+293FE𩏾|U+293A2𩎢|
-U+293FF𩏿|U+04A98䪘|
-U+29400𩐀|U+04A97䪗|
-U+29595𩖕|U+294E3𩓣|
-U+29596𩖖|U+09843顃|
-U+29597𩖗|U+04AF4䫴|
-U+29665𩙥|U+098B0颰|
-U+29666𩙦|U+295C0𩗀|
-U+29667𩙧|U+295E1𩗡|
-U+29668𩙨|U+29639𩘹|
-U+29669𩙩|U+29600𩘀|
-U+2966A𩙪|U+098B7颷|
-U+2966B𩙫|U+098BE颾|
-U+2966C𩙬|U+2963A𩘺|
-U+2966D𩙭|U+2961D𩘝|
-U+2966E𩙮|U+04B18䬘|
-U+2966F𩙯|U+04B1D䬝|
-U+29670𩙰|U+29648𩙈|
-U+29805𩠅|U+297D0𩟐|
-U+29806𩠆|U+29726𩜦|
-U+29807𩠇|U+04B40䭀|
-U+29808𩠈|U+04B43䭃|
-U+2980B𩠋|U+29754𩝔|
-U+2980C𩠌|U+09938餸|
-U+299E6𩧦|U+2987A𩡺|
-U+299E8𩧨|U+099CE駎|
-U+299E9𩧩|U+2990A𩤊|
-U+299EA𩧪|U+04BBE䮾|
-U+299EB𩧫|U+099DA駚|
-U+299EC𩧬|U+298A1𩢡|
-U+299ED𩧭|U+04B7F䭿|
-U+299EE𩧮|U+298BE𩢾|
-U+299EF𩧯|U+09A4B驋|
-U+299F0𩧰|U+04B9D䮝|
-U+299F1𩧱|U+29949𩥉|
-U+299F2𩧲|U+099E7駧|
-U+299F3𩧳|U+298B8𩢸|
-U+299F4𩧴|U+099E9駩|
-U+299F5𩧵|U+298B4𩢴|
-U+299F6𩧶|U+298CF𩣏|
-U+299FA𩧺|U+099F6駶|
-U+299FB𩧻|U+298F5𩣵|
-U+299FC𩧼|U+298FA𩣺|
-U+299FF𩧿|U+04BA0䮠|
-U+29A00𩨀|U+09A14騔|
-U+29A01𩨁|U+04B9E䮞|
-U+29A03𩨃|U+09A1D騝|
-U+29A04𩨄|U+09A2A騪|
-U+29A05𩨅|U+29938𩤸|
-U+29A06𩨆|U+29919𩤙|
-U+29A08𩨈|U+09A1F騟|
-U+29A09𩨉|U+29932𩤲|
-U+29A0A𩨊|U+09A1A騚|
-U+29A0B𩨋|U+29944𩥄|
-U+29A0C𩨌|U+29951𩥑|
-U+29A0D𩨍|U+29947𩥇|
-U+29A0F𩨏|U+04BB3䮳|
-U+29A10𩨐|U+299C6𩧆|
-U+29F79𩽹|U+09B65魥|
-U+29F7A𩽺|U+29D69𩵩|
-U+29F7B𩽻|U+29D79𩵹|
-U+29F7C𩽼|U+09BF6鯶|
-U+29F7D𩽽|U+29DB1𩶱|
-U+29F7E𩽾|U+09B9F鮟|
-U+29F7F𩽿|U+29DB0𩶰|
-U+29F80𩾀|U+09B95鮕|
-U+29F81𩾁|U+09BC4鯄|
-U+29F83𩾃|U+09BB8鮸|
-U+29F84𩾄|U+29DF0𩷰|
-U+29F85𩾅|U+29E03𩸃|
-U+29F86𩾆|U+29E26𩸦|
-U+29F87𩾇|U+09BF1鯱|
-U+29F88𩾈|U+04C59䱙|
-U+29F8A𩾊|U+04C6C䱬|
-U+29F8B𩾋|U+04C70䱰|
-U+29F8C𩾌|U+09C47鱇|
-U+29F8C𩾌|U+09C47鱇|
-U+29F8E𩾎|U+29F47𩽇|
-U+2A242𪉂|U+04CB0䲰|
-U+2A243𪉃|U+09CFC鳼|
-U+2A244𪉄|U+29FEA𩿪|
-U+2A245𪉅|U+2A026𪀦|
-U+2A246𪉆|U+09D32鴲|
-U+2A248𪉈|U+09D1C鴜|
-U+2A249𪉉|U+2A048𪁈|
-U+2A24A𪉊|U+09DE8鷨|
-U+2A24B𪉋|U+2A03E𪀾|
-U+2A24C𪉌|U+2A056𪁖|
-U+2A24D𪉍|U+09D5A鵚|
-U+2A24E𪉎|U+2A086𪂆|
-U+2A24F𪉏|U+2A0CF𪃏|
-U+2A250𪉐|U+2A0CD𪃍|
-U+2A251𪉑|U+09DD4鷔|
-U+2A252𪉒|U+2A115𪄕|
-U+2A254𪉔|U+2A106𪄆|
-U+2A255𪉕|U+2A1F3𪇳|
-U+2A388𪎈|U+04D2C䴬|
-U+2A389𪎉|U+09EB2麲|
-U+2A38A𪎊|U+09EA8麨|
-U+2A38B𪎋|U+04D34䴴|
-U+2A38C𪎌|U+09EB3麳|
-U+2A68F𪚏|U+2A600𪘀|
-U+2A690𪚐|U+2A62F𪘯|
+U+09EB9麹|U+09EB4麴|
+U+080C4胄|U+080C4胄|U+05191冑| \ No newline at end of file
diff --git a/maintenance/language/zhtable/simp2trad_noconvert.manual b/maintenance/language/zhtable/simp2trad_noconvert.manual
index a46560a7..3266168d 100644
--- a/maintenance/language/zhtable/simp2trad_noconvert.manual
+++ b/maintenance/language/zhtable/simp2trad_noconvert.manual
@@ -1,139 +1,10 @@
-=>"余"
-=>"𫗭"
-=>"𪨧"
-=>"𫚭"
-=>"𫔀"
-=>"𫊻"
-=>"𫋌"
-=>"蚃"
-=>"𩾂"
-=>"𫚜"
-=>"𫚢"
-=>"𧉰"
-=>"䙌"
-=>"𫊮"
-=>"𫋇"
-=>"𫉄"
-=>"𫘛"
-=>"𫘜"
-=>"𫘝"
-=>"𫘟"
-=>"𩧨"
-=>"𩧫"
-=>"𫘞"
-=>"𫘠"
-=>"𩧲"
-=>"𩧴"
-=>"𫘡"
-=>"𩧺"
-=>"𫘣"
-=>"𫘤"
-=>"𫘧"
-=>"𫘥"
-=>"𫘦"
-=>"𩨀"
-=>"𩨊"
-=>"𫘩"
-=>"𩨃"
-=>"𫘪"
-=>"𫘪"
-=>"𫘫"
-=>"𫘬"
-=>"𩨈"
-=>"𫘨"
-=>"𩨄"
-=>"𫘭"
-=>"𩧯"
-=>"𫘯"
-=>"𫘰"
-=>"𫘱"
-=>"𫘽"
-=>"𫚉"
-=>"𩽹"
-=>"𫚌"
-=>"𫚍"
-=>"𫚒"
-=>"𫚑"
-=>"𫚖"
-=>"𩽾"
-=>"䲟"
-=>"𫚓"
-=>"𫚗"
-=>"𫚔"
-=>"𫚛"
-=>"𩾃"
-=>"𫚚"
-=>"𩾁"
-=>"𫚙"
-=>"𫚡"
-=>"𫚞"
-=>"𩾇"
-=>"𩽼"
-=>"𫚣"
-=>"䲠"
-=>"䲡"
-=>"𫚊"
-=>"𫚥"
-=>"𫚕"
-=>"𫚤"
-=>"䲢"
-=>"𫚦"
-=>"𫚧"
-=>"𫚋"
-=>"𩾌"
-=>"𫚪"
-=>"𫚫"
-=>"𫚈"
-=>"𫚭"
-=>"𫛛"
-=>"𪉃"
-=>"𫛚"
-=>"𫛜"
-=>"𫛞"
-=>"𫛝"
-=>"𫛤"
-=>"𫛡"
-=>"𫁡"
-=>"𪉈"
-=>"𫛣"
-=>"𫛦"
-=>"𪉆"
-=>"𫛩"
-=>"𫛪"
-=>"𫛥"
-=>"𪉍"
-=>"𫛭"
-=>"𫛨"
-=>"𫛳"
-=>"𫛱"
-=>"𫛲"
-=>"𫛵"
-=>"𫛶"
-=>"𫛸"
-=>"𫛷"
-=>"𫛯"
-=>"𫛫"
-=>"𫛽"
-=>"𫜀"
-=>"𪉑"
-=>"𫜃"
-=>"𫛴"
-=>"𪉊"
-=>"𫜁"
-=>"𫜄"
-=>"𫛢"
-=>"𫛟"
-=>"𪎊"
-=>"𤿲"
-=>"𪎉"
-=>"𪎌"
-=>"𫜑"
-=>"𫜩"
-=>"𫜪"
-=>"𫜭"
-=>"𫜬"
-=>"𫜮"
-=>"𫜰"
+咤
+吒
+疴
+桿
+錶
+蘋
+詑 \ No newline at end of file
diff --git a/maintenance/language/zhtable/simpphrases.manual b/maintenance/language/zhtable/simpphrases.manual
index d8602fec..3b149823 100644
--- a/maintenance/language/zhtable/simpphrases.manual
+++ b/maintenance/language/zhtable/simpphrases.manual
@@ -60,7 +60,7 @@
乾步
乾氏
乾泉
-乾清宫
+乾清
乾渥
乾灵
乾男
@@ -144,2032 +144,15 @@
陈乾生
陈公乾生
字乾生
-不着痕迹
-不着边际
-与着
-与著书
-与著作
-与著名
-与著录
-与著称
-与著者
-与著述
-丑着
-丑著书
-丑著作
-丑著名
-丑著录
-丑著称
-丑著者
-丑著述
-临着
-临著书
-临著作
-临著名
-临著录
-临著称
-临著者
-临著述
-丽着
-丽著书
-丽著作
-丽著名
-丽著录
-丽著称
-丽著者
-丽著述
-乐着
-乐著书
-乐著作
-乐著名
-乐著录
-乐著称
-乐著者
-乐著述
-乘着
-乘著书
-乘著作
-乘著名
-乘著录
-乘著称
-乘著者
-乘著述
-争着
-争著书
-争著作
-争著名
-争著录
-争著称
-争著者
-争著述
-亮着
-亮著书
-亮著作
-亮著名
-亮著录
-亮著称
-亮著者
-亮著述
-仗着
-仗著书
-仗著作
-仗著名
-仗著录
-仗著称
-仗著者
-仗著述
-代表着
-代表著书
-代表著作
-代表著名
-代表著录
-代表著称
-代表著者
-代表著述
-伴着
-伴著书
-伴著作
-伴著名
-伴著录
-伴著称
-伴著者
-伴著述
-低着
-低著书
-低著作
-低著名
-低著录
-低著称
-低著者
-低著述
-住着
-住著书
-住著作
-住著名
-住著录
-住著称
-住著者
-住著述
-侧着
-侧著书
-侧著作
-侧著名
-侧著录
-侧著称
-侧著者
-侧著述
-保障着
-保障著书
-保障著作
-保障著名
-保障著录
-保障著称
-保障著者
-保障著述
-信着
-信著书
-信著作
-信著名
-信著录
-信著称
-信著者
-信著述
-候着
-候著书
-候著作
-候著名
-候著录
-候著称
-候著者
-候著述
-借着
-借著书
-借著作
-借著名
-借著录
-借著称
-借著者
-借著述
-做着
-做著书
-做著作
-做著名
-做著录
-做著称
-做著者
-做著述
-偷着
-偷著书
-偷著作
-偷著名
-偷著录
-偷著称
-偷著者
-偷著述
-光着
-光著书
-光著作
-光著名
-光著录
-光著称
-光著者
-光著述
-关着
-关著书
-关著作
-关著名
-关著录
-关著称
-关著者
-关著述
-冀着
-冀著书
-冀著作
-冀著名
-冀著录
-冀著称
-冀著者
-冀著述
-冒着
-冒著书
-冒著作
-冒著名
-冒著录
-冒著称
-冒著者
-冒著述
-写着
-写著书
-写著作
-写著名
-写著录
-写著称
-写著者
-写著述
-凉着
-凉著书
-凉著作
-凉著名
-凉著录
-凉著称
-凉著者
-凉著述
-制着
-制著书
-制著作
-制著名
-制著录
-制著称
-制著者
-制著述
-刻着
-刻著书
-刻著作
-刻著名
-刻著录
-刻著称
-刻著者
-刻著述
-办着
-办著书
-办著作
-办著名
-办著录
-办著称
-办著者
-办著述
-动着
-动著书
-动著作
-动著名
-动著录
-动著称
-动著者
-动著述
-努力着
-努力著书
-努力著作
-努力著名
-努力著录
-努力著称
-努力著者
-努力著述
-努着
-努著书
-努著作
-努著名
-努著录
-努著称
-努著者
-努著述
-印着
-印著书
-印著作
-印著名
-印著录
-印著称
-印著者
-印著述
-压着
-压著书
-压著作
-压著名
-压著录
-压著称
-压著者
-压著述
-去着
-去著书
-去著作
-去著名
-去著录
-去著称
-去著者
-去著述
-受着
-受著书
-受著作
-受著名
-受著录
-受著称
-受著者
-受著述
-变着
-变著书
-变著作
-变著名
-变著录
-变著称
-变著者
-变著述
-叫着
-叫著书
-叫著作
-叫著名
-叫著录
-叫著称
-叫著者
-叫著述
-向着
-向著书
-向著作
-向著名
-向著录
-向著称
-向著者
-向著述
-含着
-含著书
-含著作
-含著名
-含著录
-含著称
-含著者
-含著述
-听得着
-听不着
-听着
-听著书
-听著作
-听著名
-听著录
-听著称
-听著者
-听著述
-吹着
-吹著书
-吹著作
-吹著名
-吹著录
-吹著称
-吹著者
-吹著述
-味着
-味著书
-味著作
-味著名
-味著录
-味著称
-味著者
-味著述
-响着
-响著书
-响著作
-响著名
-响著录
-响著称
-响著者
-响著述
-哭着
-哭著书
-哭著作
-哭著名
-哭著录
-哭著称
-哭著者
-哭著述
-唱着
-唱著书
-唱著作
-唱著名
-唱著录
-唱著称
-唱著者
-唱著述
-喝着
-喝著书
-喝著作
-喝著名
-喝著录
-喝著称
-喝著者
-喝著述
-嚷着
-嚷著书
-嚷著作
-嚷著名
-嚷著录
-嚷著称
-嚷著者
-嚷著述
-因着
-因著书
-因著作
-因著名
-因著录
-因著称
-因著者
-因著述
-困着
-困著书
-困著作
-困著名
-困著录
-困著称
-困著者
-困著述
-围着
-围著书
-围著作
-围著名
-围著录
-围著称
-围著者
-围著述
-在着
-在著书
-在著作
-在著名
-在著录
-在著称
-在著者
-在著述
-坐着
-坐著书
-坐著作
-坐著名
-坐著录
-坐著称
-坐著者
-坐著述
-备着
-备著书
-备著作
-备著名
-备著录
-备著称
-备著者
-备著述
-夹着
-夹著书
-夹著作
-夹著名
-夹著录
-夹著称
-夹著者
-夹著述
-孤着
-孤著书
-孤著作
-孤著名
-孤著录
-孤著称
-孤著者
-孤著述
-学着
-学著书
-学著作
-学著名
-学著录
-学著称
-学著者
-学著述
-守着
-守著书
-守著作
-守著名
-守著录
-守著称
-守著者
-守著述
-定着
-定著书
-定著作
-定著名
-定著录
-定著称
-定著者
-定著述
-对着
-对著书
-对著作
-对著名
-对著录
-对著称
-对著者
-对著述
-寻着
-寻著书
-寻著作
-寻著名
-寻著录
-寻著称
-寻著者
-寻著述
-展着
-展著书
-展著作
-展著名
-展著录
-展著称
-展著者
-展著述
-带着
-带著书
-带著作
-带著名
-带著录
-带著称
-带著者
-带著述
-帮着
-帮著书
-帮著作
-帮著名
-帮著录
-帮著称
-帮著者
-帮著述
-应着
-应著书
-应著作
-应著名
-应著录
-应著称
-应著者
-应著述
-康着
-康著书
-康著作
-康著名
-康著录
-康著称
-康著者
-康著述
-开着
-开著书
-开著作
-开著名
-开著录
-开著称
-开著者
-开著述
-当着
-当著书
-当著作
-当著名
-当著录
-当著称
-当著者
-当著述
-待着
-待著书
-待著作
-待著名
-待著录
-待著称
-待著者
-待著述
-得着
-得著书
-得著作
-得著名
-得著录
-得著称
-得著者
-得著述
-循着
-循著书
-循著作
-循著名
-循著录
-循著称
-循著者
-循著述
-心着
-心著书
-心著作
-心著名
-心著录
-心著称
-心著者
-心著述
-忍着
-忍著书
-忍著作
-忍著名
-忍著录
-忍著称
-忍著者
-忍著述
-志着
-志著书
-志著作
-志著名
-志著录
-志著称
-志著者
-志著述
-忙着
-忙著书
-忙著作
-忙著名
-忙著录
-忙著称
-忙著者
-忙著述
-怀着
-怀著书
-怀著作
-怀著名
-怀著录
-怀著称
-怀著者
-怀著述
-急着
-急著书
-急著作
-急著名
-急著录
-急著称
-急著者
-急著述
-性着
-性著书
-性著作
-性著名
-性著录
-性著称
-性著者
-性著述
-恋着
-恋著书
-恋著作
-恋著名
-恋著录
-恋著称
-恋著者
-恋著述
-悠着
-悠著书
-悠著作
-悠著名
-悠著录
-悠著称
-悠著者
-悠著述
-惯着
-惯著书
-惯著作
-惯著名
-惯著录
-惯著称
-惯著者
-惯著述
-想着
-想著书
-想著作
-想著名
-想著录
-想著称
-想著者
-想著述
-战着
-战著书
-战著作
-战著名
-战著录
-战著称
-战著者
-战著述
-戴着
-戴著书
-戴著作
-戴著名
-戴著录
-戴著称
-戴著者
-戴著述
-扎着
-扎著书
-扎著作
-扎著名
-扎著录
-扎著称
-扎著者
-扎著述
-打着
-打著书
-打著作
-打著名
-打著录
-打著称
-打著者
-打著述
-扛着
-扛著书
-扛著作
-扛著名
-扛著录
-扛著称
-扛著者
-扛著述
-找得着
-找不着
-抓着
-抓著作
-抓著名
-抓著录
-抓著称
-抓著者
-抓著述
-披着
-披著书
-披著作
-披著名
-披著录
-披著称
-披著者
-披著述
-抬着
-抬著作
-抬著名
-抬著录
-抬著称
-抬著者
-抬著述
-抱着
-抱著作
-抱著名
-抱著录
-抱著称
-抱著者
-抱著述
-拉着
-拉著书
-拉著作
-拉著名
-拉著录
-拉著称
-拉著者
-拉著述
-拎着
-拎著作
-拎著名
-拎著录
-拎著称
-拎著者
-拎著述
-拖着
-拖著作
-拖著名
-拖著录
-拖著称
-拖著者
-拖著述
-拼着
-拼著作
-拼著名
-拼著录
-拼著称
-拼著者
-拼著述
-拿着
-拿著作
-拿著名
-拿著录
-拿著称
-拿著者
-拿著述
-持着
-持著作
-持著名
-持著录
-持著称
-持著者
-持著述
-挑着
-挑著作
-挑著名
-挑著录
-挑著称
-挑著者
-挑著述
-挡着
-挡著作
-挡著名
-挡著录
-挡著称
-挡著者
-挡著述
-挣着
-挣著书
-挣著作
-挣著名
-挣著录
-挣著称
-挣著者
-挣著述
-挥着
-挥著作
-挥著名
-挥著录
-挥著称
-挥著者
-挥著述
-挨着
-挨著作
-挨著名
-挨著录
-挨著称
-挨著者
-挨著述
-捆着
-捆著作
-捆著名
-捆著录
-捆著称
-捆著者
-捆著述
-据着
-据著书
-据著作
-据著名
-据著录
-据著称
-据著者
-据著述
-掖着
-掖著作
-掖著名
-掖著录
-掖著称
-掖著者
-掖著述
-接着
-接著作
-接著名
-接著录
-接著称
-接著者
-接著述
-揉着
-揉著书
-揉著作
-揉著名
-揉著录
-揉著称
-揉著者
-揉著述
-提着
-提著作
-提著名
-提著录
-提著称
-提著者
-提著述
-搂着
-搂著作
-搂著名
-搂著录
-搂著称
-搂著者
-搂著述
-摆着
-摆著作
-摆著名
-摆著录
-摆著称
-摆著者
-摆著述
-撼着
-撼著书
-撼著作
-撼著名
-撼著录
-撼著称
-撼著者
-撼著述
-敞着
-敞著作
-敞著名
-敞著录
-敞著称
-敞著者
-敞著述
-数着
-数著作
-数著名
-数著录
-数著称
-数著者
-数著述
-斗着
-斗著书
-斗著作
-斗著名
-斗著录
-斗著称
-斗著者
-斗著述
-斥着
-斥著书
-斥著作
-斥著名
-斥著录
-斥著称
-斥著者
-斥著述
-昂着
-昂著书
-昂著作
-昂著名
-昂著录
-昂著称
-昂著者
-昂著述
-映着
-映著书
-映著作
-映著名
-映著录
-映著称
-映著者
-映著述
-晃着
-晃著作
-晃著名
-晃著录
-晃著称
-晃著者
-晃著述
-暗着
-暗著书
-暗著作
-暗著名
-暗著录
-暗著称
-暗著者
-暗著述
-有着
-有著书
-有著作
-有著名
-有著录
-有著称
-有著者
-有著述
-望着
-望著作
-望著名
-望著录
-望著称
-望著者
-望著述
-朝着
-朝著作
-朝著名
-朝著录
-朝著称
-朝著者
-朝著述
-本着
-本著书
-本著作
-本著名
-本著录
-本著称
-本著者
-本著述
-杀着
-杀著书
-杀著作
-杀著名
-杀著录
-杀著称
-杀著者
-杀著述
-杂着
-杂著书
-杂著作
-杂著名
-杂著录
-杂著称
-杂著者
-杂著述
-来着
-来著书
-来著作
-来著名
-来著录
-来著称
-来著者
-来著述
-枕着
-枕著作
-枕著名
-枕著录
-枕著称
-枕著者
-枕著述
-梦着
-梦著书
-梦著作
-梦著名
-梦著录
-梦著称
-梦著者
-梦著述
-梳着
-梳著作
-梳著名
-梳著录
-梳著称
-梳著者
-梳著述
-求着
-求著书
-求著作
-求著名
-求著录
-求著称
-求著者
-求著述
-沉着
-沉著书
-沉著作
-沉著名
-沉著录
-沉著称
-沉著者
-沉著述
-沿着
-沿著书
-沿著作
-沿著名
-沿著录
-沿著称
-沿著者
-沿著述
-活着
-活著书
-活著作
-活著名
-活著录
-活著称
-活著者
-活著述
-流着
-流著书
-流著作
-流著名
-流著录
-流著称
-流著者
-流著述
-浮着
-浮著书
-浮著作
-浮著名
-浮著录
-浮著称
-浮著者
-浮著述
-润着
-润著书
-润著作
-润著名
-润著录
-润著称
-润著者
-润著述
-涵着
-涵著书
-涵著作
-涵著名
-涵著录
-涵著称
-涵著者
-涵著述
-渴着
-渴著书
-渴著作
-渴著名
-渴著录
-渴著称
-渴著者
-渴著述
-溢着
-溢著书
-溢著作
-溢著名
-溢著录
-溢著称
-溢著者
-溢著述
-演着
-演著书
-演著作
-演著名
-演著录
-演著称
-演著者
-演著述
-漫着
-漫著书
-漫著作
-漫著名
-漫著录
-漫著称
-漫著者
-漫著述
-点着
-点著作
-点著名
-点著录
-点著称
-点著者
-点著述
-烧着
-烧著作
-烧著名
-烧著录
-烧著称
-烧著者
-烧著述
-照着
-照著书
-照著作
-照著名
-照著录
-照著称
-照著者
-照著述
-爱着
-爱著书
-爱著作
-爱著名
-爱著录
-爱著称
-爱著者
-爱著述
-牵着
-牵著书
-牵著作
-牵著名
-牵著录
-牵著称
-牵著者
-牵著述
-犯得着
-犯不着
-独着
-独著书
-独著作
-独著名
-独著录
-独著称
-独著者
-独著述
-猜着
-猜着书
-猜著作
-猜著名
-猜著录
-猜著称
-猜著者
-猜著述
-甜着
-甜著书
-甜著作
-甜著名
-甜著录
-甜著称
-甜著者
-甜著述
-用得着
-用不着
-用着
-用著书
-用著作
-用著名
-用著录
-用著称
-用著者
-用著述
-留着
-留着书
-留著作
-留著名
-留著录
-留著称
-留著者
-留著述
-疑着
-疑著书
-疑著作
-疑著名
-疑著录
-疑著称
-疑著者
-疑著述
-皱着
-皱著书
-皱著作
-皱著名
-皱著录
-皱著称
-皱著者
-皱著述
-盛着
-盛著书
-盛著作
-盛著名
-盛著录
-盛著称
-盛著者
-盛著述
-盯着
-盯着书
-盯著作
-盯著名
-盯著录
-盯著称
-盯著者
-盯著述
-盾着
-盾著书
-盾著作
-盾著名
-盾著录
-盾著称
-盾著者
-盾著述
-看得着
-看不着
-看着
-看着书
-看著作
-看著名
-看著录
-看著称
-看著者
-看著述
-瞧着
-瞧着书
-瞧著作
-瞧著名
-瞧著录
-瞧著称
-瞧著者
-瞧著述
-着业
-着丝
-着么
-着人
-着什么急
-着他
-着令
-着位
-着体
-着你
-着便
-着凉
-着力
-着劲
-着号
-着呢
-着哩
-着地
-着墨
-着声
-着处
-着她
-着妳
-着姓
-着它
-着定
-着实
-着己
-着帐
-着床
-着庸
-着式
-着录
-着心
-着志
-着忙
-着急
-着恼
-着惊
-着想
-着意
-着慌
-着我
-着手
-着抹
-着摸
-着撰
-着数
-着明
-着末
-着极
-着格
-着棋
-着槁
-着气
-着法
-着浅
-着火
-着然
-着甚
-着生
-着疑
-着白
-着相
-着眼
-着着
-着祂
-着积
-着稿
-着笔
-着籍
-着紧
-着緑
-着绊
-着绩
-着绯
-着绿
-着肉
-着脚
-着舰
-着色
-着节
-着花
-着莫
-着落
-着藁
-着衣
-着装
-着要
-着警
-着趣
-着边
-着迷
-着迹
-着重
-着録
-着闻
-着陆
-着雝
-着鞭
-着题
-着魔
-睡得着
-睡不着
-睡着
-睡著书
-睡著作
-睡著名
-睡著录
-睡著称
-睡著者
-睡著述
-瞒着
-瞒著书
-瞒著作
-瞒著名
-瞒著录
-瞒著称
-瞒著者
-瞒著述
-瞪着
-瞪著书
-瞪著作
-瞪著名
-瞪著录
-瞪著称
-瞪著者
-瞪著述
-福着
-福著书
-福著作
-福著名
-福著录
-福著称
-福著者
-福著述
-空着
-空著书
-空著作
-空著名
-空著录
-空著称
-空著者
-空著述
-穿着
-穿著书
-穿著作
-穿著名
-穿著录
-穿著称
-穿著者
-穿著述
-竖着
-竖著书
-竖著作
-竖著名
-竖著录
-竖著称
-竖著者
-竖著述
-站着
-站著书
-站著作
-站著名
-站著录
-站著称
-站著者
-站著述
-笑着
-笑著书
-笑著作
-笑著名
-笑著录
-笑著称
-笑著者
-笑著述
-管着
-管著书
-管著作
-管著名
-管著录
-管著称
-管著者
-管著述
-绑着
-绑著书
-绑著作
-绑著名
-绑著录
-绑著称
-绑著者
-绑著述
-绕着
-绕著书
-绕著作
-绕著名
-绕著录
-绕著称
-绕著者
-绕著述
-缠着
-缠著书
-缠著作
-缠著名
-缠著录
-缠著称
-缠著者
-缠著述
-罩着
-罩著书
-罩著作
-罩著名
-罩著录
-罩著称
-罩著者
-罩著述
-美着
-美著书
-美著作
-美著名
-美著录
-美著称
-美著者
-美著述
-耀着
-耀著书
-耀著作
-耀著名
-耀著录
-耀著称
-耀著者
-耀著述
-考着
-考著书
-考著作
-考著名
-考著录
-考著称
-考著者
-考著述
-背着
-背著书
-背著作
-背著名
-背著录
-背著称
-背著者
-背著述
-胶着
-胶著书
-胶著作
-胶著名
-胶著录
-胶著称
-胶著者
-胶著述
-艺着
-艺著书
-艺著作
-艺著名
-艺著录
-艺著称
-艺著者
-艺著述
-苦着
-苦著书
-苦著作
-苦著名
-苦著录
-苦著称
-苦著者
-苦著述
-获着
-获著书
-获著作
-获著名
-获著录
-获著称
-获著者
-获著述
-落着
-落著书
-落著作
-落著名
-落著录
-落著称
-落著者
-落著述
-蒙着
-蒙著书
-蒙著作
-蒙著名
-蒙著录
-蒙著称
-蒙著者
-蒙著述
-藏着
-藏著书
-藏著作
-藏著名
-藏著录
-藏著称
-藏著者
-藏著述
-蘸着
-蘸著书
-蘸著作
-蘸著名
-蘸著录
-蘸著称
-蘸著者
-蘸著述
-行着
-行著书
-行著作
-行著名
-行著录
-行著称
-行著者
-行著述
-衣着
-衣著书
-衣著作
-衣著名
-衣著录
-衣著称
-衣著者
-衣著述
-装着
-装著书
-装著作
-装著名
-装著录
-装著称
-装著者
-装著述
-裹着
-裹著书
-裹著作
-裹著名
-裹著录
-裹著称
-裹著者
-裹著述
-见着
-见著书
-见著作
-见著名
-见著录
-见著称
-见著者
-见著述
-记着
-记著书
-记著作
-记著名
-记著录
-记著称
-记著者
-记著述
-试着
-试著书
-试著作
-试著名
-试著录
-试著称
-试著者
-试著述
-语着
-语著书
-语著作
-语著名
-语著录
-语著称
-语著者
-语著述
-豫着
-豫著书
-豫著作
-豫著名
-豫著录
-豫著称
-豫著者
-豫著述
-贞着
-贞著书
-贞著作
-贞著名
-贞著录
-贞著称
-贞著者
-贞著述
-走着
-走著书
-走著作
-走著名
-走著录
-走著称
-走著者
-走著述
-赶着
-赶著书
-赶著作
-赶著名
-赶著录
-赶著称
-赶著者
-赶著述
-趴着
-趴著书
-趴著作
-趴著名
-趴著录
-趴著称
-趴著者
-趴著述
-跃着
-跃著书
-跃著作
-跃著名
-跃著录
-跃著称
-跃著者
-跃著述
-跑着
-跑著书
-跑著作
-跑著名
-跑著录
-跑著称
-跑著者
-跑著述
-跟着
-跟著书
-跟著作
-跟著名
-跟著录
-跟著称
-跟著者
-跟著述
-跪着
-跪著书
-跪著作
-跪著名
-跪著录
-跪著称
-跪著者
-跪著述
-跳着
-跳著书
-跳著作
-跳著名
-跳著录
-跳著称
-跳著者
-跳著述
-踏着
-踏著书
-踏著作
-踏著名
-踏著录
-踏著称
-踏著者
-踏著述
-踩着
-踩著书
-踩著作
-踩著名
-踩著录
-踩著称
-踩著者
-踩著述
-身着
-身著书
-身著作
-身著名
-身著录
-身著称
-身著者
-身著述
-躺着
-躺著书
-躺著作
-躺著名
-躺著录
-躺著称
-躺著者
-躺著述
-转着
-转著书
-转著作
-转著名
-转著录
-转著称
-转著者
-转著述
-载着
-载著书
-载著作
-载著名
-载著录
-载著称
-载著者
-载著述
-达着
-达著书
-达著作
-达著名
-达著录
-达著称
-达著者
-达著述
-远着
-远著书
-远著作
-远著名
-远著录
-远著称
-远著者
-远著述
-连着
-连著书
-连著作
-连著名
-连著录
-连著称
-连著者
-连著述
-追着
-追著书
-追著作
-追著名
-追著录
-追著称
-追著者
-追著述
-逆着
-逆著书
-逆著作
-逆著名
-逆著录
-逆著称
-逆著者
-逆著述
-逼着
-逼著书
-逼著作
-逼著名
-逼著录
-逼著称
-逼著者
-逼著述
-遇着
-遇著书
-遇著作
-遇著名
-遇著录
-遇著称
-遇著者
-遇著述
-配着
-配著书
-配著作
-配著名
-配著录
-配著称
-配著者
-配著述
-酿着
-酿著书
-酿著作
-酿著名
-酿著录
-酿著称
-酿著者
-酿著述
-铺着
-铺著书
-铺著作
-铺著名
-铺著录
-铺著称
-铺著者
-铺著述
-闭着
-闭著书
-闭著作
-闭著名
-闭著录
-闭著称
-闭著者
-闭著述
-闲着
-闲著书
-闲著作
-闲著名
-闲著录
-闲著称
-闲著者
-闲著述
-附着
-附著书
-附著作
-附著名
-附著录
-附著称
-附著者
-附著述
-陋着
-陋著书
-陋著作
-陋著名
-陋著录
-陋著称
-陋著者
-陋著述
-陪着
-陪著书
-陪著作
-陪著名
-陪著录
-陪著称
-陪著者
-陪著述
-随着
-随著书
-随著作
-随著名
-随著录
-随著称
-随著者
-随著述
-隔着
-隔著书
-隔著作
-隔著名
-隔著录
-隔著称
-隔著者
-隔著述
-雅着
-雅著书
-雅著作
-雅著名
-雅著录
-雅著称
-雅著者
-雅著述
-顶着
-顶著书
-顶著作
-顶著名
-顶著录
-顶著称
-顶著者
-顶著述
-顺着
-顺著书
-顺著作
-顺著名
-顺著录
-顺著称
-顺著者
-顺著述
-领着
-领著书
-领著作
-领著名
-领著录
-领著称
-领著者
-领著述
-飘着
-飘著书
-飘著作
-飘著名
-飘著录
-飘著称
-飘著者
-飘著述
-驾着
-驾著书
-驾著作
-驾著名
-驾著录
-驾著称
-驾著者
-驾著述
-骂着
-骂著书
-骂著作
-骂著名
-骂著录
-骂著称
-骂著者
-骂著述
-骑着
-骑著书
-骑著作
-骑著名
-骑著录
-骑著称
-骑著者
-骑著述
-骗着
-骗著书
-骗著作
-骗著名
-骗著录
-骗著称
-骗著者
-骗著述
-高着
-高著书
-高著作
-高著名
-高著录
-高著称
-高著者
-高著述
-髭着
-髭著书
-髭著作
-髭著名
-髭著录
-髭著称
-髭著者
-髭著述
-黏着
-黏著书
-黏著作
-黏著名
-黏著录
-黏著称
-黏著者
-黏著述
-新著龙虎门
-护着
-护著书
-护著作
-护著名
-护著录
-护著称
-护著者
-护著述
-保护着
-爱护着
-庇护着
-传着
-传著书
-传著作
-传著名
-传著录
-传著称
-传著者
-传著述
-标志着
-流露着
-靠着
-靠著作
-靠著名
-靠著录
-靠著称
-靠著者
-靠著述
-玩着
-迫着
-吃得着
-吃不着
-吃着
-闻得着
-闻不着
-闻着
-嗅得着
-嗅不着
-嗅着
-警戒着
+乾神
+乾西
+象乾
+陈遇乾
+曾运乾
+王道乾
+孙乾
+乾潭
+乾贵士
於乎
於戏
魏徵
@@ -2183,8 +166,6 @@
於菟
於潜县
石碁镇
-因著《
-因著〈
李泽钜
於祥玉
於崇文
@@ -2221,9 +202,6 @@
幺二三
幺篇
幺谦
-麴义
-麴英
-麯崇裕
阿部正瞭
醯酱
醯鸡
@@ -2231,9 +209,61 @@
醯醢
醯壶
苧烯
-近角聪信
-米泽瑠美
-峯岸南
-僧伽吒
-王道乾
後姓
+先名后姓
+矇眬
+朱有燉
+缐姓
+缐国安
+仇雠
+雠校
+雠定
+校雠
+雠夷
+雠问
+甚夥
+吴克羣
+宏碁
+石碁
+碁圣
+暗闇
+繙㠾
+惏慄
+惏悷
+目劄
+橡椀
+谢肇淛
+朱淛
+諲譔
+李譔
+扞格
+陈元扞
+祕宜
+李祕
+剋了
+挨剋
+剋架
+皁保
+爨翫
+碁所
+於之莹
+陆徵祥
+瞭台
+文徵明
+博和讬
+楈枒
+米渖
+白渖
+拾渖
+渖液
+醉渖
+墨渖
+如渖
+残渖
+馀渖
+庆馀
+馀庆
+子馀
+郭行馀
+王馀鱼
+馀年无多 \ No newline at end of file
diff --git a/maintenance/language/zhtable/simpphrases_exclude.manual b/maintenance/language/zhtable/simpphrases_exclude.manual
index 3e9d3ecc..b4dd3e01 100644
--- a/maintenance/language/zhtable/simpphrases_exclude.manual
+++ b/maintenance/language/zhtable/simpphrases_exclude.manual
@@ -18,4 +18,13 @@
摺叠
-安甯 \ No newline at end of file
+安甯
+傢俬
+癥瘕
+存摺
+着录
+硷淡
+悽恻
+鲇鱼
+和尚撞一天钟
+余 \ No newline at end of file
diff --git a/maintenance/language/zhtable/symme_supp.manual b/maintenance/language/zhtable/symme_supp.manual
new file mode 100644
index 00000000..09e14155
--- /dev/null
+++ b/maintenance/language/zhtable/symme_supp.manual
@@ -0,0 +1,27 @@
+U+03476㑶|U+03439㐹|
+U+042F9䋹|U+0433F䌿|
+U+043B1䎱|U+043AC䎬|
+U+04C98䲘|U+09CE4鳤|
+U+0508C傌|U+03437㐷|
+U+05DA8嶨|U+05CC3峃|
+U+05ECE廎|U+05EBC庼|
+U+069EE槮|U+0692E椮|
+U+06EAE溮|U+06D49浉|
+U+07069灩|U+06EDF滟|
+U+074A1璡|U+0740E琎|
+U+074B5璵|U+07399玙|
+U+074B8璸|U+07478瑸|
+U+075F2痲|U+075F3痳|
+U+0819E膞|U+043DD䏝|
+U+085ED藭|U+044D6䓖|
+U+08600蘀|U+0841A萚|
+U+08AE1諡|U+08C25谥|
+U+09746靆|U+053C7叇|
+U+09749靉|U+053C6叆|
+U+09A44驄|U+29A02𩨂|
+U+09C1B鰛|U+09CC1鳁|
+U+09EB3麳|U+2A38C𪎌|
+U+295E1𩗡|U+29667𩙧|
+U+298F5𩣵|U+299FB𩧻|
+U+29F47𩽇|U+29F8E𩾎|
+U+2A23C𪈼|U+2A253𪉓| \ No newline at end of file
diff --git a/maintenance/language/zhtable/toCN.manual b/maintenance/language/zhtable/toCN.manual
index 243f61b0..a678ac93 100644
--- a/maintenance/language/zhtable/toCN.manual
+++ b/maintenance/language/zhtable/toCN.manual
@@ -1,57 +1,2283 @@
-」 ”
-「 “
-『 ‘
-』 ’
+餘 余
+諮 咨
+鍅 钫
+鉳 锫
+鑀 锿
+錼 镎
+鋂 镅
+鈽 钚
+鎝 锝
+鉲 锎
+矽 硅
+矽肺 矽肺
+矽塵 矽尘
+矽尘 矽尘
+矽鋼 矽钢
+矽钢 矽钢
+侏儸紀 侏罗纪
+甚麽 什么
+甚麼 什么
+胺基酸 氨基酸
+水氣 水汽
+計畫 计划
+天份 天分
+名份 名分
+職份 职分
+份外 分外
+份內 分内
+部份 部分
+知識份子 知识分子
+積極份子 积极分子
+投機份子 投机分子
+一份子 一分子
+水份 水分
+氧份 养分
+糖份 糖分
+鹽份 盐分
+組份 组分
+成份 成分
+本份 本分
+本本份份 本本分分
+恰如其份 恰如其分
+非份 非分
+過份 过分
+份量 分量
+緣份 缘分
+身分 身份
+煞車 刹车
+疊代 迭代
+叱吒 叱咤
+啸吒 啸咤
+姊姊 姐姐
+姊弟 姐弟
+姊夫 姐夫
+大姊 大姐
+御姊 御姐
+表姊 表姐
+堂姊 堂姐
+學姊 学姐
+乾姊 干姐
+澈底 彻底
+逕庭 径庭
+逕到 径到
+逕取 径取
+逕入 径入
+逕行 径行
+逕自 径自
+逕往 径往
+逕寄 径寄
+逕啟 径启
+逕迎 径迎
+徵狀 症状
+報帳 报账
+本帳 本账
+筆帳 笔账
+查帳 查账
+沖帳 冲账
+呆帳 呆账
+倒帳 倒账
+到帳 到账
+對帳 对账
+放帳 放账
+付帳 付账
+公帳 公账
+關帳 关账
+管帳 管账
+還帳 还账
+糊塗帳 糊涂账
+混帳 混账
+記帳 记账
+假帳 假账
+建帳 建账
+交帳 交账
+結帳 结账
+進帳 进账
+經常帳 经常账
+經濟帳 经济账
+舊帳 旧账
+開帳 开账
+賴帳 赖账
+爛帳 烂账
+流水帳 流水账
+買帳 买账
+明白帳 明白账
+簽帳 签账
+欠帳 欠账
+清帳 清账
+認帳 认账
+入帳 入账
+賒帳 赊账
+收帳 收账
+私帳 私账
+死帳 死账
+算帳 算账
+台帳 台账
+銷帳 销账
+要帳 要账
+轉帳 转账
+總帳 总账
+帳本 账本
+帳簿 账簿
+帳冊 账册
+帳單 账单
+帳房 账房
+帳號 账号
+帳戶 账户
+帳款 账款
+帳面 账面
+帳目 账目
+帳上 账上
+帳外 账外
+帳務 账务
+螢光棒 荧光棒
+辭彙 词汇
+著業 着业
+著絲 着丝
+著麼 着么
+著人 着人
+著什麼 着什么
+著他 着他
+著令 着令
+著位 着位
+著體 着体
+著你 着你
+著便 着便
+著涼 着凉
+著力 着力
+著勁 着劲
+著號 着号
+著呢 着呢
+著哩 着哩
+著地 着地
+著墨 着墨
+著聲 着声
+著處 着处
+著她 着她
+著妳 着妳
+著姓 着姓
+著它 着它
+著定 着定
+著實 着实
+著己 着己
+著帳 着帐
+著床 着床
+著庸 着庸
+著式 着式
+著錄 着录
+著心 着心
+著志 着志
+著忙 着忙
+著急 着急
+著惱 着恼
+著驚 着惊
+著想 着想
+著意 着意
+著慌 着慌
+著我 着我
+著手 着手
+著抹 着抹
+著摸 着摸
+著撰 着撰
+著數 着数
+著明 着明
+著末 着末
+著極 着极
+著格 着格
+著棋 着棋
+著槁 着槁
+著氣 着气
+著法 着法
+著淺 着浅
+著火 着火
+著然 着然
+著甚 着甚
+著生 着生
+著疑 着疑
+著白 着白
+著相 着相
+著眼 着眼
+著著 着着
+著祂 着祂
+著積 着积
+著稿 着稿
+著筆 着笔
+著籍 着籍
+著緊 着紧
+著緑 着緑
+著絆 着绊
+著績 着绩
+著緋 着绯
+著綠 着绿
+著肉 着肉
+著腳 着脚
+著艦 着舰
+著色 着色
+著節 着节
+著花 着花
+著莫 着莫
+著落 着落
+著槁 着藁
+著衣 着衣
+著裝 着装
+著要 着要
+著警 着警
+著趣 着趣
+著邊 着边
+著迷 着迷
+著跡 着迹
+著重 着重
+著録 着録
+著聞 着闻
+著陸 着陆
+著雝 着雝
+著鞭 着鞭
+著題 着题
+著魔 着魔
+不著 不着
+不著書 不著书
+不著名 不著名
+不著錄 不著录
+不著稱 不著称
+不著述 不著述
+與著 与着
+與著書 与著书
+與著作 与著作
+與著名 与著名
+與著錄 与著录
+與著稱 与著称
+與著者 与著者
+與著述 与著述
+醜著 丑着
+醜著書 丑著书
+醜著作 丑著作
+醜著名 丑著名
+醜著錄 丑著录
+醜著稱 丑著称
+醜著者 丑著者
+醜著述 丑著述
+臨著 临着
+臨著書 临著书
+臨著作 临著作
+臨著名 临著名
+臨著錄 临著录
+臨著稱 临著称
+臨著者 临著者
+臨著述 临著述
+麗著 丽着
+麗著書 丽著书
+麗著作 丽著作
+麗著名 丽著名
+麗著錄 丽著录
+麗著稱 丽著称
+麗著者 丽著者
+麗著述 丽著述
+樂著 乐着
+樂著書 乐著书
+樂著作 乐著作
+樂著名 乐著名
+樂著錄 乐著录
+樂著稱 乐著称
+樂著者 乐著者
+樂著述 乐著述
+乘著 乘着
+乘著書 乘著书
+乘著作 乘著作
+乘著名 乘著名
+乘著錄 乘著录
+乘著稱 乘著称
+乘著者 乘著者
+乘著述 乘著述
+爭著 争着
+爭著書 争著书
+爭著作 争著作
+爭著名 争著名
+爭著錄 争著录
+爭著稱 争著称
+爭著者 争著者
+爭著述 争著述
+亮著 亮着
+亮著書 亮著书
+亮著作 亮著作
+亮著名 亮著名
+亮著錄 亮著录
+亮著稱 亮著称
+亮著者 亮著者
+亮著述 亮著述
+仗著 仗着
+仗著書 仗著书
+仗著作 仗著作
+仗著名 仗著名
+仗著錄 仗著录
+仗著稱 仗著称
+仗著者 仗著者
+仗著述 仗著述
+代表著 代表着
+代表著書 代表著书
+代表著作 代表著作
+代表著名 代表著名
+代表著錄 代表著录
+代表著稱 代表著称
+代表著者 代表著者
+代表著述 代表著述
+伴著 伴着
+伴著書 伴著书
+伴著作 伴著作
+伴著名 伴著名
+伴著錄 伴著录
+伴著稱 伴著称
+伴著者 伴著者
+伴著述 伴著述
+低著 低着
+低著書 低著书
+低著作 低著作
+低著名 低著名
+低著錄 低著录
+低著稱 低著称
+低著者 低著者
+低著述 低著述
+住著 住着
+住著書 住著书
+住著作 住著作
+住著名 住著名
+住著錄 住著录
+住著稱 住著称
+住著者 住著者
+住著述 住著述
+側著 侧着
+側著書 侧著书
+側著作 侧著作
+側著名 侧著名
+側著錄 侧著录
+側著稱 侧著称
+側著者 侧著者
+側著述 侧著述
+保障著 保障着
+保障著書 保障著书
+保障著作 保障著作
+保障著名 保障著名
+保障著錄 保障著录
+保障著稱 保障著称
+保障著者 保障著者
+保障著述 保障著述
+信著 信着
+信著書 信著书
+信著作 信著作
+信著名 信著名
+信著錄 信著录
+信著稱 信著称
+信著者 信著者
+信著述 信著述
+候著 候着
+候著書 候著书
+候著作 候著作
+候著名 候著名
+候著錄 候著录
+候著稱 候著称
+候著者 候著者
+候著述 候著述
+借著 借着
+借著書 借著书
+借著作 借著作
+借著名 借著名
+借著錄 借著录
+借著稱 借著称
+借著者 借著者
+借著述 借著述
+做著 做着
+做著書 做著书
+做著作 做著作
+做著名 做著名
+做著錄 做著录
+做著稱 做著称
+做著者 做著者
+做著述 做著述
+偷著 偷着
+偷著書 偷著书
+偷著作 偷著作
+偷著名 偷著名
+偷著錄 偷著录
+偷著稱 偷著称
+偷著者 偷著者
+偷著述 偷著述
+光著 光着
+光著書 光著书
+光著作 光著作
+光著名 光著名
+光著錄 光著录
+光著稱 光著称
+光著者 光著者
+光著述 光著述
+關著 关着
+關著書 关著书
+關著作 关著作
+關著名 关著名
+關著錄 关著录
+關著稱 关著称
+關著者 关著者
+關著述 关著述
+冀著 冀着
+冀著書 冀著书
+冀著作 冀著作
+冀著名 冀著名
+冀著錄 冀著录
+冀著稱 冀著称
+冀著者 冀著者
+冀著述 冀著述
+冒著 冒着
+冒著書 冒著书
+冒著作 冒著作
+冒著名 冒著名
+冒著錄 冒著录
+冒著稱 冒著称
+冒著者 冒著者
+冒著述 冒著述
+寫著 写着
+寫著書 写著书
+寫著作 写著作
+寫著名 写著名
+寫著錄 写著录
+寫著稱 写著称
+寫著者 写著者
+寫著述 写著述
+涼著 凉着
+涼著書 凉著书
+涼著作 凉著作
+涼著名 凉著名
+涼著錄 凉著录
+涼著稱 凉著称
+涼著者 凉著者
+涼著述 凉著述
+制著 制着
+制著書 制著书
+制著作 制著作
+制著名 制著名
+制著錄 制著录
+制著稱 制著称
+制著者 制著者
+制著述 制著述
+刻著 刻着
+刻著書 刻著书
+刻著作 刻著作
+刻著名 刻著名
+刻著錄 刻著录
+刻著稱 刻著称
+刻著者 刻著者
+刻著述 刻著述
+辦著 办着
+辦著書 办著书
+辦著作 办著作
+辦著名 办著名
+辦著錄 办著录
+辦著稱 办著称
+辦著者 办著者
+辦著述 办著述
+動著 动着
+動著書 动著书
+動著作 动著作
+動著名 动著名
+動著錄 动著录
+動著稱 动著称
+動著者 动著者
+動著述 动著述
+努力著 努力着
+努力著書 努力著书
+努力著作 努力著作
+努力著名 努力著名
+努力著錄 努力著录
+努力著稱 努力著称
+努力著者 努力著者
+努力著述 努力著述
+努著 努着
+努著書 努著书
+努著作 努著作
+努著名 努著名
+努著錄 努著录
+努著稱 努著称
+努著者 努著者
+努著述 努著述
+印著 印着
+印著書 印著书
+印著作 印著作
+印著名 印著名
+印著錄 印著录
+印著稱 印著称
+印著者 印著者
+印著述 印著述
+壓著 压着
+壓著書 压著书
+壓著作 压著作
+壓著名 压著名
+壓著錄 压著录
+壓著稱 压著称
+壓著者 压著者
+壓著述 压著述
+去著 去着
+去著書 去著书
+去著作 去著作
+去著名 去著名
+去著錄 去著录
+去著稱 去著称
+去著者 去著者
+去著述 去著述
+受著 受着
+受著書 受著书
+受著作 受著作
+受著名 受著名
+受著錄 受著录
+受著稱 受著称
+受著者 受著者
+受著述 受著述
+變著 变着
+變著書 变著书
+變著作 变著作
+變著名 变著名
+變著錄 变著录
+變著稱 变著称
+變著者 变著者
+變著述 变著述
+叫著 叫着
+叫著書 叫著书
+叫著作 叫著作
+叫著名 叫著名
+叫著錄 叫著录
+叫著稱 叫著称
+叫著者 叫著者
+叫著述 叫著述
+向著 向着
+向著書 向著书
+向著作 向著作
+向著名 向著名
+向著錄 向著录
+向著稱 向著称
+向著者 向著者
+向著述 向著述
+含著 含着
+含著書 含著书
+含著作 含著作
+含著名 含著名
+含著錄 含著录
+含著稱 含著称
+含著者 含著者
+含著述 含著述
+聽著 听着
+聽著書 听著书
+聽著作 听著作
+聽著名 听著名
+聽著錄 听著录
+聽著稱 听著称
+聽著者 听著者
+聽著述 听著述
+吹著 吹着
+吹著書 吹著书
+吹著作 吹著作
+吹著名 吹著名
+吹著錄 吹著录
+吹著稱 吹著称
+吹著者 吹著者
+吹著述 吹著述
+味著 味着
+味著書 味著书
+味著作 味著作
+味著名 味著名
+味著錄 味著录
+味著稱 味著称
+味著者 味著者
+味著述 味著述
+響著 响着
+響著書 响著书
+響著作 响著作
+響著名 响著名
+響著錄 响著录
+響著稱 响著称
+響著者 响著者
+響著述 响著述
+哭著 哭着
+哭著書 哭著书
+哭著作 哭著作
+哭著名 哭著名
+哭著錄 哭著录
+哭著稱 哭著称
+哭著者 哭著者
+哭著述 哭著述
+唱著 唱着
+唱著書 唱著书
+唱著作 唱著作
+唱著名 唱著名
+唱著錄 唱著录
+唱著稱 唱著称
+唱著者 唱著者
+唱著述 唱著述
+喝著 喝着
+喝著書 喝著书
+喝著作 喝著作
+喝著名 喝著名
+喝著錄 喝著录
+喝著稱 喝著称
+喝著者 喝著者
+喝著述 喝著述
+嚷著 嚷着
+嚷著書 嚷著书
+嚷著作 嚷著作
+嚷著名 嚷著名
+嚷著錄 嚷著录
+嚷著稱 嚷著称
+嚷著者 嚷著者
+嚷著述 嚷著述
+因著 因着
+因著書 因著书
+因著作 因著作
+因著名 因著名
+因著錄 因著录
+因著录 因著录
+因著稱 因著称
+因著者 因著者
+因著述 因著述
+因著《 因著《
+因著〈 因著〈
+困著 困着
+困著書 困著书
+困著作 困著作
+困著名 困著名
+困著錄 困著录
+困著稱 困著称
+困著者 困著者
+困著述 困著述
+圍著 围着
+圍著書 围著书
+圍著作 围著作
+圍著名 围著名
+圍著錄 围著录
+圍著稱 围著称
+圍著者 围著者
+圍著述 围著述
+在著 在着
+在著書 在著书
+在著作 在著作
+在著名 在著名
+在著錄 在著录
+在著稱 在著称
+在著者 在著者
+在著述 在著述
+坐著 坐着
+坐著書 坐著书
+坐著作 坐著作
+坐著名 坐著名
+坐著錄 坐著录
+坐著稱 坐著称
+坐著者 坐著者
+坐著述 坐著述
+備著 备着
+備著書 备著书
+備著作 备著作
+備著名 备著名
+備著錄 备著录
+備著稱 备著称
+備著者 备著者
+備著述 备著述
+夾著 夹着
+夾著書 夹著书
+夾著作 夹著作
+夾著名 夹著名
+夾著錄 夹著录
+夾著稱 夹著称
+夾著者 夹著者
+夾著述 夹著述
+孤著 孤着
+孤著書 孤著书
+孤著作 孤著作
+孤著名 孤著名
+孤著錄 孤著录
+孤著稱 孤著称
+孤著者 孤著者
+孤著述 孤著述
+學著 学着
+學著書 学著书
+學著作 学著作
+學著名 学著名
+學著錄 学著录
+學著稱 学著称
+學著者 学著者
+學著述 学著述
+守著 守着
+守著書 守著书
+守著作 守著作
+守著名 守著名
+守著錄 守著录
+守著稱 守著称
+守著者 守著者
+守著述 守著述
+定著 定着
+定著書 定著书
+定著作 定著作
+定著名 定著名
+定著錄 定著录
+定著稱 定著称
+定著者 定著者
+定著述 定著述
+對著 对着
+對著書 对著书
+對著作 对著作
+對著名 对著名
+對著錄 对著录
+對著稱 对著称
+對著者 对著者
+對著述 对著述
+尋著 寻着
+尋著書 寻著书
+尋著作 寻著作
+尋著名 寻著名
+尋著錄 寻著录
+尋著稱 寻著称
+尋著者 寻著者
+尋著述 寻著述
+展著 展着
+展著書 展著书
+展著作 展著作
+展著名 展著名
+展著錄 展著录
+展著稱 展著称
+展著者 展著者
+展著述 展著述
+帶著 带着
+帶著書 带著书
+帶著作 带著作
+帶著名 带著名
+帶著錄 带著录
+帶著稱 带著称
+帶著者 带著者
+帶著述 带著述
+幫著 帮着
+幫著書 帮著书
+幫著作 帮著作
+幫著名 帮著名
+幫著錄 帮著录
+幫著稱 帮著称
+幫著者 帮著者
+幫著述 帮著述
+應著 应着
+應著書 应著书
+應著作 应著作
+應著名 应著名
+應著錄 应著录
+應著稱 应著称
+應著者 应著者
+應著述 应著述
+康著 康着
+康著書 康著书
+康著作 康著作
+康著名 康著名
+康著錄 康著录
+康著稱 康著称
+康著者 康著者
+康著述 康著述
+開著 开着
+開著書 开著书
+開著作 开著作
+開著名 开著名
+開著錄 开著录
+開著稱 开著称
+開著者 开著者
+開著述 开著述
+當著 当着
+當著書 当著书
+當著作 当著作
+當著名 当著名
+當著錄 当著录
+當著稱 当著称
+當著者 当著者
+當著述 当著述
+待著 待着
+待著書 待著书
+待著作 待著作
+待著名 待著名
+待著錄 待著录
+待著稱 待著称
+待著者 待著者
+待著述 待著述
+得著 得着
+得著書 得著书
+得著作 得著作
+得著名 得著名
+得著錄 得著录
+得著稱 得著称
+得著者 得著者
+得著述 得著述
+循著 循着
+循著書 循著书
+循著作 循著作
+循著名 循著名
+循著錄 循著录
+循著稱 循著称
+循著者 循著者
+循著述 循著述
+心著 心着
+心著書 心著书
+心著作 心著作
+心著名 心著名
+心著錄 心著录
+心著稱 心著称
+心著者 心著者
+心著述 心著述
+忍著 忍着
+忍著書 忍著书
+忍著作 忍著作
+忍著名 忍著名
+忍著錄 忍著录
+忍著稱 忍著称
+忍著者 忍著者
+忍著述 忍著述
+志著 志着
+志著書 志著书
+志著作 志著作
+志著名 志著名
+志著錄 志著录
+志著稱 志著称
+志著者 志著者
+志著述 志著述
+忙著 忙着
+忙著書 忙著书
+忙著作 忙著作
+忙著名 忙著名
+忙著錄 忙著录
+忙著稱 忙著称
+忙著者 忙著者
+忙著述 忙著述
+懷著 怀着
+懷著書 怀著书
+懷著作 怀著作
+懷著名 怀著名
+懷著錄 怀著录
+懷著稱 怀著称
+懷著者 怀著者
+懷著述 怀著述
+急著 急着
+急著書 急著书
+急著作 急著作
+急著名 急著名
+急著錄 急著录
+急著稱 急著称
+急著者 急著者
+急著述 急著述
+性著 性着
+性著書 性著书
+性著作 性著作
+性著名 性著名
+性著錄 性著录
+性著稱 性著称
+性著者 性著者
+性著述 性著述
+戀著 恋着
+戀著書 恋著书
+戀著作 恋著作
+戀著名 恋著名
+戀著錄 恋著录
+戀著稱 恋著称
+戀著者 恋著者
+戀著述 恋著述
+悠著 悠着
+悠著書 悠著书
+悠著作 悠著作
+悠著名 悠著名
+悠著錄 悠著录
+悠著稱 悠著称
+悠著者 悠著者
+悠著述 悠著述
+慣著 惯着
+慣著書 惯著书
+慣著作 惯著作
+慣著名 惯著名
+慣著錄 惯著录
+慣著稱 惯著称
+慣著者 惯著者
+慣著述 惯著述
+想著 想着
+想著書 想著书
+想著作 想著作
+想著名 想著名
+想著錄 想著录
+想著稱 想著称
+想著者 想著者
+想著述 想著述
+戰著 战着
+戰著書 战著书
+戰著作 战著作
+戰著名 战著名
+戰著錄 战著录
+戰著稱 战著称
+戰著者 战著者
+戰著述 战著述
+戴著 戴着
+戴著書 戴著书
+戴著作 戴著作
+戴著名 戴著名
+戴著錄 戴著录
+戴著稱 戴著称
+戴著者 戴著者
+戴著述 戴著述
+紮著 扎着
+紮著書 扎著书
+紮著作 扎著作
+紮著名 扎著名
+紮著錄 扎著录
+紮著稱 扎著称
+紮著者 扎著者
+紮著述 扎著述
+打著 打着
+打著書 打著书
+打著作 打著作
+打著名 打著名
+打著錄 打著录
+打著稱 打著称
+打著者 打著者
+打著述 打著述
+扛著 扛着
+扛著書 扛著书
+扛著作 扛著作
+扛著名 扛著名
+扛著錄 扛著录
+扛著稱 扛著称
+扛著者 扛著者
+扛著述 扛著述
+抓著 抓着
+抓著作 抓著作
+抓著名 抓著名
+抓著錄 抓著录
+抓著稱 抓著称
+抓著者 抓著者
+抓著述 抓著述
+披著 披着
+披著書 披著书
+披著作 披著作
+披著名 披著名
+披著錄 披著录
+披著稱 披著称
+披著者 披著者
+披著述 披著述
+抬著 抬着
+抬著作 抬著作
+抬著名 抬著名
+抬著錄 抬著录
+抬著稱 抬著称
+抬著者 抬著者
+抬著述 抬著述
+抱著 抱着
+抱著作 抱著作
+抱著名 抱著名
+抱著錄 抱著录
+抱著稱 抱著称
+抱著者 抱著者
+抱著述 抱著述
+拉著 拉着
+拉著書 拉著书
+拉著作 拉著作
+拉著名 拉著名
+拉著錄 拉著录
+拉著稱 拉著称
+拉著者 拉著者
+拉著述 拉著述
+拎著 拎着
+拎著作 拎著作
+拎著名 拎著名
+拎著錄 拎著录
+拎著稱 拎著称
+拎著者 拎著者
+拎著述 拎著述
+拖著 拖着
+拖著作 拖著作
+拖著名 拖著名
+拖著錄 拖著录
+拖著稱 拖著称
+拖著者 拖著者
+拖著述 拖著述
+拼著 拼着
+拼著作 拼著作
+拼著名 拼著名
+拼著錄 拼著录
+拼著稱 拼著称
+拼著者 拼著者
+拼著述 拼著述
+拿著 拿着
+拿著作 拿著作
+拿著名 拿著名
+拿著錄 拿著录
+拿著稱 拿著称
+拿著者 拿著者
+拿著述 拿著述
+持著 持着
+持著作 持著作
+持著名 持著名
+持著錄 持著录
+持著稱 持著称
+持著者 持著者
+持著述 持著述
+挑著 挑着
+挑著作 挑著作
+挑著名 挑著名
+挑著錄 挑著录
+挑著稱 挑著称
+挑著者 挑著者
+挑著述 挑著述
+擋著 挡着
+擋著作 挡著作
+擋著名 挡著名
+擋著錄 挡著录
+擋著稱 挡著称
+擋著者 挡著者
+擋著述 挡著述
+掙著 挣着
+掙著書 挣著书
+掙著作 挣著作
+掙著名 挣著名
+掙著錄 挣著录
+掙著稱 挣著称
+掙著者 挣著者
+掙著述 挣著述
+揮著 挥着
+揮著作 挥著作
+揮著名 挥著名
+揮著錄 挥著录
+揮著稱 挥著称
+揮著者 挥著者
+揮著述 挥著述
+挨著 挨着
+挨著作 挨著作
+挨著名 挨著名
+挨著錄 挨著录
+挨著稱 挨著称
+挨著者 挨著者
+挨著述 挨著述
+捆著 捆着
+捆著作 捆著作
+捆著名 捆著名
+捆著錄 捆著录
+捆著稱 捆著称
+捆著者 捆著者
+捆著述 捆著述
+據著 据着
+據著書 据著书
+據著作 据著作
+據著名 据著名
+據著錄 据著录
+據著稱 据著称
+據著者 据著者
+據著述 据著述
+掖著 掖着
+掖著作 掖著作
+掖著名 掖著名
+掖著錄 掖著录
+掖著稱 掖著称
+掖著者 掖著者
+掖著述 掖著述
+接著 接着
+接著作 接著作
+接著名 接著名
+接著錄 接著录
+接著稱 接著称
+接著者 接著者
+接著述 接著述
+揉著 揉着
+揉著書 揉著书
+揉著作 揉著作
+揉著名 揉著名
+揉著錄 揉著录
+揉著稱 揉著称
+揉著者 揉著者
+揉著述 揉著述
+提著 提着
+提著作 提著作
+提著名 提著名
+提著錄 提著录
+提著稱 提著称
+提著者 提著者
+提著述 提著述
+摟著 搂着
+摟著作 搂著作
+摟著名 搂著名
+摟著錄 搂著录
+摟著稱 搂著称
+摟著者 搂著者
+摟著述 搂著述
+擺著 摆着
+擺著作 摆著作
+擺著名 摆著名
+擺著錄 摆著录
+擺著稱 摆著称
+擺著者 摆著者
+擺著述 摆著述
+撼著 撼着
+撼著書 撼著书
+撼著作 撼著作
+撼著名 撼著名
+撼著錄 撼著录
+撼著稱 撼著称
+撼著者 撼著者
+撼著述 撼著述
+敞著 敞着
+敞著作 敞著作
+敞著名 敞著名
+敞著錄 敞著录
+敞著稱 敞著称
+敞著者 敞著者
+敞著述 敞著述
+數著 数着
+數著作 数著作
+數著名 数著名
+數著錄 数著录
+數著稱 数著称
+數著者 数著者
+數著述 数著述
+鬥著 斗着
+鬥著書 斗著书
+鬥著作 斗著作
+鬥著名 斗著名
+鬥著錄 斗著录
+鬥著稱 斗著称
+鬥著者 斗著者
+鬥著述 斗著述
+斥著 斥着
+斥著書 斥著书
+斥著作 斥著作
+斥著名 斥著名
+斥著錄 斥著录
+斥著稱 斥著称
+斥著者 斥著者
+斥著述 斥著述
+昂著 昂着
+昂著書 昂著书
+昂著作 昂著作
+昂著名 昂著名
+昂著錄 昂著录
+昂著稱 昂著称
+昂著者 昂著者
+昂著述 昂著述
+映著 映着
+映著書 映著书
+映著作 映著作
+映著名 映著名
+映著錄 映著录
+映著稱 映著称
+映著者 映著者
+映著述 映著述
+晃著 晃着
+晃著作 晃著作
+晃著名 晃著名
+晃著錄 晃著录
+晃著稱 晃著称
+晃著者 晃著者
+晃著述 晃著述
+暗著 暗着
+暗著書 暗著书
+暗著作 暗著作
+暗著名 暗著名
+暗著錄 暗著录
+暗著稱 暗著称
+暗著者 暗著者
+暗著述 暗著述
+有著 有着
+有著書 有著书
+有著作 有著作
+有著名 有著名
+有著錄 有著录
+有著稱 有著称
+有著者 有著者
+有著述 有著述
+望著 望着
+望著作 望著作
+望著名 望著名
+望著錄 望著录
+望著稱 望著称
+望著者 望著者
+望著述 望著述
+朝著 朝着
+朝著作 朝著作
+朝著名 朝著名
+朝著錄 朝著录
+朝著稱 朝著称
+朝著者 朝著者
+朝著述 朝著述
+本著 本着
+本著書 本著书
+本著作 本著作
+本著名 本著名
+本著錄 本著录
+本著稱 本著称
+本著者 本著者
+本著述 本著述
+殺著 杀着
+殺著書 杀著书
+殺著作 杀著作
+殺著名 杀著名
+殺著錄 杀著录
+殺著稱 杀著称
+殺著者 杀著者
+殺著述 杀著述
+雜著 杂着
+雜著書 杂著书
+雜著作 杂著作
+雜著名 杂著名
+雜著錄 杂著录
+雜著稱 杂著称
+雜著者 杂著者
+雜著述 杂著述
+來著 来着
+來著書 来著书
+來著作 来著作
+來著名 来著名
+來著錄 来著录
+來著稱 来著称
+來著者 来著者
+來著述 来著述
+枕著 枕着
+枕著作 枕著作
+枕著名 枕著名
+枕著錄 枕著录
+枕著稱 枕著称
+枕著者 枕著者
+枕著述 枕著述
+夢著 梦着
+夢著書 梦著书
+夢著作 梦著作
+夢著名 梦著名
+夢著錄 梦著录
+夢著稱 梦著称
+夢著者 梦著者
+夢著述 梦著述
+梳著 梳着
+梳著作 梳著作
+梳著名 梳著名
+梳著錄 梳著录
+梳著稱 梳著称
+梳著者 梳著者
+梳著述 梳著述
+求著 求着
+求著書 求著书
+求著作 求著作
+求著名 求著名
+求著錄 求著录
+求著稱 求著称
+求著者 求著者
+求著述 求著述
+沉著 沉着
+沉著書 沉著书
+沉著作 沉著作
+沉著名 沉著名
+沉著錄 沉著录
+沉著稱 沉著称
+沉著者 沉著者
+沉著述 沉著述
+沿著 沿着
+沿著書 沿著书
+沿著作 沿著作
+沿著名 沿著名
+沿著錄 沿著录
+沿著稱 沿著称
+沿著者 沿著者
+沿著述 沿著述
+活著 活着
+活著書 活著书
+活著作 活著作
+活著名 活著名
+活著錄 活著录
+活著稱 活著称
+活著者 活著者
+活著述 活著述
+流著 流着
+流著書 流著书
+流著作 流著作
+流著名 流著名
+流著錄 流著录
+流著稱 流著称
+流著者 流著者
+流著述 流著述
+浮著 浮着
+浮著書 浮著书
+浮著作 浮著作
+浮著名 浮著名
+浮著錄 浮著录
+浮著稱 浮著称
+浮著者 浮著者
+浮著述 浮著述
+潤著 润着
+潤著書 润著书
+潤著作 润著作
+潤著名 润著名
+潤著錄 润著录
+潤著稱 润著称
+潤著者 润著者
+潤著述 润著述
+涵著 涵着
+涵著書 涵著书
+涵著作 涵著作
+涵著名 涵著名
+涵著錄 涵著录
+涵著稱 涵著称
+涵著者 涵著者
+涵著述 涵著述
+渴著 渴着
+渴著書 渴著书
+渴著作 渴著作
+渴著名 渴著名
+渴著錄 渴著录
+渴著稱 渴著称
+渴著者 渴著者
+渴著述 渴著述
+溢著 溢着
+溢著書 溢著书
+溢著作 溢著作
+溢著名 溢著名
+溢著錄 溢著录
+溢著稱 溢著称
+溢著者 溢著者
+溢著述 溢著述
+演著 演着
+演著書 演著书
+演著作 演著作
+演著名 演著名
+演著錄 演著录
+演著稱 演著称
+演著者 演著者
+演著述 演著述
+漫著 漫着
+漫著書 漫著书
+漫著作 漫著作
+漫著名 漫著名
+漫著錄 漫著录
+漫著稱 漫著称
+漫著者 漫著者
+漫著述 漫著述
+點著 点着
+點著作 点著作
+點著名 点著名
+點著錄 点著录
+點著稱 点著称
+點著者 点著者
+點著述 点著述
+燒著 烧着
+燒著作 烧著作
+燒著名 烧著名
+燒著錄 烧著录
+燒著稱 烧著称
+燒著者 烧著者
+燒著述 烧著述
+照著 照着
+照著書 照著书
+照著作 照著作
+照著名 照著名
+照著錄 照著录
+照著稱 照著称
+照著者 照著者
+照著述 照著述
+愛著 爱着
+愛著書 爱著书
+愛著作 爱著作
+愛著名 爱著名
+愛著錄 爱著录
+愛著稱 爱著称
+愛著者 爱著者
+愛著述 爱著述
+牽著 牵着
+牽著書 牵著书
+牽著作 牵著作
+牽著名 牵著名
+牽著錄 牵著录
+牽著稱 牵著称
+牽著者 牵著者
+牽著述 牵著述
+獨著 独着
+獨著書 独著书
+獨著作 独著作
+獨著名 独著名
+獨著錄 独著录
+獨著稱 独著称
+獨著者 独著者
+獨著述 独著述
+猜著 猜着
+猜著書 猜着书
+猜著作 猜著作
+猜著名 猜著名
+猜著錄 猜著录
+猜著稱 猜著称
+猜著者 猜著者
+猜著述 猜著述
+甜著 甜着
+甜著書 甜著书
+甜著作 甜著作
+甜著名 甜著名
+甜著錄 甜著录
+甜著稱 甜著称
+甜著者 甜著者
+甜著述 甜著述
+用著 用着
+用著書 用著书
+用著作 用著作
+用著名 用著名
+用著錄 用著录
+用著稱 用著称
+用著者 用著者
+用著述 用著述
+留著 留着
+留著書 留着书
+留著作 留著作
+留著名 留著名
+留著錄 留著录
+留著稱 留著称
+留著者 留著者
+留著述 留著述
+疑著 疑着
+疑著書 疑著书
+疑著作 疑著作
+疑著名 疑著名
+疑著錄 疑著录
+疑著稱 疑著称
+疑著者 疑著者
+疑著述 疑著述
+皺著 皱着
+皺著書 皱著书
+皺著作 皱著作
+皺著名 皱著名
+皺著錄 皱著录
+皺著稱 皱著称
+皺著者 皱著者
+皺著述 皱著述
+盛著 盛着
+盛著書 盛著书
+盛著作 盛著作
+盛著名 盛著名
+盛著錄 盛著录
+盛著稱 盛著称
+盛著者 盛著者
+盛著述 盛著述
+盯著 盯着
+盯著書 盯着书
+盯著作 盯著作
+盯著名 盯著名
+盯著錄 盯著录
+盯著稱 盯著称
+盯著者 盯著者
+盯著述 盯著述
+盾著 盾着
+盾著書 盾著书
+盾著作 盾著作
+盾著名 盾著名
+盾著錄 盾著录
+盾著稱 盾著称
+盾著者 盾著者
+盾著述 盾著述
+看著 看着
+看著書 看着书
+看著作 看著作
+看著名 看著名
+看著錄 看著录
+看著稱 看著称
+看著者 看著者
+看著述 看著述
+瞧著 瞧着
+瞧著書 瞧着书
+瞧著作 瞧著作
+瞧著名 瞧著名
+瞧著錄 瞧著录
+瞧著稱 瞧著称
+瞧著者 瞧著者
+瞧著述 瞧著述
+存著 存着
+存著名 存著名
+劃著 划着
+別著 别着
+刮著 刮着
+掛著 挂着
+吊著 吊着
+回著 回着
+回著名 回著名
+塗著 涂着
+麼著 么着
+擔著 担着
+負著 负着
+板著臉 板着脸
+為著 为着
+為著作 为著作
+為著名 为著名
+為著錄 为著录
+為著稱 为著称
+為著者 为著者
+為著述 为著述
+為著《 为著《
+畫著 画着
+畫著作 画著作
+畫著名 画著名
+畫著稱 画著称
+畫著者 画著者
+發著 发着
+發著作 发著作
+發著名 发著名
+發著稱 发著称
+發著者 发著者
+發著《 发著《
+簽著 签着
+繃著 绷着
+覆著 覆着
+蓋著 蓋着
+說著 说着
+說著作 说著作
+說著稱 说著称
+說著者 说著者
+說著述 说著述
+湊合著 凑合着
+配合著 配合着
+配合著名 配合著名
+關係著 关系着
+鬧著 闹着
+蒙著 蒙着
+悶著 闷着
+占著 占着
+占著名 占著名
+占著作 占著作
+占著者 占著者
+呆著 呆着
+包著 包着
+駛著 驶着
+睡著 睡着
+睡著書 睡著书
+睡著作 睡著作
+睡著名 睡著名
+睡著錄 睡著录
+睡著稱 睡著称
+睡著者 睡著者
+睡著述 睡著述
+瞞著 瞒着
+瞞著書 瞒著书
+瞞著作 瞒著作
+瞞著名 瞒著名
+瞞著錄 瞒著录
+瞞著稱 瞒著称
+瞞著者 瞒著者
+瞞著述 瞒著述
+瞪著 瞪着
+瞪著書 瞪著书
+瞪著作 瞪著作
+瞪著名 瞪著名
+瞪著錄 瞪著录
+瞪著稱 瞪著称
+瞪著者 瞪著者
+瞪著述 瞪著述
+福著 福着
+福著書 福著书
+福著作 福著作
+福著名 福著名
+福著錄 福著录
+福著稱 福著称
+福著者 福著者
+福著述 福著述
+空著 空着
+空著書 空著书
+空著作 空著作
+空著名 空著名
+空著錄 空著录
+空著稱 空著称
+空著者 空著者
+空著述 空著述
+穿著 穿着
+穿著書 穿著书
+穿著作 穿著作
+穿著名 穿著名
+穿著錄 穿著录
+穿著稱 穿著称
+穿著者 穿著者
+穿著述 穿著述
+豎著 竖着
+豎著書 竖著书
+豎著作 竖著作
+豎著名 竖著名
+豎著錄 竖著录
+豎著稱 竖著称
+豎著者 竖著者
+豎著述 竖著述
+站著 站着
+站著書 站著书
+站著作 站著作
+站著名 站著名
+站著錄 站著录
+站著稱 站著称
+站著者 站著者
+站著述 站著述
+笑著 笑着
+笑著書 笑著书
+笑著作 笑著作
+笑著名 笑著名
+笑著錄 笑著录
+笑著稱 笑著称
+笑著者 笑著者
+笑著述 笑著述
+管著 管着
+管著書 管著书
+管著作 管著作
+管著名 管著名
+管著錄 管著录
+管著稱 管著称
+管著者 管著者
+管著述 管著述
+綁著 绑着
+綁著書 绑著书
+綁著作 绑著作
+綁著名 绑著名
+綁著錄 绑著录
+綁著稱 绑著称
+綁著者 绑著者
+綁著述 绑著述
+繞著 绕着
+繞著書 绕著书
+繞著作 绕著作
+繞著名 绕著名
+繞著錄 绕著录
+繞著稱 绕著称
+繞著者 绕著者
+繞著述 绕著述
+纏著 缠着
+纏著書 缠著书
+纏著作 缠著作
+纏著名 缠著名
+纏著錄 缠著录
+纏著稱 缠著称
+纏著者 缠著者
+纏著述 缠著述
+罩著 罩着
+罩著書 罩著书
+罩著作 罩著作
+罩著名 罩著名
+罩著錄 罩著录
+罩著稱 罩著称
+罩著者 罩著者
+罩著述 罩著述
+美著 美着
+美著書 美著书
+美著作 美著作
+美著名 美著名
+美著錄 美著录
+美著稱 美著称
+美著者 美著者
+美著述 美著述
+耀著 耀着
+耀著書 耀著书
+耀著作 耀著作
+耀著名 耀著名
+耀著錄 耀著录
+耀著稱 耀著称
+耀著者 耀著者
+耀著述 耀著述
+考著 考着
+考著書 考著书
+考著作 考著作
+考著名 考著名
+考著錄 考著录
+考著稱 考著称
+考著者 考著者
+考著述 考著述
+背著 背着
+背著書 背著书
+背著作 背著作
+背著名 背著名
+背著錄 背著录
+背著稱 背著称
+背著者 背著者
+背著述 背著述
+膠著 胶着
+膠著書 胶著书
+膠著作 胶著作
+膠著名 胶著名
+膠著錄 胶著录
+膠著稱 胶著称
+膠著者 胶著者
+膠著述 胶著述
+藝著 艺着
+藝著書 艺著书
+藝著作 艺著作
+藝著名 艺著名
+藝著錄 艺著录
+藝著稱 艺著称
+藝著者 艺著者
+藝著述 艺著述
+苦著 苦着
+苦著書 苦著书
+苦著作 苦著作
+苦著名 苦著名
+苦著錄 苦著录
+苦著稱 苦著称
+苦著者 苦著者
+苦著述 苦著述
+獲著 获着
+獲著書 获著书
+獲著作 获著作
+獲著名 获著名
+獲著錄 获著录
+獲著稱 获著称
+獲著者 获著者
+獲著述 获著述
+落著 落着
+落著書 落著书
+落著作 落著作
+落著名 落著名
+落著錄 落著录
+落著稱 落著称
+落著者 落著者
+落著述 落著述
+蒙著書 蒙著书
+蒙著作 蒙著作
+蒙著名 蒙著名
+蒙著錄 蒙著录
+蒙著稱 蒙著称
+蒙著者 蒙著者
+蒙著述 蒙著述
+藏著 藏着
+藏著書 藏著书
+藏著作 藏著作
+藏著名 藏著名
+藏著錄 藏著录
+藏著稱 藏著称
+藏著者 藏著者
+藏著述 藏著述
+蘸著 蘸着
+蘸著書 蘸著书
+蘸著作 蘸著作
+蘸著名 蘸著名
+蘸著錄 蘸著录
+蘸著稱 蘸著称
+蘸著者 蘸著者
+蘸著述 蘸著述
+行著 行着
+行著書 行著书
+行著作 行著作
+行著名 行著名
+行著錄 行著录
+行著稱 行著称
+行著者 行著者
+行著述 行著述
+衣著 衣着
+衣著書 衣著书
+衣著作 衣著作
+衣著名 衣著名
+衣著錄 衣著录
+衣著稱 衣著称
+衣著者 衣著者
+衣著述 衣著述
+裝著 装着
+裝著書 装著书
+裝著作 装著作
+裝著名 装著名
+裝著錄 装著录
+裝著稱 装著称
+裝著者 装著者
+裝著述 装著述
+裹著 裹着
+裹著書 裹著书
+裹著作 裹著作
+裹著名 裹著名
+裹著錄 裹著录
+裹著稱 裹著称
+裹著者 裹著者
+裹著述 裹著述
+見著 见着
+見著書 见著书
+見著作 见著作
+見著名 见著名
+見著錄 见著录
+見著稱 见著称
+見著者 见著者
+見著述 见著述
+記著 记着
+記著書 记著书
+記著作 记著作
+記著名 记著名
+記著錄 记著录
+記著稱 记著称
+記著者 记著者
+記著述 记著述
+試著 试着
+試著書 试著书
+試著作 试著作
+試著名 试著名
+試著錄 试著录
+試著稱 试著称
+試著者 试著者
+試著述 试著述
+語著 语着
+語著書 语著书
+語著作 语著作
+語著名 语著名
+語著錄 语著录
+語著稱 语著称
+語著者 语著者
+語著述 语著述
+豫著 豫着
+豫著書 豫著书
+豫著作 豫著作
+豫著名 豫著名
+豫著錄 豫著录
+豫著稱 豫著称
+豫著者 豫著者
+豫著述 豫著述
+貞著 贞着
+貞著書 贞著书
+貞著作 贞著作
+貞著名 贞著名
+貞著錄 贞著录
+貞著稱 贞著称
+貞著者 贞著者
+貞著述 贞著述
+走著 走着
+走著書 走著书
+走著作 走著作
+走著名 走著名
+走著錄 走著录
+走著稱 走著称
+走著者 走著者
+走著述 走著述
+趕著 赶着
+趕著書 赶著书
+趕著作 赶著作
+趕著名 赶著名
+趕著錄 赶著录
+趕著稱 赶著称
+趕著者 赶著者
+趕著述 赶著述
+趴著 趴着
+趴著書 趴著书
+趴著作 趴著作
+趴著名 趴著名
+趴著錄 趴著录
+趴著稱 趴著称
+趴著者 趴著者
+趴著述 趴著述
+躍著 跃着
+躍著書 跃著书
+躍著作 跃著作
+躍著名 跃著名
+躍著錄 跃著录
+躍著稱 跃著称
+躍著者 跃著者
+躍著述 跃著述
+跑著 跑着
+跑著書 跑著书
+跑著作 跑著作
+跑著名 跑著名
+跑著錄 跑著录
+跑著稱 跑著称
+跑著者 跑著者
+跑著述 跑著述
+跟著 跟着
+跟著書 跟著书
+跟著作 跟著作
+跟著名 跟著名
+跟著錄 跟著录
+跟著稱 跟著称
+跟著者 跟著者
+跟著述 跟著述
+跪著 跪着
+跪著書 跪著书
+跪著作 跪著作
+跪著名 跪著名
+跪著錄 跪著录
+跪著稱 跪著称
+跪著者 跪著者
+跪著述 跪著述
+跳著 跳着
+跳著書 跳著书
+跳著作 跳著作
+跳著名 跳著名
+跳著錄 跳著录
+跳著稱 跳著称
+跳著者 跳著者
+跳著述 跳著述
+踏著 踏着
+踏著書 踏著书
+踏著作 踏著作
+踏著名 踏著名
+踏著錄 踏著录
+踏著稱 踏著称
+踏著者 踏著者
+踏著述 踏著述
+踩著 踩着
+踩著書 踩著书
+踩著作 踩著作
+踩著名 踩著名
+踩著錄 踩著录
+踩著稱 踩著称
+踩著者 踩著者
+踩著述 踩著述
+身著 身着
+身著書 身著书
+身著作 身著作
+身著名 身著名
+身著錄 身著录
+身著稱 身著称
+身著者 身著者
+身著述 身著述
+躺著 躺着
+躺著書 躺著书
+躺著作 躺著作
+躺著名 躺著名
+躺著錄 躺著录
+躺著稱 躺著称
+躺著者 躺著者
+躺著述 躺著述
+轉著 转着
+轉著書 转著书
+轉著作 转著作
+轉著名 转著名
+轉著錄 转著录
+轉著稱 转著称
+轉著者 转著者
+轉著述 转著述
+載著 载着
+載著書 载著书
+載著作 载著作
+載著名 载著名
+載著錄 载著录
+載著稱 载著称
+載著者 载著者
+載著述 载著述
+達著 达着
+達著書 达著书
+達著作 达著作
+達著名 达著名
+達著錄 达著录
+達著稱 达著称
+達著者 达著者
+達著述 达著述
+遠著 远着
+遠著書 远著书
+遠著作 远著作
+遠著名 远著名
+遠著錄 远著录
+遠著稱 远著称
+遠著者 远著者
+遠著述 远著述
+連著 连着
+連著書 连著书
+連著作 连著作
+連著名 连著名
+連著錄 连著录
+連著稱 连著称
+連著者 连著者
+連著述 连著述
+追著 追着
+追著書 追著书
+追著作 追著作
+追著名 追著名
+追著錄 追著录
+追著稱 追著称
+追著者 追著者
+追著述 追著述
+逆著 逆着
+逆著書 逆著书
+逆著作 逆著作
+逆著名 逆著名
+逆著錄 逆著录
+逆著稱 逆著称
+逆著者 逆著者
+逆著述 逆著述
+逼著 逼着
+逼著書 逼著书
+逼著作 逼著作
+逼著名 逼著名
+逼著錄 逼著录
+逼著稱 逼著称
+逼著者 逼著者
+逼著述 逼著述
+遇著 遇着
+遇著書 遇著书
+遇著作 遇著作
+遇著名 遇著名
+遇著錄 遇著录
+遇著稱 遇著称
+遇著者 遇著者
+遇著述 遇著述
+配著 配着
+配著書 配著书
+配著作 配著作
+配著名 配著名
+配著錄 配著录
+配著稱 配著称
+配著者 配著者
+配著述 配著述
+釀著 酿着
+釀著書 酿著书
+釀著作 酿著作
+釀著名 酿著名
+釀著錄 酿著录
+釀著稱 酿著称
+釀著者 酿著者
+釀著述 酿著述
+鋪著 铺着
+鋪著書 铺著书
+鋪著作 铺著作
+鋪著名 铺著名
+鋪著錄 铺著录
+鋪著稱 铺著称
+鋪著者 铺著者
+鋪著述 铺著述
+閉著 闭着
+閉著書 闭著书
+閉著作 闭著作
+閉著名 闭著名
+閉著錄 闭著录
+閉著稱 闭著称
+閉著者 闭著者
+閉著述 闭著述
+閑著 闲着
+閑著書 闲著书
+閑著作 闲著作
+閑著名 闲著名
+閑著錄 闲著录
+閑著稱 闲著称
+閑著者 闲著者
+閑著述 闲著述
+附著 附着
+附著書 附著书
+附著作 附著作
+附著名 附著名
+附著錄 附著录
+附著稱 附著称
+附著者 附著者
+附著述 附著述
+陋著 陋着
+陋著書 陋著书
+陋著作 陋著作
+陋著名 陋著名
+陋著錄 陋著录
+陋著稱 陋著称
+陋著者 陋著者
+陋著述 陋著述
+陪著 陪着
+陪著書 陪著书
+陪著作 陪著作
+陪著名 陪著名
+陪著錄 陪著录
+陪著稱 陪著称
+陪著者 陪著者
+陪著述 陪著述
+隨著 随着
+隨著書 随著书
+隨著作 随著作
+隨著名 随著名
+隨著錄 随著录
+隨著稱 随著称
+隨著者 随著者
+隨著述 随著述
+隔著 隔着
+隔著書 隔著书
+隔著作 隔著作
+隔著名 隔著名
+隔著錄 隔著录
+隔著稱 隔著称
+隔著者 隔著者
+隔著述 隔著述
+雅著 雅着
+雅著書 雅著书
+雅著作 雅著作
+雅著名 雅著名
+雅著錄 雅著录
+雅著稱 雅著称
+雅著者 雅著者
+雅著述 雅著述
+頂著 顶着
+頂著書 顶著书
+頂著作 顶著作
+頂著名 顶著名
+頂著錄 顶著录
+頂著稱 顶著称
+頂著者 顶著者
+頂著述 顶著述
+順著 顺着
+順著書 顺著书
+順著作 顺著作
+順著名 顺著名
+順著錄 顺著录
+順著稱 顺著称
+順著者 顺著者
+順著述 顺著述
+領著 领着
+領著書 领著书
+領著作 领著作
+領著名 领著名
+領著錄 领著录
+領著稱 领著称
+領著者 领著者
+領著述 领著述
+飄著 飘着
+飄著書 飘著书
+飄著作 飘著作
+飄著名 飘著名
+飄著錄 飘著录
+飄著稱 飘著称
+飄著者 飘著者
+飄著述 飘著述
+駕著 驾着
+駕著書 驾著书
+駕著作 驾著作
+駕著名 驾著名
+駕著錄 驾著录
+駕著稱 驾著称
+駕著者 驾著者
+駕著述 驾著述
+罵著 骂着
+罵著書 骂著书
+罵著作 骂著作
+罵著名 骂著名
+罵著錄 骂著录
+罵著稱 骂著称
+罵著者 骂著者
+罵著述 骂著述
+騎著 骑着
+騎著書 骑著书
+騎著作 骑著作
+騎著名 骑著名
+騎著錄 骑著录
+騎著稱 骑著称
+騎著者 骑著者
+騎著述 骑著述
+騙著 骗着
+騙著書 骗著书
+騙著作 骗著作
+騙著名 骗著名
+騙著錄 骗著录
+騙著稱 骗著称
+騙著者 骗著者
+騙著述 骗著述
+高著 高着
+高著書 高著书
+高著作 高著作
+高著名 高著名
+高著錄 高著录
+高著稱 高著称
+高著者 高著者
+高著述 高著述
+髭著 髭着
+髭著書 髭著书
+髭著作 髭著作
+髭著名 髭著名
+髭著錄 髭著录
+髭著稱 髭著称
+髭著者 髭著者
+髭著述 髭著述
+黏著 黏着
+黏著書 黏著书
+黏著作 黏著作
+黏著名 黏著名
+黏著錄 黏著录
+黏著稱 黏著称
+黏著者 黏著者
+黏著述 黏著述
+護著 护着
+護著書 护著书
+護著作 护著作
+護著名 护著名
+護著錄 护著录
+護著稱 护著称
+護著者 护著者
+護著述 护著述
+保護著 保护着
+愛護著 爱护着
+庇護著 庇护着
+傳著 传着
+傳著書 传著书
+傳著作 传著作
+傳著名 传著名
+傳著錄 传著录
+傳著稱 传著称
+傳著者 传著者
+傳著述 传著述
+標誌著 标志着
+流露著 流露着
+靠著 靠着
+靠著作 靠著作
+靠著名 靠著名
+靠著錄 靠著录
+靠著稱 靠著称
+靠著者 靠著者
+靠著述 靠著述
+玩著 玩着
+迫著 迫着
+吃著 吃着
+聞著 闻着
+嗅著 嗅着
+警戒著 警戒着
+過著 过着
+過著作 过著作
+過著名 过著名
+過著錄 过著录
+過著稱 过著称
+過著者 过著者
+過著述 过著述
+下著 下着
+下著作 下著作
+下著名 下著名
+下著錄 下著录
+下著录 下著录
+下著稱 下著称
+下著称 下著称
+下著者 下著者
+下著述 下著述
+下著有 下著有
+放著 放着
+放著作 放著作
+放著名 放著名
+放著稱 放著称
+放著称 放著称
+藉著 借着
+显著 显著
+顯著 显著
+標誌著 标志着
+幹著 干着
+幹著名 幹著名
+幹著稱 幹著称
+穫著 获着
+閒著 闲着
+飃著 飘着
+沈著 沉着
+擡著 抬着
+著甚麽 着什么
+滿著 满着
+滿著名 满著名
+滿著作 满著作
+滿著者 满著者
+衝著 冲着
+沖著 冲着
+沖著《 冲著《
+沖著。 冲著。
+沖著, 冲著,
+繫著 系着
+颳著 刮着
+鬥著 斗着
+象徵著 象征着
+象徵著名 象征著名
+三十六著 三十六着
+走為上著 走为上着
記憶體 内存
-預設 默认
-串列 串行
-串列加速器 串列加速器
乙太網 以太网
點陣圖 位图
-常式 例程
-光碟 光盘
光碟機 光驱
-全形 全角
-載入 加载
-半形 半角
-變數 变量
雜訊 噪声
-因數 因子
功能變數名稱 域名
音效卡 声卡
字型大小 字号
字型檔 字库
欄位 字段
-字元 字符
-字元济 字元济
-字元濟 字元济
-字元会 字元会
-字元會 字元会
-存檔 存盘
-定址 寻址
-章節附註 尾注
非同步 异步
匯流排 总线
-括弧 括号
-介面 接口
+介面 界面
控制項 控件
-許可權 权限
-碟片 盘片
矽片 硅片
矽谷 硅谷
硬碟 硬盘
磁碟 磁盘
磁軌 磁道
程式控制 程控
-遠程控制 远程控制
-远程控制 远程控制
運算元 算子
演算法 算法
晶片 芯片
晶元 芯片
片語 词组
軟碟機 软驱
-快閃記憶體 快闪存储器
+快閃記憶體 闪存
滑鼠 鼠标
滑鼠蛇 滑鼠蛇
二進位 二进制
@@ -63,7 +2289,7 @@
滿八進位 满八进位
十進位 十进制
滿十進位 满十进位
-16進位 16进位
+16進位 16进制
滿16進位 满16进位
二進位制 二进位制
六進位制 六进位制
@@ -72,60 +2298,37 @@
16進位制 16进位制
互動式 交互式
優先順序 优先级
-感測 传感
攜帶型 便携式
資訊理論 信息论
迴圈 循环
-防寫 写保护
解析度 分辨率
伺服器 服务器
-等於 等于
區域網 局域网
巨集 宏
-掃瞄器 扫瞄仪
+掃瞄器 扫描仪
寬頻 宽带
資料庫 数据库
-萬曆 万历
-永曆 永历
-辭彙 词汇
母音 元音
-字母 字母
-頭槌 头球
-進球 入球
-顆進球 粒入球
-射門 打门
-蓋火鍋 火锅盖帽
印表機 打印机
-打印機 打印机
位元組 字节
-字節 字节
列印 打印
-打印 打印
硬體 硬件
二極體 二极管
-二極管 二极管
三極體 三极管
-三極管 三极管
軟體 软件
-軟件 软件
+軟體動物 软体动物
+軟體家具 软体家具
網路 网络
-網絡 网络
人工智慧 人工智能
太空梭 航天飞机
穿梭機 航天飞机
網際網路 互联网
-互聯網 互联网
機械人 机器人
-機器人 机器人
行動電話 移动电话
流動電話 移动电话
-調制解調器 调制解调器
數據機 调制解调器
-短訊 短信
-簡訊 短信
烏茲別克 乌兹别克斯坦
葉門 也门
-伯利茲 伯利兹
貝里斯 伯利兹
維德角 佛得角
克羅埃西亞 克罗地亚
@@ -158,19 +2361,15 @@
衣索比亞 埃塞俄比亚
吉里巴斯 基里巴斯
塔吉克 塔吉克斯坦
+塔吉克斯坦 塔吉克斯坦
塞拉利昂 塞拉利昂
塞普勒斯 塞浦路斯
塞席爾 塞舌尔
-多米尼克 多米尼加国
安地卡及巴布達 安提瓜和巴布达
-尼日利亞 尼日利亚
-尼日利亚 尼日利亚
奈及利亞 尼日利亚
尼日爾 尼日尔
-尼日尔 尼日尔
巴貝多 巴巴多斯
巴布亞紐幾內亞 巴布亚新几内亚
-布基納法索 布基纳法索
布吉納法索 布基纳法索
蒲隆地 布隆迪
帛琉 帕劳
@@ -190,20 +2389,15 @@
辛巴威 津巴布韦
宏都拉斯 洪都拉斯
千里達托貝哥 特立尼达和托巴哥
-諾魯 瑙鲁
萬那杜 瓦努阿图
溫納圖 瓦努阿图
葛摩 科摩罗
象牙海岸 科特迪瓦
突尼西亞 突尼斯
-索馬利亞 索马里
寮國 老挝
-肯雅 肯尼亚
-肯亞 肯尼亚
蘇利南 苏里南
莫三比克 莫桑比克
賴索托 莱索托
-貝南 贝宁
尚比亞 赞比亚
亞塞拜然 阿塞拜疆
阿拉伯聯合大公國 阿拉伯联合酋长国
@@ -211,65 +2405,305 @@
馬爾地夫 马尔代夫
馬爾他 马耳他
馬利共和國 马里共和国
-即食麵 方便面
-快速面 方便面
-速食麵 方便面
-泡麵 方便面
笨豬跳 蹦极跳
绑紧跳 蹦极跳
-冷盤 凉菜
-冷菜 凉菜
-散钱 零钱
-谐星 笑星
-夜学 夜校
-华乐 民乐
-中樂 民乐
-軍中樂園 军中乐园
-华乐街 华乐街
-屋价 房价
-計程車 出租车
-單車 自行车
-節慶 节日
-芝士 乾酪
狗隻 犬只
士多啤梨 草莓
忌廉 奶油
-桌球 台球
撞球 台球
-衞生 卫生
-衛生 卫生
賓士 奔驰
-平治 奔驰
-平治之亂 平治之乱
-平治之乱 平治之乱
積架 捷豹
-福斯 大众
-福士 大众
-萬事得 马自达
-寶獅 标志
-拿破崙 拿破仑
布殊 布什
-布希 布什
-布希亞 布希亚
-布希亚 布希亚
柯林頓 克林顿
-海珊 侯赛因
-梵谷 凡高
-大衛碧咸 大卫·贝克汉姆
-米高奧雲 迈克尔·欧文
-卡佩雅蒂 珍妮弗·卡普里亚蒂
-沙芬 马拉特·萨芬
-舒麥加 迈克尔·舒马赫
+梵谷 梵高
+碧咸 贝克汉姆
+米高·奧雲 迈克尔·欧文
+卡佩雅蒂 卡普里亚蒂
+舒麥加 舒马赫
希特拉 希特勒
黛安娜 戴安娜
-榴槤 榴莲
-榴梿 榴莲
-矽 硅
-矽肺 矽肺
-矽塵 矽尘
-矽尘 矽尘
-矽鋼 矽钢
-矽钢 矽钢
-侏儸紀 侏罗纪
-甚麽 什么
-甚麼 什么
+雷諾瓦 雷诺阿
+達文西 达芬奇
+達·文西 达·芬奇
+辛康納利 肖恩·康纳利
+維根斯坦 维特根斯坦
+索忍尼辛 索尔仁尼琴
+索贊尼辛 索尔仁尼琴
+蘇辛尼津 索尔仁尼琴
+皮雅斯·布士南 皮尔斯·布鲁斯南
+甘迺迪 肯尼迪
+梅赫西迪 梅赛德斯
+李奧納多 列奥那多
+普利茲 普利策
+戈巴契夫 戈尔巴乔夫
+德希達 德里达
+席哈克 希拉克
+蘿拉 劳拉
+史達林 斯大林
+史特勞斯 斯特劳斯
+卡斯楚 卡斯特罗
+占士邦 詹姆斯·邦德
+傅利葉 傅里叶
+伊莉莎白 伊丽莎白
+派屈克 帕特里克
+蒲美蓬 普密蓬
+畢卡索 毕加索
+蒲朗克 普朗克
+薛丁格 薛定谔
+克卜勒 开普勒
+都卜勒 多普勒
+邱吉爾 丘吉尔
+狄托 铁托
+查維茲 查韦斯
+班傑明 本杰明
+柯德莉·夏萍 奥黛丽·赫本
+華勒沙 瓦文萨
+華里沙 瓦文萨
+歐巴馬 奥巴马
+北韓 北朝鲜
+寮人民民主共和國 老挝人民民主共和国
+寮語 老挝语
+蘭卡威 浮罗交怡
+雷伊泰灣 莱特湾
+耶加達 雅加达
+伊斯蘭瑪巴德 伊斯兰堡
+喀拉蚩 卡拉奇
+葉里溫 埃里温
+提比里西 第比利斯
+巴斯拉 巴士拉
+杜拜 迪拜
+賽普勒斯 塞浦路斯
+荷姆茲 霍尔木兹
+加薩走廊 加沙地带
+西臺人 赫梯人
+西臺族 赫梯族
+西臺文 赫梯文
+西臺語 赫梯语
+西臺王 赫梯王
+西臺國 赫梯国
+西臺帝 赫梯帝
+坎培拉 堪培拉
+玻里尼西亞 波利尼西亚
+紐幾內亞 新几内亚
+強斯頓環礁 约翰斯顿岛
+帕邁拉環礁 巴尔米拉环礁
+萌島 马恩岛
+伯明罕 伯明翰
+威爾斯 威尔士
+諾曼第 诺曼底
+土魯斯 图卢兹
+坎城 戛纳
+羅亞爾 卢瓦尔
+艾菲爾 埃菲尔
+羅浮宮 卢浮宫
+安哈特 安哈尔特
+布蘭登堡 勃兰登堡
+什勒斯維希 石勒苏益格
+霍爾斯坦 荷尔斯泰因
+前波莫瑞 前波美拉尼亚
+威斯伐倫 威斯特法伦
+德勒斯登 德累斯顿
+杜塞道夫 杜塞尔多夫
+漢諾瓦 汉诺威
+柏林圍牆 柏林墙
+巴塞隆拿 巴塞罗那
+巴塞隆納 巴塞罗那
+西維爾 塞维利亚
+塞維亞 塞维利亚
+華倫西亞 巴伦西亚
+瓦倫西亞 巴伦西亚
+雅爾達 雅尔塔
+車諾比 切尔诺贝利
+馬斯垂克 马斯特里赫特
+波士尼亞 波斯尼亚
+塞拉耶佛 萨拉热窝
+貝爾格勒 贝尔格莱德
+蒙特內哥羅 黑山
+塞爾維亞與蒙特內哥羅 塞尔维亚和黑山
+伊斯坦堡 伊斯坦布尔
+庇里牛斯 比利牛斯
+亞斯文 阿斯旺
+厄立特里亞 厄立特里亚
+厄利垂亚 厄立特里亚
+亞歷山卓 亚历山大
+雅穆索戈 亚穆苏克罗
+畿內亞 几内亚
+索馬利蘭 索马里兰
+吉力馬札羅 乞力马扎罗
+索馬利亞 索马里
+金夏沙 金沙萨
+三蘭港 达累斯萨拉姆
+布隆泉 布隆方丹
+馬拉威 马拉维
+百慕達 百慕大
+三藩市 旧金山
+荷里活 好莱坞
+麻薩諸塞 马萨诸塞
+伊利諾 伊利诺伊
+伊利諾伊 伊利诺伊
+密执安 密歇根
+密西根 密歇根
+紐澤西 新泽西
+蒙特婁 蒙特利尔
+滿地可 蒙特利尔
+千里達及托巴哥 特立尼达和多巴哥
+千里達 特立尼达
+托巴哥 多巴哥
+多明尼加 多米尼加
+頻寬 带宽
+數位相機 数码相机
+單眼相機 单反相机
+單鏡反光機 单反相机
+韌體 固件
+唯讀 只读
+作業系統 操作系统
+外掛程式 插件
+電晶體 晶体管
+顯示卡 显卡
+主機板 主板
+網際網絡 互联网
+原始碼 源代码
+螢幕 屏幕
+螢屏 荧屏
+解像度 分辨率
+IP位址 IP地址
+IP 位址 IP 地址
+程式設計師 程序员
+公尺 米
+公升 升
+英吋 英寸
+英呎 英尺
+高畫質 高清
+飛彈 导弹
+電視影集 电视系列剧
+原子筆 圆珠笔
+智慧卡 智能卡
+鐵達尼號 泰坦尼克号
+轉殖 克隆
+空中巴士 空中客车
+電視劇集 电视剧
+狂牛症 疯牛病
+結他 吉他
+了結他 了结他
+連結他 连结他
+已開發國家 发达国家
+太空飛行員 宇航员
+太空衣 宇航服
+外部連結 外部链接
+網站連結 网站链接
+網頁連結 网页链接
+超連結 超链接
+動畫影集 系列动画片
+全球資訊網 万维网
+伊波拉 埃博拉
+C肝 丙肝
+C型肝炎 丙型肝炎
+B肝 乙肝
+B型肝炎 乙型肝炎
+A肝 甲肝
+A型肝炎 甲型肝炎
+錄影帶 录像带
+音樂錄影帶 音乐录影带
+健力士世界紀錄 吉尼斯世界纪录
+金氏世界紀錄 吉尼斯世界纪录
+祖雲達斯 尤文图斯
+若且唯若 当且仅当
+山葉 雅马哈
+複製人 克隆人
+白朗寧 勃朗宁
+形上學 形而上学
+藍芽 蓝牙
+槍枝 枪支
+掃瞄 扫描
+愛滋 艾滋
+正體中文 繁体中文
+智慧財產權 知识产权
+智財權 知识产权
+哥德式 哥特式
+芮氏0 里氏0
+芮氏1 里氏1
+芮氏2 里氏2
+芮氏3 里氏3
+芮氏4 里氏4
+芮氏5 里氏5
+芮氏6 里氏6
+芮氏7 里氏7
+芮氏8 里氏8
+芮氏9 里氏9
+芮氏規模 里氏震级
+芮氏地震規模 里氏地震规模
+黎克特制 里氏
+機率 概率
+行政總裁 首席执行官
+執行長, 首席执行官,
+執行長、 首席执行官、
+執行長。 首席执行官。
+財務長, 首席财务官,
+財務長、 首席财务官、
+財務長。 首席财务官。
+營運長, 首席运营官,
+營運長、 首席运营官、
+營運長。 首席运营官。
+智慧型 智能
+智慧手機 智能手机
+可攜式 便携式
+電腦程式 计算机程序
+應用程式 应用程序
+雷射 激光
+尖峰時間 高峰时间
+尖峰時段 高峰时段
+咖哩 咖喱
+東協 东盟
+亚细安 东盟
+大英國協 英联邦
+共和联邦 英联邦
+阿布達比 阿布扎比
+蓋曼群島 开曼群岛
+柴契爾 撒切尔
+戴卓爾 撒切尔
+凱薩琳 凯瑟琳
+嘉芙蓮 凯瑟琳
+孟德爾頌 门德尔松
+孟德爾遜 门德尔松
+蕭士塔高維奇 肖斯塔科维奇
+蕭士達高維契 肖斯塔科维奇
+工具機 机床
+空氣品質 空气质量
+空氣質素 空气质量
+伏地挺身 俯卧撑
+掌上壓 俯卧撑
+數位電視 数字电视
+數碼電視 数字电视
+數位技術 数字技术
+數碼技術 数字技术
+數位訊號 数字信号
+數碼訊號 数字信号
+行動網路 移动网络
+流動網絡 移动网络
+咪高峰 麦克风
+幫浦 泵
+電單車 摩托车
+演化論 进化论
+搜尋引擎 搜索引擎
+福馬林 福尔马林
+海洛英 海洛因
+赫魯雪夫 赫鲁晓夫
+公厘 毫米
+公釐 毫米
+海浬 海里
+森巴舞 桑巴舞
+喬治·歐威爾 乔治·奥威尔
+西元1 公元1
+西元2 公元2
+西元3 公元3
+西元4 公元4
+西元5 公元5
+西元6 公元6
+西元7 公元7
+西元8 公元8
+西元9 公元9
+西元前 公元前
+翁山蘇姬 昂山素季
+昂山素姬 昂山素季
+西洋棋 囯际象棋
+私隱 隐私 \ No newline at end of file
diff --git a/maintenance/language/zhtable/toHK.manual b/maintenance/language/zhtable/toHK.manual
index 1f7fe7d0..c31d2320 100644
--- a/maintenance/language/zhtable/toHK.manual
+++ b/maintenance/language/zhtable/toHK.manual
@@ -1,155 +1,582 @@
-” 」
-“ 「
-‘ 『
-’ 』
+裡 裏
鉤 鈎
-衛 衞
+檯 枱
+臥 卧
+醯 酰
+菸 煙
+汙 污
+溼 濕
+硅 矽
+計畫 計劃
+吧台 吧枱
+坐台 坐枱
+妆台 妝枱
+弹珠台 彈珠枱
+折台 摺枱
+台布 枱布
+台历 枱曆
+台灯 枱燈
+写字台 寫字枱
+工作台 工作枱
+弹子台 彈子枱
+台面上 枱面上
+柜台 櫃枱
+球台 球枱
+赌台 賭枱
+办公台 辦公枱
+餐台 餐枱
凶殺 兇殺
凶殘 兇殘
+凶惡 兇惡
緝凶 緝兇
買凶 買兇
-印表機 打印機
-字节 位元組
-字節 位元組
-列印 打印
-硬件 硬件
-硬體 硬件
-二極體 二極管
-三極體 三極管
-軟體 軟件
-網路 網絡
-人工智慧 人工智能
-航天飞机 穿梭機
-太空梭 穿梭機
-因特网 互聯網
-網際網路 互聯網
-机器人 機械人
-機器人 機械人
-移动电话 流動電話
-行動電話 流動電話
-數據機 調制解調器
-短信 短訊
-簡訊 短訊
-查德 乍得
-葉門 也門
-貝里斯 伯利茲
-維德角 佛得角
-克羅埃西亞 克羅地亞
-甘比亞 岡比亞
-幾內亞比索 幾內亞比紹
-列支敦斯登 列支敦士登
-賴比瑞亞 利比里亞
-迦納 加納
-加彭 加蓬
-波札那 博茨瓦納
-盧安達 盧旺達
-瓜地馬拉 危地馬拉
-厄瓜多尔 厄瓜多爾
-厄瓜多爾 厄瓜多爾
-厄瓜多 厄瓜多爾
-厄利垂亞 厄立特里亞
-吉布地 吉布堤
-哥斯大黎加 哥斯達黎加
-吐瓦魯 圖瓦盧
-聖露西亞 聖盧西亞
-圣基茨和尼维斯 聖吉斯納域斯
-聖克里斯多福及尼維斯 聖吉斯納域斯
-聖文森及格瑞那丁 聖文森特和格林納丁斯
-聖馬利諾 聖馬力諾
-蓋亞那 圭亞那
-坦尚尼亞 坦桑尼亞
-衣索匹亞 埃塞俄比亞
-衣索比亞 埃塞俄比亞
-吉里巴斯 基里巴斯
-塞普勒斯 塞浦路斯
-塞席爾 塞舌爾
-安地卡及巴布達 安提瓜和巴布達
-尼日利亚 尼日利亞
-尼日利亞 尼日利亞
-奈及利亞 尼日利亞
-尼日尔 尼日爾
-尼日爾 尼日爾
-尼日 尼日爾
-巴貝多 巴巴多斯
-巴布亞紐幾內亞 巴布亞新畿內亞
-布吉納法索 布基納法索
-蒲隆地 布隆迪
-帕劳 帛琉
-義大利 意大利
-索羅門群島 所羅門群島
-文莱 汶萊
-史瓦濟蘭 斯威士蘭
-斯洛維尼亞 斯洛文尼亞
-紐西蘭 新西蘭
-格瑞那達 格林納達
-茅利塔尼亞 毛里塔尼亞
-毛里求斯 毛里裘斯
-模里西斯 毛里裘斯
-沙地阿拉伯 沙特阿拉伯
-沙烏地阿拉伯 沙特阿拉伯
-波士尼亞赫塞哥維納 波斯尼亞黑塞哥維那
-辛巴威 津巴布韋
-宏都拉斯 洪都拉斯
-千里達托貝哥 特立尼達和多巴哥
-諾魯 瑙魯
-萬那杜 瓦努阿圖
-葛摩 科摩羅
-索馬利亞 索馬里
-寮國 老撾
-肯尼亚 肯雅
-肯亞 肯雅
-莫三比克 莫桑比克
-賴索托 萊索托
-貝南 貝寧
-尚比亞 贊比亞
-亞塞拜然 阿塞拜疆
-阿拉伯聯合大公國 阿拉伯聯合酋長國
-馬爾地夫 馬爾代夫
-馬利共和國 馬里共和國
-方便面 即食麵
-快速面 即食麵
-速食麵 即食麵
-泡麵 即食麵
-土豆 馬鈴薯
-土豆网 土豆網
-土豆網 土豆網
-华乐 中樂
-民乐 中樂
-計程車 的士
-出租车 的士
-公車 巴士
-公車上書 公車上書
-自行车 單車
-犬只 狗隻
-台球 桌球
-撞球 桌球
-冰淇淋 雪糕
-賓士 平治
-捷豹 積架
-福斯 福士
-雪铁龙 先進
-雪鐵龍 先進
-沃尓沃 富豪
-马自达 萬事得
-馬自達 萬事得
-寶獅 標致
-布什 布殊
-布希 布殊
-布希亞 布希亞
-布希亚 布希亞
-柯林頓 克林頓
-萨达姆 薩達姆
-海珊 侯賽因
-大卫·贝克汉姆 大衛碧咸
-迈克尔·欧文 米高奧雲
-珍妮弗·卡普里亚蒂 卡佩雅蒂
-马拉特·萨芬 沙芬
-迈克尔·舒马赫 舒麥加
-希特勒 希特拉
-狄安娜 戴安娜
-黛安娜 戴安娜
颁布 頒佈
頒布 頒佈
+发布 發佈
+發布 發佈
+秀发布 秀發佈
+并发布 並發佈
+分布 分佈
+宣布 宣佈
+公布 公佈
+摆布 擺佈
+擺布 擺佈
+遍布 遍佈
+散布 散佈
+密布 密佈
+布于 佈於
+布於 佈於
+布道 佈道
+布置 佈置
+布景 佈景
+布光 佈光
+布局 佈局
+布防 佈防
+布施 佈施
+布满 佈滿
+布滿 佈滿
+布告 佈告
+布阵 佈陣
+布陣 佈陣
+布点 佈點
+布點 佈點
+布警 佈警
+布控 佈控
+布设 佈設
+布設 佈設
+布展 佈展
+布下了 佈下了
+布下的 佈下的
+星罗棋布 星羅棋佈
+星羅棋布 星羅棋佈
+开诚布公 開誠佈公
+開誠布公 開誠佈公
+空投布雷 空投佈雷
+火箭布雷 火箭佈雷
+海湾布雷 海灣佈雷
+海灣布雷 海灣佈雷
+空中布雷 空中佈雷
+海上布雷 海上佈雷
+布雷的 佈雷的
+布雷, 佈雷,
+布雷、 佈雷、
+布雷。 佈雷。
+布雷; 佈雷;
+布雷舰 佈雷艦
+布雷艦 佈雷艦
+布雷艇 佈雷艇
+布雷速度 佈雷速度
+布雷封锁 佈雷封鎖
+布雷封鎖 佈雷封鎖
+准将 準將
+准將 準將
+准尉 準尉
+迭代 疊代
+彩排 綵排
+彩带 綵帶
+彩帶 綵帶
+彩楼 綵樓
+彩樓 綵樓
+彩牌楼 綵牌樓
+彩牌樓 綵牌樓
+彩球 綵球
+彩绸 綵綢
+彩綢 綵綢
+彩线 綵綫
+彩線 綵線
+彩船 綵船
+彩衣 綵衣
+结彩 結綵
+結彩 結綵
+戏彩娱亲 戲綵娛親
+戲彩娛親 戲綵娛親
+剪彩 剪綵
+占上风 佔上風
+占上風 佔上風
+占下 佔下
+占位 佔位
+占住 佔住
+占占 佔佔
+占便宜 佔便宜
+占个 佔個
+占個 佔個
+占先 佔先
+占光 佔光
+占到 佔到
+占取 佔取
+占在 佔在
+占地 佔地
+占好 佔好
+占得 佔得
+占掉 佔掉
+占据 佔據
+占據 佔據
+占有 佔有
+占满 佔滿
+占滿 佔滿
+占为 佔為
+占為 佔為
+占用 佔用
+占毕 佔畢
+占畢 佔畢
+占尽 佔盡
+占盡 佔盡
+占线 佔線
+占線 佔線
+占起 佔起
+占过 佔過
+占過 佔過
+占领 佔領
+占領 佔領
+占头筹 佔頭籌
+占頭籌 佔頭籌
+占高枝 佔高枝
+侵占 侵佔
+先占 先佔
+分占 分佔
+只占 只佔
+强占 強佔
+強占 強佔
+抢占 搶佔
+搶占 搶佔
+攻占 攻佔
+照占 照佔
+约占 約佔
+約占 約佔
+连占 連佔
+連占 連佔
+进占 進佔
+進占 進佔
+还占 還佔
+還占 還佔
+隐占 隱佔
+隱占 隱佔
+霸占 霸佔
+鸠占 鳩佔
+鳩占 鳩佔
+割占 割佔
+非占不可 非佔不可
+占1 佔1
+占2 佔2
+占3 佔3
+占4 佔4
+占5 佔5
+占6 佔6
+占7 佔7
+占8 佔8
+占9 佔9
+占0 佔0
+占零 佔零
+占〇 佔〇
+占一 佔一
+占二 佔二
+占两 佔兩
+占兩 佔兩
+占三 佔三
+占四 佔四
+占五 佔五
+占六 佔六
+占七 佔七
+占八 佔八
+占九 佔九
+占十 佔十
+占百 佔百
+占千 佔千
+占万 佔萬
+占萬 佔萬
+占亿 佔億
+占億 佔億
+占超过 佔超過
+占超過 佔超過
+占不足 佔不足
+占至少 佔至少
+占少 佔少
+占至多 佔至多
+占半 佔半
+占多 佔多
+占大 佔大
+占小 佔小
+占中 佔中
+占东 佔東
+占東 佔東
+占西 佔西
+占南 佔南
+占北 佔北
+占平均 佔平均
+占总 佔總
+占總 佔總
+独占 獨佔
+獨占 獨佔
+所占 所佔
+市占 市佔
+占率 佔率
+占市 佔市
+占世界 佔世界
+占全 佔全
+占国 佔國
+占國 佔國
+占国桥 占國橋
+占國橋 占國橋
+占美 佔美
+占台 佔台
+占臺 佔臺
+占香 佔香
+占澳 佔澳
+占加 佔加
+占新 佔新
+占马 佔馬
+占馬 佔馬
+占印 佔印
+占英 佔英
+占法 佔法
+占德 佔德
+占葡 佔葡
+占俄 佔俄
+占苏 佔蘇
+占蘇 佔蘇
+占缺 佔缺
+占A 佔A
+占B 佔B
+占C 佔C
+占D 佔D
+占E 佔E
+占F 佔F
+占G 佔G
+占H 佔H
+占I 佔I
+占J 佔J
+占K 佔K
+占L 佔L
+占M 佔M
+占N 佔N
+占O 佔O
+占P 佔P
+占Q 佔Q
+占R 佔R
+占S 佔S
+占T 佔T
+占U 佔U
+占V 佔V
+占W 佔W
+占X 佔X
+占Y 佔Y
+占Z 佔Z
+占不占 佔不佔
+不占 不佔
+占了 佔了
+占资 佔資
+占資 佔資
+占人便宜 佔人便宜
+占主要 佔主要
+占所有 佔所有
+占头 佔頭
+占頭 佔頭
+占道 佔道
+占屋 佔屋
+占网 佔網
+占網 佔網
+占床 佔床
+占座 佔座
+占分 佔分
+占个位 佔個位
+占個位 佔個位
+占後 佔後
+占山为 佔山為
+占山為 佔山為
+占比 佔比
+占下風 佔下風
+占下风 佔下風
+少占 少佔
+多占 多佔
+费占 費佔
+費占 費佔
+占查 佔查
+占压 佔壓
+占壓 佔壓
+占优 佔優
+占優 佔優
+占劣 佔劣
+稳占 穩佔
+穩占 穩佔
+占整 佔整
+占局部 佔局部
+日占 日佔
+美占 美佔
+英占 英佔
+德占 德佔
+法占 法佔
+俄占 俄佔
+葡占 葡佔
+西占 西佔
+奥占 奧佔
+奧占 奧佔
+意占 意佔
+義占 意佔
+地占 地佔
+占场 佔場
+占場 佔場
+占耕 佔耕
+狂占 狂佔
+征占 徵佔
+徵占 徵佔
+圈占 圈佔
+已占 已佔
+占囁 佔囁
+占主 佔主
+占次 佔次
+寡占 寡佔
+占去 佔去
+将占 將佔
+將占 將佔
+将占卜 將占卜
+將占卜 將占卜
+要占 要佔
+要占卜 要占卜
+会占 會佔
+會占 會佔
+会占卜 會占卜
+會占卜 會占卜
+占卜 占卜
+梦有五不占 夢有五不占
+夢有五不占 夢有五不占
+占有五不 占有五不
+吞占 吞佔
+一地里 一地裏
+一年里 一年裏
+中文里 中文裏
+事里 事裏
+井里 井裏
+作品里 作品裏
+个里 個裏
+假里 假裏
+傻里傻气 傻裏傻氣
+丛林里 叢林裏
+口里 口裏
+吃里扒外 吃裏扒外
+吃里爬外 吃裏爬外
+呆里呆气 呆裏呆氣
+哪里 哪裏
+嘴里 嘴裏
+圈里 圈裏
+园里 園裏
+土里 土裏
+坑里 坑裏
+城里 城裏
+域里 域裏
+场里 場裏
+壶里 壺裏
+夜里 夜裏
+梦里 夢裏
+天里 天裏
+子里 子裏
+字里行间 字裏行間
+学里 學裏
+宫里 宮裏
+家里 家裏
+宝里宝气 寶裏寶氣
+封面里 封面裏
+专辑里 專輯裏
+就里 就裏
+局里 局裏
+屋里 屋裏
+屯里 屯裏
+巷里 巷裏
+市里 市裏
+年代里 年代裏
+年里 年裏
+店里 店裏
+庙里 廟裏
+往里 往裏
+从里到外 從裏到外
+从里向外 從裏向外
+心里面 心裏面
+心里 心裏
+忙里 忙裏
+怪里怪气 怪裏怪氣
+慌里慌张 慌裏慌張
+怀里 懷裏
+戏里 戲裏
+房里 房裏
+手里 手裏
+手里剑 手裏劍
+族里 族裏
+日里 日裏
+暗地里 暗地裏
+暗沟里 暗溝裏
+暗里 暗裏
+会里 會裏
+村里 村裏
+森林里 森林裏
+棺材里 棺材裏
+树林里 樹林裏
+历史里 歷史裏
+死里求生 死裏求生
+死里逃生 死裏逃生
+壳里 殼裏
+水来汤里去 水來湯裏去
+水里 水裏
+池里 池裏
+沙里淘金 沙裏淘金
+河里 河裏
+洞里 洞裏
+渊里 淵裏
+湖里 湖裏
+漠里 漠裏
+潜意识里 潛意識裏
+潭里 潭裏
+墙里 牆裏
+狱里 獄裏
+班里 班裏
+田里 田裏
+由表及里 由表及裏
+界里 界裏
+白里透红 白裏透紅
+百科里 百科裏
+皮里春秋 皮裏春秋
+皮里阳秋 皮裏陽秋
+盒里 盒裏
+盘里 盤裏
+眼眶里 眼眶裏
+眼睛里 眼睛裏
+眼里 眼裏
+社里 社裏
+私下里 私下裏
+窝里 窩裏
+笑里藏刀 笑裏藏刀
+箱里 箱裏
+节目里 節目裏
+糊里糊涂 糊裏糊塗
+系列里 系列裏
+系里 系裏
+组里 組裏
+网里 網裏
+县里 縣裏
+缝里 縫裏
+肚里 肚裏
+胃里 胃裏
+背地里 背地裏
+胡里胡涂 胡裏胡塗
+腰里 腰裏
+花盆里 花盆裏
+苑里 苑裏
+苦里 苦裏
+草丛里 草叢裏
+庄里 莊裏
+葫芦里卖甚么药 葫蘆裏賣甚麼藥
+蜜里调油 蜜裏調油
+表里 表裏
+表里一致 表裏一致
+表里不一 表裏不一
+表里如一 表裏如一
+表里山河 表裏山河
+袋里 袋裏
+袖里 袖裏
+被里 被裏
+里勾外连 裏勾外連
+里手 裏手
+里海 裏海
+里屋 裏屋
+里层 裏層
+里带 裏帶
+里弦 裏弦
+里应外合 裏應外合
+里脊 裏脊
+里衣 裏衣
+里通外国 裏通外國
+里通外敌 裏通外敵
+里边 裏邊
+里间 裏間
+里面 裏面
+里面包 裏面包
+里头 裏頭
+衬里 襯裏
+角落里 角落裏
+话里有话 話裏有話
+车库里 車庫裏
+车站里 車站裏
+车里 車裏
+车里雅宾斯克 車里雅賓斯克
+这里 這裏
+邋里邋遢 邋裏邋遢
+那里 那裏
+金装玉里 金裝玉裏
+钟在寺里 鐘在寺裏
+门里 門裏
+间里 間裏
+院里 院裏
+阴沟里翻船 陰溝裏翻船
+集里 集裏
+鸡蛋里挑骨头 雞蛋裏挑骨頭
+雪里 雪裏
+雾里 霧裏
+鞋里 鞋裏
+鞭辟入里 鞭辟入裏
+头里 頭裏
+风里 風裏
+馆里 館裏
+点里 點裏
+点里程 點里程
+鼓里 鼓裏
+世纪里 世紀裏
+夜晚里 夜晚裏
+参数里 參數裏
+集数里 集數裏
+人数里 人數裏
+总数里 總數裏
+函数里 函數裏
+地图里 地圖裏
+版图里 版圖裏
+配图里 配圖裏
+路图里 路圖裏
+线图里 線圖裏
+幅图里 幅圖裏
+镜图里 鏡圖裏
+从图里 從圖裏
+的图里 的圖裏
+图里的 圖裏的
+图里, 圖裏,
+深山里 深山裏
+冰山里 冰山裏
+火山里 火山裏
+在山里 在山裏
+的山里 的山裏
+到山里 到山裏
+去山里 去山裏
+从山里 從山裏
+山里的 山裏的
+山里有 山裏有
+棉里 棉裏
+语里 語裏
+方法里 方法裏
+语法里 語法裏
+看法里 看法裏
+宪法里 憲法裏
+用法里 用法裏
+法里, 法裏,
+苑裡 苑裡
+霄裡 霄裡
+岸裡 岸裡
+裡冷 裡冷
挨著 挨着
愛著 愛着
暗著 暗着
@@ -197,6 +624,7 @@
定著 定着
動著 動着
鬥著 鬥着
+斗着 鬥着
獨著 獨着
對著 對着
盾著 盾着
@@ -222,7 +650,6 @@
揮著 揮着
活著 活着
獲著 獲着
-獲著 獲着
急著 急着
記著 記着
冀著 冀着
@@ -233,7 +660,6 @@
叫著 叫着
接著 接着
借著 借着
-借著 借着
據著 據着
開著 開着
看得著 看得着
@@ -298,7 +724,6 @@
潤著 潤着
燒著 燒着
身著 身着
-沉著 沉着
盛著 盛着
試著 試着
守著 守着
@@ -365,6 +790,14 @@
在著 在着
紮著 紮着
展著 展着
+占着 佔着
+占著 佔着
+占著作 占著作
+占著者 佔著者
+占著名 佔著名
+占著述 占著述
+占著稱 占著稱
+占著錄 占著錄
站著 站着
戰著 戰着
蘸著 蘸着
@@ -378,7 +811,7 @@
爭著 爭着
掙著 掙着
制著 制着
-志著 志着
+標志著 標志着
皺著 皺着
住著 住着
抓著 抓着
@@ -401,6 +834,7 @@
寫著 寫着
遇著 遇着
殺著 殺着
+驶著 驶着
著筆 着筆
著鞭 着鞭
著法 着法
@@ -421,7 +855,7 @@
著妳 着妳
著你 着你
著色 着色
-著什麼急 着什麼急
+著什 着什
著實 着實
著手 着手
著數 着數
@@ -435,7 +869,6 @@
著衣 着衣
著意 着意
著重 着重
-著重 着重
著裝 着裝
著地 着地
不著邊際 不着邊際
@@ -928,13 +1361,6 @@
獲著稱 獲著稱
獲著錄 獲著錄
獲著書 獲著書
-獲著作 獲著作
-獲著者 獲著者
-獲著名 獲著名
-獲著述 獲著述
-獲著稱 獲著稱
-獲著錄 獲著錄
-獲著書 獲著書
急著作 急著作
急著者 急著者
急著名 急著名
@@ -1004,13 +1430,6 @@
借著稱 借著稱
借著錄 借著錄
借著書 借著書
-借著作 借著作
-借著者 借著者
-借著名 借著名
-借著述 借著述
-借著稱 借著稱
-借著錄 借著錄
-借著書 借著書
據著作 據著作
據著者 據著者
據著名 據著名
@@ -1440,13 +1859,6 @@
身著稱 身著稱
身著錄 身著錄
身著書 身著書
-沉著作 沉著作
-沉著者 沉著者
-沉著名 沉著名
-沉著述 沉著述
-沉著稱 沉著稱
-沉著錄 沉著錄
-沉著書 沉著書
盛著作 盛著作
盛著者 盛著者
盛著名 盛著名
@@ -1747,6 +2159,8 @@
因著稱 因著稱
因著錄 因著錄
因著書 因著書
+因著《 因著《
+因著〈 因著〈
印著作 印著作
印著者 印著者
印著名 印著名
@@ -2097,6 +2511,8 @@
殺著書 殺著書
標誌著 標誌着
幹著 幹着
+幹著名 幹著名
+幹著稱 幹著稱
干着 幹着
干着急 干着急
流露著 流露着
@@ -2109,9 +2525,8 @@
靠著称 靠著稱
靠著者 靠著者
靠著述 靠著述
-新著龍虎門 新著龍虎門
迫著 迫着
-心繫著 心繫着
+繫著 繫着
藉著 藉着
吃得著 吃得着
吃不著 吃不着
@@ -2123,16 +2538,101 @@
嗅不著 嗅不着
嗅著 嗅着
警戒著 警戒着
+過著 過着
+過著作 當著作
+過著者 當著者
+過著名 當著名
+過著述 當著述
+過著稱 當著稱
+過著錄 當著錄
+過著書 當著書
+穫著 穫着
+閒著 閒着
+飃著 飃着
+沈著 沈着
+竪著 竪着
+擡著 擡着
+沖著 沖着
+沖著《 沖著《
+沖著。 沖著。
+沖著, 沖著,
+衝著 衝着
+著甚麽 着甚麽
+存著 存着
+存著名 存著名
+劃著 劃着
+別著 別着
+刮著 刮着
+掛著 掛着
+吊著 吊着
+回著 回着
+回著名 回著名
+塗著 塗着
+麼著 麼着
+擔著 擔着
+負著 負着
+板著臉 板着臉
+為著 為着
+為著作 為著作
+為著名 為著名
+為著錄 為著錄
+為著稱 為著稱
+為著者 為著者
+為著述 為著述
+為著《 為著《
+畫著 畫着
+畫著作 畫著作
+畫著名 畫著名
+畫著稱 畫著稱
+畫著者 畫著者
+發著 發着
+發著作 發著作
+發著名 發著名
+發著稱 發著稱
+發著者 發著者
+發著《 發著《
+簽著 簽着
+繃著 繃着
+覆著 覆着
+蓋著 蓋着
+說著 說着
+說著作 說著作
+說著稱 說著稱
+說著者 說著者
+說著述 說著述
+象徵著 象著着
+象徵著名 象徵著名
+湊合著 湊合着
+配合著 配合着
+配合著名 配合著名
+關係著 關係着
+下著 下着
+下著作 下著作
+下著名 下著名
+下著录 下著錄
+下著錄 下著錄
+下著称 下著稱
+下著稱 下著稱
+下著者 下著者
+下著述 下著述
+下著有 下著有
+放著 放着
+放著作 放著作
+放著名 放著名
+放著稱 放著稱
+放著称 放著稱
+三十六著 三十六着
+走為上著 走為上着
+鬧著 鬧着
+悶著 悶着
+呆著 呆着
+包著 包着
+系着 繫着
+颳著 颳着
榴莲 榴槤
榴蓮 榴槤
-发布 發佈
-發布 發佈
-掛鉤 掛鈎
-鉤心鬥角 鈎心鬥角
-咤 咤
叱吒 叱咤
-叱咤 叱咤
-醯 酰
+嘯吒 嘯咤
醯醬 醯醬
醯雞 醯雞
醯酱 醯醬
@@ -2141,160 +2641,404 @@
醯醢 醯醢
醯壶 醯壺
醯壺 醯壺
-菸 煙
-雪裡紅 雪裏紅
-雪裡蕻 雪裏蕻
-雪里蕻 雪裏蕻
-雪里红 雪裏紅
-森林裡 森林裏
-森林里 森林裏
-日子裡 日子裏
-日子里 日子裏
-故事裡 故事裏
-故事里 故事裏
-領域裡 領域裏
-领域里 領域裏
-時間裡 時間裏
-时间里 時間裏
-深淵裡 深淵裏
-深渊里 深渊裏
-醫院裡 醫院裏
-医院里 医院裏
-春假裡 春假裏
-春假里 春假裏
-暑假裡 暑假裏
-暑假里 暑假裏
-秋假裡 秋假裏
-秋假里 秋假裏
-寒假裡 寒假裏
-寒假里 寒假裏
-春天裡 春天裏
-春天里 春天裏
-夏天裡 夏天裏
-夏天里 夏天裏
-秋天裡 秋天裏
-秋天里 秋天裏
-冬天裡 冬天裏
-冬天里 冬天裏
-春日裡 春日裏
-夏日裡 夏日裏
-秋日裡 秋日裏
-冬日裡 冬日裏
-春日里 春日裏
-夏日里 夏日裏
-秋日里 秋日裏
-冬日里 冬日裏
-嘴裡 嘴裏
-嘴里 嘴裏
-心裡 心裏
-心里 心裏
-皮裡陽秋 皮裏陽秋
-皮里阳秋 皮裏陽秋
-肚裡 肚裏
-肚里 肚裏
-苦裡 苦裏
-苦里 苦裏
-裡勾外連 裏勾外連
-里勾外连 裏勾外連
-裡面 裏面
-里面 裏面
-這裡 這裏
-這里 這裏
-點裡 點裏
-点里 點裏
-中文裡 中文裏
-中文里 中文裏
-山洞里 山洞裏
-山洞裡 山洞裏
-近角聪信 近角聰信
-近角聰信 近角聰信
-世界里 世界裏
-世界裡 世界裏
-眼睛里 眼睛裏
-眼睛裡 眼睛裏
-百科裡 百科裏
-百科里 百科裏
-歷史裡 歷史裏
-历史里 歷史裏
-戲裡 戲裏
-戏里 戲裏
-作品裡 作品裏
-作品里 作品裏
-專輯裡 專輯裏
-专辑里 專輯裏
-年代裡 年代裏
-年代里 年代裏
-棺材裡 棺材裏
-棺材里 棺材裏
-學裡 學裏
-学里 學裏
-獄裡 獄裏
-狱里 獄裏
-館裡 館裏
-馆里 館裏
-系列裡 系列裏
-系列里 系列裏
-村子裡 村子裏
-村子里 村子裏
-分布 分佈
-分布于 分佈於
-分布於 分佈於
想象 想像
-無線電視 無綫電視
-无线电视 無綫電視
-無線收費 無綫收費
-无线收费 無綫收費
-無線節目 無綫節目
-无线节目 無綫節目
-無線劇集 無綫劇集
-无线剧集 無綫劇集
-東鐵線 東鐵綫
-东铁线 東鐵綫
-觀塘線 觀塘綫
-观塘线 觀塘綫
-荃灣線 荃灣綫
-荃湾线 荃灣綫
-港島線 港島綫
-港岛线 港島綫
-東涌線 東涌綫
-东涌线 東涌綫
-將軍澳線 將軍澳綫
-将军澳线 將軍澳綫
-西鐵線 西鐵綫
-西铁线 西鐵綫
-馬鞍山線 馬鞍山綫
-马鞍山线 馬鞍山綫
-迪士尼線 迪士尼綫
-迪士尼线 迪士尼綫
-沙田至中環線 沙田至中環綫
-沙田至中环线 沙田至中環綫
-沙中線 沙中綫
-沙中线 沙中綫
-北環線 北環綫
-北环线 北環綫
-機場快線 機場快綫
-机场快线 機場快綫
-505線 505綫
-505线 505綫
-507線 507綫
-507线 507綫
-610線 610綫
-610线 610綫
-614線 614綫
-614线 614綫
-614P線 614P綫
-614P线 614P綫
-615線 615綫
-615线 615綫
-615P線 615P綫
-615P线 615P綫
-705線 705綫
-705线 705綫
-706線 706綫
-706线 706綫
-751線 751綫
-751线 751綫
-751P線 751P綫
-751P线 751P綫
-761P線 761P綫
-761P线 761P綫
+係數 系數
+澈底 徹底
+雇员 僱員
+雇用 僱用
+糊口 餬口
+倒楣 倒霉
+径庭 逕庭
+径到 逕到
+径取 逕取
+径入 逕入
+径行 逕行
+径自 逕自
+径往 逕往
+径寄 逕寄
+径启 逕啟
+径迎 逕迎
+印表機 打印機
+字节 位元組
+字節 位元組
+列印 打印
+硬件 硬件
+硬體 硬件
+二極體 二極管
+三極體 三極管
+軟體 軟件
+軟體動物 軟體動物
+軟體家具 軟體家具
+網路 網絡
+人工智慧 人工智能
+航天飞机 穿梭機
+太空梭 穿梭機
+因特网 互聯網
+網際網路 互聯網
+机器人 機械人
+機器人 機械人
+移动电话 流動電話
+行動電話 流動電話
+數據機 調制解調器
+短信 短訊
+簡訊 短訊
+葉門 也門
+貝里斯 伯利茲
+維德角 佛得角
+克羅埃西亞 克羅地亞
+甘比亞 岡比亞
+幾內亞比索 幾內亞比紹
+列支敦斯登 列支敦士登
+賴比瑞亞 利比里亞
+迦納 加納
+加彭 加蓬
+波札那 博茨瓦納
+盧安達 盧旺達
+瓜地馬拉 危地馬拉
+厄瓜多尔 厄瓜多爾
+厄瓜多爾 厄瓜多爾
+厄瓜多 厄瓜多爾
+厄利垂亞 厄立特里亞
+吉布地 吉布堤
+哥斯大黎加 哥斯達黎加
+吐瓦魯 圖瓦盧
+聖露西亞 聖盧西亞
+圣基茨和尼维斯 聖吉斯納域斯
+聖克里斯多福及尼維斯 聖吉斯納域斯
+聖文森及格瑞那丁 聖文森特和格林納丁斯
+聖馬利諾 聖馬力諾
+蓋亞那 圭亞那
+坦尚尼亞 坦桑尼亞
+衣索匹亞 埃塞俄比亞
+衣索比亞 埃塞俄比亞
+吉里巴斯 基里巴斯
+塞普勒斯 塞浦路斯
+塞席爾 塞舌爾
+安地卡及巴布達 安提瓜和巴布達
+巴貝多 巴巴多斯
+巴布亞紐幾內亞 巴布亞新畿內亞
+布吉納法索 布基納法索
+蒲隆地 布隆迪
+帕劳 帛琉
+義大利 意大利
+索羅門群島 所羅門群島
+文莱 汶萊
+史瓦濟蘭 斯威士蘭
+斯洛維尼亞 斯洛文尼亞
+紐西蘭 新西蘭
+格瑞那達 格林納達
+茅利塔尼亞 毛里塔尼亞
+毛里求斯 毛里裘斯
+模里西斯 毛里裘斯
+沙地阿拉伯 沙特阿拉伯
+沙烏地阿拉伯 沙特阿拉伯
+波士尼亞赫塞哥維納 波斯尼亞黑塞哥維那
+辛巴威 津巴布韋
+宏都拉斯 洪都拉斯
+千里達托貝哥 特立尼達和多巴哥
+萬那杜 瓦努阿圖
+葛摩 科摩羅
+寮國 老撾
+肯尼亚 肯雅
+莫三比克 莫桑比克
+賴索托 萊索托
+尚比亞 贊比亞
+亞塞拜然 阿塞拜疆
+阿拉伯聯合大公國 阿拉伯聯合酋長國
+馬爾地夫 馬爾代夫
+馬利共和國 馬里共和國
+台球 桌球
+撞球 桌球
+冰淇淋 雪糕
+賓士 平治
+捷豹 積架
+雪铁龙 先進
+雪鐵龍 先進
+沃尓沃 富豪
+马自达 萬事得
+馬自達 萬事得
+寶獅 標致
+布什 布殊
+柯林頓 克林頓
+萨达姆 薩達姆
+贝克汉姆 碧咸
+贝克漢 碧咸
+迈克尔·欧文 米高·奧雲
+卡普里亚蒂 卡佩雅蒂
+马拉特·萨芬 馬拉特·沙芬
+舒马赫 舒麥加
+希特勒 希特拉
+狄安娜 戴安娜
+黛安娜 戴安娜
+南朝鲜 南韓
+北朝鲜 北韓
+寮語 老撾語
+寮人民民主共和國 老撾人民民主共和國
+莱特湾 雷伊泰灣
+萊特灣 雷伊泰灣
+蘭卡威 浮羅交怡
+吉尔吉斯斯坦 吉爾吉斯
+撒马尔罕 撒馬爾罕
+伊斯蘭瑪巴德 伊斯蘭堡
+喀拉蚩 卡拉奇
+帕塔亚 芭達亞
+葉里溫 埃里溫
+巴士拉 巴斯拉
+賽普勒斯 塞浦路斯
+荷姆茲 霍爾木茲
+加薩走廊 加沙地帶
+西臺語 赫梯語
+西臺王 赫梯王
+西臺族 赫梯族
+西臺文 赫梯文
+西臺帝 赫梯帝
+西臺國 赫梯國
+西臺人 赫梯人
+阿联酋 阿聯酋
+迪拜 杜拜
+格鲁吉亚 格魯吉亞
+提比里西 第比利斯
+諾鲁 瑙魯
+玻里尼西亞 波利尼西亞
+帛琉 帕勞
+堪培拉 坎培拉
+约翰斯顿岛 強斯頓環礁
+巴尔米拉环礁 帕邁拉環礁
+马恩岛 萌島
+伯明罕 伯明翰
+布里斯托尔 布里斯托
+威尔士 威爾斯
+威爾士 威爾斯
+·威尔士 ·威爾士
+·威爾士 ·威爾士
+土魯斯 圖盧茲
+戛纳 康城
+坎城 康城
+羅亞爾 盧瓦爾
+诺曼底 諾曼第
+卢浮宫 羅浮宮
+埃菲尔 艾菲爾
+霍爾斯坦 荷爾斯泰因
+漢諾瓦 漢諾威
+哥廷根 格丁根
+杜塞道夫 杜塞爾多夫
+德勒斯登 德累斯頓
+安哈特 安哈爾特
+威斯伐倫 威斯特法倫
+布蘭登堡 勃蘭登堡
+前波莫瑞 前波美拉尼亞
+什勒斯維希 石勒蘇益格
+不萊梅 不來梅
+柏林墙 柏林圍牆
+巴塞罗那 巴塞隆拿
+巴塞隆納 巴塞隆拿
+塞维利亚 西維爾
+塞維亞 西維爾
+巴伦西亚 華倫西亞
+巴倫西亞 華倫西亞
+瓦倫西亞 華倫西亞
+雅爾達 雅爾塔
+切尔诺贝利 切爾諾貝爾
+蒙特內哥羅 黑山
+馬斯垂克 馬斯特里赫特
+貝爾格勒 貝爾格萊德
+塞拉耶佛 薩拉熱窩
+波士尼亞 波斯尼亞
+塞爾維亞與蒙特內哥羅 塞爾維亞和黑山
+卢塞恩 琉森
+亞斯文 阿斯旺
+奈及利亞 尼日利亞
+雅穆索戈 雅穆蘇克雷
+幾內亞 畿內亞
+几内亚 畿內亞
+衣索匹亞 埃塞俄比亚
+吉力馬札羅 乞力馬札羅
+厄利垂亚 厄立特里亞
+索馬利亞 索馬里
+索馬利里 索馬里
+马里兰 馬利蘭
+馬里蘭 馬利蘭
+好萊塢 荷里活
+好莱坞 荷里活
+舊金山 三藩市
+旧金山 三藩市
+紐澳良 新奧爾良
+密西根 密歇根
+愛荷華 艾奧瓦
+爱荷华 艾奧瓦
+得克萨斯 德克薩斯
+蒙特婁 蒙特利爾
+滿地可 蒙特利爾
+紐賓士域 紐賓士域
+默多克 梅鐸
+梅鐸 梅鐸
+麦克尔 米高
+迈克尔 米高
+錢尼 切尼
+里瓦尔多 李華度
+罗纳德·里根 朗奴·列根
+达芬奇 達文西
+达·芬奇 達·文西
+谢丽·布莱尔 彭雪玲
+葉爾欽 葉利欽
+菲利普親王 菲臘親王
+菲利普亲王 菲臘親王
+華勒沙 華里沙
+艾里爾·夏隆 阿里埃勒·沙龍
+罗纳尔迪尼奥 朗拿甸奴
+罗纳尔多 朗拿度
+索忍尼辛 索贊尼辛
+索尔仁尼琴 索贊尼辛
+瓦文萨 華里沙
+班傑明 本傑明
+狄托 鐵托
+柴契爾 戴卓爾
+撒切尔 戴卓爾
+斯蒂芬·斯皮尔伯格 史提芬·史匹堡
+斯皮尔伯格 史匹堡
+史蒂芬·史匹柏 史提芬·史匹堡
+史匹柏 史匹堡
+戈巴契夫 戈爾巴喬夫
+席哈克 希拉克
+希拉蕊 希拉里
+布莱尔 貝理雅
+尼克松 尼克遜
+奧黛麗·赫本 柯德莉·夏萍
+奧黛莉·朵杜 柯德莉·塔圖
+奥黛丽·赫本 柯德莉·夏萍
+卡斯楚 卡斯特羅
+肖邦 蕭邦
+恺撒 凱撒
+肯尼迪 甘迺迪
+歐巴馬 奧巴馬
+戈登·布朗 白高敦
+狂牛症 瘋牛症
+A肝 甲肝
+A型肝炎 甲型肝炎
+B肝 乙肝
+B型肝炎 乙型肝炎
+C肝 丙肝
+C型肝炎 丙型肝炎
+艾滋 愛滋
+链接 連結
+分辨率 解像度
+解析度 解像度
+智慧卡 智能卡
+晶元 晶片
+芯片 晶片
+晶體管 電晶體
+晶体管 電晶體
+源代码 原始碼
+IP地址 IP位址
+IP 地址 IP 位址
+屏幕 螢幕
+荧屏 螢屏
+版权信息 版權資訊
+蹦床 彈床
+擊劍 劍擊
+击剑 劍擊
+金氏世界紀錄 健力士世界紀錄
+牛轧 鳥結
+牛軋 鳥結
+數位相機 數碼相機
+單眼相機 單鏡反光機
+单反相机 單鏡反光機
+形上學 形而上學
+吉尼斯世界纪录 健力士世界紀錄
+吉他 結他
+古柯鹼 可卡因
+咖哩 咖喱
+泰坦尼克号 鐵達尼號
+自行火炮 自走炮
+冰激凌 雪糕
+奥斯曼 鄂圖曼
+里氏0 黎克特制0
+里氏1 黎克特制1
+里氏2 黎克特制2
+里氏3 黎克特制3
+里氏4 黎克特制4
+里氏5 黎克特制5
+里氏6 黎克特制6
+里氏7 黎克特制7
+里氏8 黎克特制8
+里氏9 黎克特制9
+芮氏0 黎克特制0
+芮氏1 黎克特制1
+芮氏2 黎克特制2
+芮氏3 黎克特制3
+芮氏4 黎克特制4
+芮氏5 黎克特制5
+芮氏6 黎克特制6
+芮氏7 黎克特制7
+芮氏8 黎克特制8
+芮氏9 黎克特制9
+芮氏規模 黎克特制震級
+芮氏地震規模 黎克特制地震震級
+里氏震级 黎克特制震級
+里氏规模 黎克特制震級
+里氏地震规模 黎克特制地震震級
+埃博拉 伊波拉
+哥特式 哥德式
+正體中文 繁體中文
+板球 木球
+籃板球 籃板球
+智慧財產權 知識產權
+智財權 知識產權
+首席执行官 行政總裁
+智慧型 智能
+智慧手機 智能手機
+计算机程序 電腦程式
+电脑程序 電腦程式
+应用程序 應用程式
+尖峰時間 繁忙時間
+尖峰時段 繁忙時段
+東協 東盟
+亚细安 東盟
+大英國協 英聯邦
+共和联邦 英聯邦
+阿布達比 阿布扎比
+蓋曼群島 開曼群島
+宇航员 太空人
+薛丁格 薛定諤
+凯瑟琳 嘉芙蓮
+凱薩琳 嘉芙蓮
+门德尔松 孟德爾遜
+孟德爾頌 孟德爾遜
+肖斯塔科维奇 蕭士達高維契
+蕭士塔高維奇 蕭士達高維契
+工具機 機床
+伊斯坦堡 伊斯坦布爾
+空气质量 空氣質素
+空氣品質 空氣質素
+俯卧撑 掌上壓
+伏地挺身 掌上壓
+数字电视 數碼電視
+數位電視 數碼電視
+数字技术 數碼技術
+數位技術 數碼技術
+数字信号 數碼訊號
+數碼訊號 數碼訊號
+行動網路 流動網絡
+移动网络 流動網絡
+麥克風 咪高峰
+麦克风 咪高峰
+幫浦 泵
+朝鲜战争 韓戰
+万历朝鲜战争 萬曆朝鮮戰爭
+演化論 進化論
+搜索引擎 搜尋引擎
+福馬林 福爾馬林
+海洛因 海洛英
+高畫質 高清
+赫魯雪夫 赫魯曉夫
+公厘 毫米
+公釐 毫米
+桑巴舞 森巴舞
+乔治·奥威尔 喬治·歐威爾
+程序员 程式設計師
+昂山素季 昂山素姬
+翁山蘇姬 昂山素姬
+西洋棋 國際象棋
+隐私 私隱
+隱私 私隱
+硅藻 硅藻 \ No newline at end of file
diff --git a/maintenance/language/zhtable/toSG.manual b/maintenance/language/zhtable/toSG.manual
deleted file mode 100644
index 2d39aa35..00000000
--- a/maintenance/language/zhtable/toSG.manual
+++ /dev/null
@@ -1,21 +0,0 @@
-」 ”
-「 “
-『 ‘
-』 ’
-方便面 快速面
-速食麵 快速面
-即食麵 快速面
-泡麵 快速面
-蹦极跳 绑紧跳
-笨豬跳 绑紧跳
-凉菜 冷菜
-冷盤 冷菜
-零钱 散钱
-散紙 散钱
-笑星 谐星
-夜校 夜学
-民乐 华乐
-住房 住屋
-房价 屋价
-榴莲 榴梿
-榴蓮 榴梿 \ No newline at end of file
diff --git a/maintenance/language/zhtable/toSimp.manual b/maintenance/language/zhtable/toSimp.manual
index e22447a6..b857e5f4 100644
--- a/maintenance/language/zhtable/toSimp.manual
+++ b/maintenance/language/zhtable/toSimp.manual
@@ -1,10 +1,16 @@
+」 ”
+「 “
+『 ‘
+』 ’
+「 “
+」 ”
乾县 乾县
萧乾 萧乾
乾断 乾断
乾图 乾图
乾纲 乾纲
乾红 乾红
-乾清宫 乾清宫
+乾清 乾清
乾仪 乾仪
乾兴 乾兴
乾冈 乾冈
@@ -51,16 +57,19 @@
男性为乾 男性为乾
男为乾 男为乾
阳为乾 阳为乾
-男性为乾 男性为乾
男性爲乾 男性为乾
-男为乾 男为乾
男爲乾 男为乾
-阳为乾 阳为乾
陽爲乾 阳为乾
乾一组 乾一组
乾一坛 乾一坛
陈乾生 陈乾生
陈公乾生 陈公乾生
+李乾顺 李乾顺
+孙乾 孙乾
+陈遇乾 陈遇乾
+曾运乾 曾运乾
+象乾 象乾
+乾贵士 乾贵士
柳诒徵 柳诒徵
於夫罗 於夫罗
於梨华 於梨华
@@ -76,12 +85,12 @@
藉機 借机
藉此 借此
藉由 借由
-藉著 借着
-藉着 借着
沈積 沉积
沈船 沉船
沈默 沉默
沈沒 沉没
+沈澱 沉淀
+沈重 沉重
彷彿 仿佛
項鍊 项链
肘手鍊足 肘手链足
@@ -96,7 +105,8 @@
銀鍊 银链
鍊錘 链锤
洗鍊 洗练
-石碁镇 石碁镇
+手鍊 手链
+鍊表 链表
反覆 反复
回覆 回复
答覆 答复
@@ -104,14 +114,12 @@
重覆 重复
覆核 复核
覆查 复查
+覆检 复检
鬱姓 鬱姓
鬱氏 鬱氏
-侏儸紀 侏罗纪
夥計 伙计
-吳其濬 吴其濬
-吴其濬 吴其濬
乾泉水 干泉水
-么半群 幺半群
+么半 幺半
么元 幺元
么爹 幺爹
么叔 幺叔
@@ -122,24 +130,21 @@
么娘 幺娘
么孃 幺娘
幺孃 幺娘
+么弟 幺弟
么妹 幺妹
么小 幺小
么姓 幺姓
么氏 幺氏
么蛾子 幺蛾子
幺厮 幺厮
-睪丸 睾丸
-附睪 附睾
-隱睪 隱睾
麼麼 麽麽
么麼 幺麽
-么麼小丑 幺麽小丑
么鳳 幺凤
么二三 幺二三
么篇 幺篇
么謙 幺谦
+六么 六幺
这么 这么
-麴义 麴义
乾乾淨淨 干干净净
乾乾脆脆 干干脆脆
肉乾乾 肉干干
@@ -151,16 +156,113 @@
醯鸡 醯鸡
醯壶 醯壶
苧烯 苧烯
-李乾顺 李乾顺
-幹著 干着
氾濫 泛滥
-显著 显著
-顯著 显著
-標誌著 标志着
近角聪信 近角聪信
-修鍊 修炼
米泽瑠美 米泽瑠美
-太閤 太阁
候覆 候复
待覆 待复
批覆 批复
+矇眬 矇眬
+荠苧 荠苧
+噁心 恶心
+碁圣 碁圣
+慇懃 殷勤
+慇勤 殷勤
+崑崙 昆仑
+崑山 昆山
+崑劇 昆剧
+崑曲 昆曲
+崑腔 昆腔
+崑蘇 昆苏
+崑調 昆调
+諠譁 喧哗
+慫慂 怂恿
+陈元扞 陈元扞
+甦醒 苏醒
+復甦 复苏
+蒐證 搜证
+蒐索 搜索
+蒐藏 搜藏
+蒐羅 搜罗
+蒐購 搜购
+蒐錄 搜录
+蒐集 搜集
+蒐輯 搜辑
+蒐采 搜采
+蒐採 搜采
+偵蒐 侦搜
+情蒐 情搜
+蘋果 苹果
+於之莹 於之莹
+陆徵祥 陆徵祥
+瞭臺 瞭台
+瞭台 瞭台
+慘澹 惨淡
+鍾情 钟情
+鍾愛 钟爱
+鍾意 钟意
+所鍾 所钟
+情鍾 情钟
+獨鍾 独钟
+鍾靈 钟灵
+龍鍾 龙钟
+鍾山 钟山
+一鍾 一钟
+千鍾 千钟
+薰心 熏心
+薰習 熏习
+薰陶 熏陶
+薰沐 熏沐
+薰香 熏香
+餬口 糊口
+跼限 局限
+跼促 局促
+釐清 厘清
+釐訂 厘订
+釐革 厘革
+釐改 厘改
+釐整 厘整
+釐正 厘正
+毫釐 毫厘
+釐毫 厘毫
+剖釐 剖厘
+一釐 一厘
+昇平 升平
+飛昇 飞升
+提昇 提升
+高昇 高升
+初昇 初升
+昇天 升天
+上昇 上升
+昇汞 升汞
+昇華 升华
+昇仙 升仙
+昇降 升降
+竹昇 竹升
+直昇 直升
+高陞 高升
+晉陞 晋升
+歷陞 历升
+官陞 官升
+榮陞 荣升
+又陞 又升
+年陞 年升
+月陞 月升
+陞官 升官
+陞任 升任
+陞為 升为
+陞遷 升迁
+陞用 升用
+陞補 升补
+陞了 升了
+,陞 ,升
+。陞 。升
+爾冬陞 尔冬升
+內聯陞 内联升
+同陞和 同升和
+拿破崙 拿破仑
+酒麴 酒曲
+麴黴 曲霉
+造麴 造曲
+大麴 大曲
+黃麴毒素 黄曲毒素 \ No newline at end of file
diff --git a/maintenance/language/zhtable/toTW.manual b/maintenance/language/zhtable/toTW.manual
index 1a14e99a..14f7eaeb 100644
--- a/maintenance/language/zhtable/toTW.manual
+++ b/maintenance/language/zhtable/toTW.manual
@@ -1,141 +1,170 @@
-” 」
-“ 「
-‘ 『
-’ 』
着 著
+佈 布
鈎 鉤
钩 鉤
-衞 衛
-元凶 元凶
-元兇 元凶
-凶器 凶器
-兇器 凶器
-凶徒 凶徒
-兇徒 凶徒
-凶手 凶手
-兇手 凶手
-凶案 凶案
-兇案 凶案
-凶残 凶殘
-凶殘 凶殘
-兇殘 凶殘
-凶杀 凶殺
-凶殺 凶殺
-兇殺 凶殺
-疑凶 疑凶
-疑兇 疑凶
-真凶 真凶
-真兇 真凶
-缉凶 緝凶
-緝凶 緝凶
-緝兇 緝凶
-行凶 行凶
-行兇 行凶
-行凶后 行凶後
-行凶後 行凶後
-行兇後 行凶後
-买凶 買凶
-買凶 買凶
-買兇 買凶
-追凶 追凶
-追兇 追凶
-逞凶斗狠 逞凶鬥狠
-逞凶鬥狠 逞凶鬥狠
-逞兇鬥狠 逞凶鬥狠
-复苏 復甦
-復蘇 復甦
+账 帳
+枱 檯
+卧 臥
+睾 睪
+酰 醯
+钫 鍅
+锫 鉳
+镎 錼
+镅 鋂
+锿 鑀
+锝 鎝
+锎 鉲
+钚 鈽
+硅 矽
+煙草 菸草
+煙蒂 菸蒂
+煙斗 菸斗
+煙鬼 菸鬼
+煙灰 菸灰
+煙具 菸具
+煙民 菸民
+煙農 菸農
+煙絲 菸絲
+煙頭 菸頭
+煙葉 菸葉
+煙癮 菸癮
+煙嘴 菸嘴
+煙酒 菸酒
+煙袋 菸袋
+煙品 菸品
+煙鹼 菸鹼
+煙捲 菸捲
+香煙 香菸
+捲煙 捲菸
+旱煙 旱菸
+烤煙 烤菸
+禁煙 禁菸
+戒煙 戒菸
+拒煙 拒菸
+紙煙 紙菸
+抽煙 抽菸
+吸煙 吸菸
+反煙 反菸
+私煙 私菸
+點煙 點菸
+洋煙 洋菸
+二手煙 二手菸
+電子煙 電子菸
+呂宋煙 呂宋菸
+雪茄煙 雪茄菸
+無煙日 無菸日
+無煙環境 無菸環境
+榴莲 榴槤
+榴蓮 榴槤
+霉素 黴素
+想象 想像
+迭代 疊代
+叱咤 叱吒
+嘯咤 嘯吒
+叱咤9 叱咤9
+叱咤M 叱咤M
+叱咤樂壇 叱咤樂壇
+叱咤咤 叱咤咤
+叱咤叱 叱咤叱
+正在叱咤 正在叱咤
+氨基酸 胺基酸
+枪支 槍枝
+球杆 球桿
+推杆 推桿
+挥杆 揮桿
+揮杆 揮桿
+一杆 一桿
+二杆 二桿
+三杆 三桿
+四杆 四桿
+五杆 五桿
+六杆 六桿
+七杆 七桿
+八杆 八桿
+九杆 九桿
+十杆 十桿
+1杆 1桿
+2杆 2桿
+3杆 3桿
+4杆 4桿
+5杆 5桿
+6杆 6桿
+7杆 7桿
+8杆 8桿
+9杆 9桿
+0杆 0桿
+标准杆 標準桿
+標準杆 標準桿
+电杆 電桿
+电线杆 電線桿
+木杆 木桿
+铁杆 鐵桿
+鐵杆 鐵桿
+杆头 桿頭
+杆頭 桿頭
+杆身 桿身
+杆弟 桿弟
+锻炼 鍛鍊
+炼金 鍊金
+熏烤 燻烤
+烟熏 煙燻
+熏肉 燻肉
+熏黑 燻黑
+糊口 餬口
+径庭 逕庭
+径到 逕到
+径取 逕取
+径入 逕入
+径行 逕行
+径自 逕自
+径往 逕往
+径寄 逕寄
+径启 逕啟
+径迎 逕迎
+系着 繫著
+关系着 關係著
+冲着 衝著
+干着 幹著
+干着急 干著急
+斗着 鬥著
+徵狀 症狀
+系数 係數
缺省 預設
-串行 串列
-串列加速器 串列加速器
以太网 乙太網
-位图 點陣圖
-例程 常式
-光标 游標
光盘 光碟
光驱 光碟機
-全角 全形
-加载 載入
-半角 半形
-变量 變數
-噪声 雜訊
-脱机 離線
声卡 音效卡
-老字号 老字號
-连字号 連字號
-字号 字型大小
字库 字型檔
字段 欄位
-字符 字元
-字符集 字符集
存盘 存檔
-寻址 定址
-尾注 章節附註
-异步 非同步
-总线 匯流排
-括号 括弧
-接口 介面
+界面 介面
控件 控制項
-权限 許可權
盘片 碟片
-硅片 矽片
-硅谷 矽谷
硬盘 硬碟
磁盘 磁碟
磁道 磁軌
-程控 程式控制
-远程控制 遠程控制
-遠程控制 遠程控制
-行程控制 行程控制
-流程控制 流程控制
端口 埠
算子 運算元
-算法 演算法
芯片 晶片
-芯片 晶元
-词组 片語
译码 解碼
软驱 軟碟機
快闪存储器 快閃記憶體
闪存 快閃記憶體
鼠标 滑鼠
进制 進位
-交互式 互動式
-仿真 模擬
-优先级 優先順序
-传感 感測
-便携式 攜帶型
信息论 資訊理論
写保护 防寫
分辨率 解析度
服务器 伺服器
-等于 等於
局域网 區域網
-扫瞄仪 掃瞄器
宽带 寬頻
数据库 資料庫
-奶酪 乳酪
-手电 手電筒
-手电筒 手電筒
-万历 萬曆
-永历 永曆
-词汇 辭彙
-习用 慣用
-元音 母音
-新纪元 新紀元
-新紀元 新紀元
-宋元 宋元
-头球 頭槌
-入球 進球
-粒入球 顆進球
-打门 射門
-火锅盖帽 蓋火鍋
打印机 印表機
打印機 印表機
字节 位元組
字節 位元組
打印 列印
-打印 列印
-硬件 硬體
+攻打印 攻打印
硬件 硬體
二极管 二極體
二極管 二極體
@@ -143,11 +172,8 @@
三極管 三極體
软件 軟體
軟件 軟體
-网络 網路
-網絡 網路
人工智能 人工智慧
航天飞机 太空梭
-航天大学 航天大學
穿梭機 太空梭
因特网 網際網路
互聯網 網際網路
@@ -158,10 +184,8 @@
调制解调器 數據機
調制解調器 數據機
短信 簡訊
-短訊 簡訊
乌兹别克斯坦 烏茲別克
乍得 查德
-乍得 查德
也门 葉門
也門 葉門
伯利兹 貝里斯
@@ -174,12 +198,8 @@
几内亚比绍 幾內亞比索
幾內亞比紹 幾內亞比索
列支敦士登 列支敦斯登
-列支敦士登 列支敦斯登
利比里亚 賴比瑞亞
利比里亞 賴比瑞亞
-加纳 迦納
-加納 迦納
-加蓬 加彭
加蓬 加彭
博茨瓦纳 波札那
博茨瓦納 波札那
@@ -210,25 +230,17 @@
圣马力诺 聖馬利諾
聖馬力諾 聖馬利諾
圭亚那 蓋亞那
-圭亞那 蓋亞那
+法属圭亚那 法屬蓋亞那
坦桑尼亚 坦尚尼亞
坦桑尼亞 坦尚尼亞
埃塞俄比亚 衣索比亞
埃塞俄比亞 衣索比亞
基里巴斯 吉里巴斯
-基里巴斯 吉里巴斯
塔吉克斯坦 塔吉克
塞拉利昂 獅子山
-塞拉利昂 獅子山
-塞浦路斯 塞普勒斯
塞浦路斯 塞普勒斯
塞舌尔 塞席爾
塞舌爾 塞席爾
-多米尼加共和国 多明尼加
-多米尼加共和國 多明尼加
-多明尼加共和國 多明尼加
-多米尼加国 多米尼克
-多明尼加國 多米尼克
安提瓜和巴布达 安地卡及巴布達
安提瓜和巴布達 安地卡及巴布達
尼日利亚 奈及利亞
@@ -241,7 +253,6 @@
布基纳法索 布吉納法索
布基納法索 布吉納法索
布隆迪 蒲隆地
-布隆迪 蒲隆地
帕劳 帛琉
意大利 義大利
所罗门群岛 索羅門群島
@@ -270,7 +281,6 @@
津巴布韦 辛巴威
津巴布韋 辛巴威
洪都拉斯 宏都拉斯
-洪都拉斯 宏都拉斯
特立尼达和托巴哥 千里達托貝哥
特立尼達和多巴哥 千里達托貝哥
瑙鲁 諾魯
@@ -282,18 +292,13 @@
科摩羅 葛摩
科特迪瓦 象牙海岸
突尼斯 突尼西亞
-索马里 索馬利亞
-索馬里 索馬利亞
老挝 寮國
老撾 寮國
肯尼亚 肯亞
-肯雅 肯亞
苏里南 蘇利南
莫桑比克 莫三比克
莱索托 賴索托
萊索托 賴索托
-贝宁 貝南
-貝寧 貝南
赞比亚 尚比亞
贊比亞 尚比亞
阿塞拜疆 亞塞拜然
@@ -304,108 +309,396 @@
马耳他 馬爾他
马里共和国 馬利共和國
馬里共和國 馬利共和國
-方便面 速食麵
-快速面 速食麵
-即食麵 速食麵
-薯仔 土豆
-土豆网 土豆網
-土豆網 土豆網
蹦极跳 笨豬跳
绑紧跳 笨豬跳
-冷菜 冷盤
-凉菜 冷盤
出租车 計程車
台球 撞球
-桌球 撞球
-卫生 衛生
-衞生 衛生
-平治之亂 平治之亂
-平治之乱 平治之亂
-平治 賓士
-奔驰 賓士
積架 捷豹
-雪铁龙 雪鐵龍
-萬事得 馬自達
-拿破仑 拿破崙
-拿破侖 拿破崙
布什 布希
布殊 布希
克林顿 柯林頓
克林頓 柯林頓
侯赛因 海珊
侯賽因 海珊
-凡高 梵谷
+梵高 梵谷
狄安娜 黛安娜
戴安娜 黛安娜
-颁布 頒布
-頒佈 頒布
-彩带 彩帶
-彩排 彩排
-彩楼 彩樓
-彩牌楼 彩牌樓
-彩球 綵球
-彩绸 綵綢
-彩线 綵線
-彩船 綵船
-彩衣 綵衣
-结彩 結綵
-戏彩娱亲 戲綵娛親
-剪彩 剪綵
-榴莲 榴槤
-榴蓮 榴槤
-掛鈎 掛鉤
-挂钩 掛鉤
-鈎心鬥角 鉤心鬥角
-钩心斗角 鉤心鬥角
-酰 醯
-雪裏紅 雪裡紅
-雪裏蕻 雪裡蕻
-森林裏 森林裡
-日子裏 日子裡
-故事裏 故事裡
-領域裏 領域裡
-時間裏 時間裡
-深淵裏 深淵裡
-醫院裏 醫院裡
-春假裏 春假裡
-暑假裏 暑假裡
-秋假裏 秋假裡
-寒假裏 寒假裡
-春天裏 春天裡
-夏天裏 夏天裡
-秋天裏 秋天裡
-冬天裏 冬天裡
-春日裏 春日裡
-夏日裏 夏日裡
-秋日裏 秋日裡
-冬日裏 冬日裡
-百科裏 百科裡
-歷史裏 歷史裡
-戲裏 戲裡
-作品裏 作品裡
-專輯裏 專輯裡
-年代裏 年代裡
-棺材裏 棺材裡
-嘴裏 嘴裡
-心裏 心裡
-皮裏陽秋 皮裡陽秋
-肚裏 肚裡
-苦裏 苦裡
-裏勾外連 裡勾外連
-裏面 裡面
-這裏 這裡
-點裏 點裡
-中文裏 中文裡
-山洞裏 山洞裡
-世界裏 世界裡
-眼睛裏 眼睛裡
-學裏 學裡
-獄裏 獄裡
-館裏 館裡
-系列裏 系列裡
-村子裏 村子裡
-青霉素 青黴素
-想象 想像
-锎 鉲
-信道 信道
-綫 線
+南朝鲜 南韓
+北朝鲜 北韓
+乔戈里峰 K2
+老挝人民民主共和国 寮人民民主共和國
+老撾人民民主共和國 寮人民民主共和國
+老挝语 寮語
+老撾語 寮語
+浮罗交怡 蘭卡威
+浮羅交怡 蘭卡威
+莱特湾 雷伊泰灣
+萊特灣 雷伊泰灣
+耶加達 雅加達
+吉尔吉斯斯坦 吉爾吉斯
+伊斯兰堡 伊斯蘭瑪巴德
+伊斯蘭堡 伊斯蘭瑪巴德
+卡拉奇 喀拉蚩
+帕塔亚 芭達亞
+埃里温 葉里溫
+埃里溫 葉里溫
+第比利斯 提比里西
+巴士拉 巴斯拉
+塞浦路斯 賽普勒斯
+霍尔木兹 荷姆茲
+霍爾木茲 荷姆茲
+加沙地带 加薩走廊
+加沙地帶 加薩走廊
+赫梯 西臺
+阿联酋 阿聯
+阿聯酋 阿聯
+迪拜 杜拜
+堪培拉 坎培拉
+悉尼 雪梨
+波利尼西亚 玻里尼西亞
+波利尼西亞 玻里尼西亞
+新几内亚 紐幾內亞
+约翰斯顿岛 強斯頓環礁
+巴尔米拉环礁 帕邁拉環礁
+马恩岛 曼島
+萌島 曼島
+伯明翰 伯明罕
+布里斯托尔 布里斯托
+威尔士 威爾斯
+威爾士 威爾斯
+·威尔士 ·威爾士
+·威爾士 ·威爾士
+图卢兹 土魯斯
+圖盧茲 土魯斯
+戛纳 坎城
+卢瓦尔 羅亞爾
+盧瓦爾 羅亞爾
+诺曼底 諾曼第
+卢浮宫 羅浮宮
+埃菲尔 艾菲爾
+荷爾斯泰因 霍爾斯坦
+荷尔斯泰因 霍爾斯坦
+石勒蘇益格 什勒斯維希
+石勒苏益格 什勒斯維希
+漢诺威 漢諾瓦
+汉诺威 漢諾瓦
+格丁根 哥廷根
+杜塞爾多夫 杜塞道夫
+杜塞尔多夫 杜塞道夫
+德累斯顿 德勒斯登
+德累斯頓 德勒斯登
+安哈爾特 安哈特
+安哈尔特 安哈特
+威斯特法倫 威斯伐倫
+威斯特法伦 威斯伐倫
+勃蘭登堡 布蘭登堡
+勃兰登堡 布蘭登堡
+前波美拉尼亞 前波莫瑞
+前波美拉尼亚 前波莫瑞
+不来梅 不萊梅
+不來梅 不萊梅
+柏林墙 柏林圍牆
+柏林牆 柏林圍牆
+巴塞罗那 巴塞隆納
+巴塞隆拿 巴塞隆納
+塞维利亚 塞維亞
+西維爾 塞維亞
+巴伦西亚 瓦倫西亞
+華倫西亞 瓦倫西亞
+佛罗伦萨 佛羅倫斯
+雅尔塔 雅爾達
+雅爾塔 雅爾達
+切尔诺贝利 車諾比
+黑山共和國 蒙特內哥羅共和國
+黑山共和国 蒙特內哥羅共和國
+马斯特里赫特 馬斯垂克
+馬斯特里赫特 馬斯垂克
+贝尔格莱德 貝爾格勒
+貝爾格萊德 貝爾格勒
+薩拉熱窩 塞拉耶佛
+萨拉热窝 塞拉耶佛
+波黑 波赫
+波斯尼亞 波士尼亞
+波斯尼亚 波士尼亞
+比利牛斯 庇里牛斯
+塞黑 塞蒙
+塞爾維亞與蒙特內哥羅 塞爾維亞與蒙特內哥羅
+塞爾維亞和黑山 塞爾維亞與蒙特內哥羅
+塞尔维亚和黑山 塞爾維亞與蒙特內哥羅
+伊斯坦布尔 伊斯坦堡
+伊斯坦布爾 伊斯坦堡
+卢塞恩 琉森
+阿斯旺 亞斯文
+雅穆苏克雷 雅穆索戈
+雅穆蘇克雷 雅穆索戈
+畿內亞 幾內亞
+索马里兰 索馬利蘭
+索馬里蘭 索馬利蘭
+乞力马扎罗 吉力馬札羅
+乞力馬札羅 吉力馬札羅
+厄利垂亚 厄利垂亞
+索马里 索馬利亞
+索馬里 索馬利亞
+扎伊尔 薩伊
+扎伊爾 薩伊
+金沙萨 金夏沙
+金沙薩 金夏沙
+达累斯萨拉姆 三蘭港
+马拉维 馬拉威
+留尼汪 留尼旺
+布隆方丹 布隆泉
+厄瓜多 厄瓜多
+百慕大 百慕達
+圣赫勒拿 聖赫倫那
+马萨诸塞 麻薩諸塞
+馬利蘭 馬里蘭
+里士满 里奇蒙
+荷里活 好萊塢
+荷李活道 荷李活道
+维尔京群岛 維京群島
+維爾京群島 維京群島
+纽黑文 紐哈芬
+特拉華 德拉瓦
+特拉华 德拉瓦
+爱德华州 愛達荷州
+新罕布什尔 新罕布夏
+新奥尔良 紐奧良
+新奧爾良 紐奧良
+得克萨斯 德克薩斯
+弗吉尼亚 維吉尼亞
+康涅狄格 康乃狄克
+密歇根 密西根
+宾西法尼亚 賓夕法尼亞
+威士顿康星 威斯康辛
+伊利诺伊州 伊利諾州
+亚拉巴马 阿拉巴馬
+三藩市 舊金山
+艾奧瓦 愛荷華
+得克薩斯 德克薩斯
+蒙特利尔 蒙特婁
+蒙特利爾 蒙特婁
+滿地可 蒙特婁
+麦克尔 麥可
+迈克尔 麥可
+魯賓斯·巴里切羅 魯本·巴瑞切羅
+雷诺阿 雷諾瓦
+阿里埃勒·沙龙 艾里爾·夏隆
+阿里埃勒·沙龍 艾里爾·夏隆
+铁托 狄托
+鐵托 狄托
+邁凱輪 麥拿輪
+迈凯轮 麥拿輪
+达芬奇 達文西
+达·芬奇 達·文西
+赫鲁晓夫 赫魯雪夫
+赫丘勒·波洛 赫丘勒·白羅
+薛定谔 薛丁格
+葉利欽 葉爾欽
+華里沙 華勒沙
+瓦文萨 華勒沙
+艾森豪威尔 艾森豪
+罗纳德·里根 隆納·雷根
+维特根斯坦 維根斯坦
+约翰逊 詹森
+索尔仁尼琴 索忍尼辛
+索贊尼辛 索忍尼辛
+瓦格纳 華格納
+毕加索 畢卡索
+碧咸 贝克漢
+梅尔·吉布森 梅爾·吉勃遜
+查韦斯 查維茲
+本杰明 班傑明
+本傑明 班傑明
+普密蓬 蒲美蓬
+普利策 普利茲
+施罗德 施洛德
+斯蒂芬 史蒂芬
+斯皮尔伯格 史匹柏
+斯特劳斯 史特勞斯
+斯大林 史達林
+斯坦福 史丹福
+撒切尔 柴契爾
+戴卓爾 柴契爾
+摩根士丹利 摩根史坦利
+拉普兰 拉布蘭
+戴克里先 戴克里先
+戈爾巴喬夫 戈巴契夫
+戈尔巴乔夫 戈巴契夫
+愛德文 愛德溫
+德里达 德希達
+帕特里克 派屈克
+希拉里 希拉蕊
+希拉克 席哈克
+尼克松 尼克森
+威廉姆斯 威廉士
+多普勒 都卜勒
+叶利钦 葉爾欽
+卡斯特罗 卡斯楚
+包豪斯 包浩斯
+勃朗宁 白朗寧
+劳拉 蘿拉
+列奥纳多 李奧納多
+克里斯托弗 克里斯多福
+傅里叶 傅立葉
+伊丽莎白 伊莉莎白
+丘吉尔 邱吉爾
+肖邦 蕭邦
+理查德 理察
+肯尼迪 甘迺迪
+奥巴马 歐巴馬
+奧巴馬 歐巴馬
+概率 機率
+疯牛症 狂牛症
+甲肝 A肝
+甲型肝炎 A型肝炎
+乙肝 B肝
+乙型肝炎 B型肝炎
+丙肝 C肝
+丙型肝炎 C型肝炎
+艾滋 愛滋
+链接 連結
+程序员 程式設計師
+源代码 原始碼
+智能卡 智慧卡
+數據庫 資料庫
+操作系统 作業系統
+人机交互 人機互動
+交互设计 互動設計
+互联网络 網際網路
+互联网 網際網路
+万维网 全球資訊網
+编程语言 程式語言
+晶體管 電晶體
+晶体管 電晶體
+IP地址 IP位址
+IP 地址 IP 位址
+解像度 解析度
+屏幕 螢幕
+荧屏 螢屏
+版权信息 版權資訊
+航天器 太空飛行器
+导弹 飛彈
+宇航服 太空衣
+宇航员 太空人
+太空飛行員 太空人
+独联体 獨立國協
+独立国家联合体 獨立國家國協
+东南亚国家联盟 東南亞國協
+发达国家 已開發國家
+哥特式 哥德式
+落車 下車
+上落客 上下客
+集装箱 貨櫃
+雅马哈 山葉
+避孕套 保險套
+素檀 蘇丹
+珍寶客機 巨無霸客機
+泰坦尼克号 鐵達尼號
+樂行童軍 羅浮童軍
+朝鲜战争 韓戰
+万历朝鲜战争 萬曆朝鮮戰爭
+數碼相機 數位相機
+單鏡反光機 單眼相機
+数码相机 數位相機
+单反相机 單眼相機
+形而上學 形上學
+形而上学 形上學
+当且仅当 若且唯若
+圆珠笔 原子筆
+国际象棋 西洋棋
+可卡因 古柯鹼
+公共交通 公共運輸
+吉尼斯世界纪录 金氏世界紀錄
+健力士世界纪录 金氏世界紀錄
+健力士世界紀錄 金氏世界紀錄
+沙律 沙拉
+忌廉 奶油
+味美思 苦艾酒
+奥斯曼 鄂圖曼
+埃博拉 伊波拉
+克隆人 複製人
+荧光 螢光
+里氏0 芮氏0
+里氏1 芮氏1
+里氏2 芮氏2
+里氏3 芮氏3
+里氏4 芮氏4
+里氏5 芮氏5
+里氏6 芮氏6
+里氏7 芮氏7
+里氏8 芮氏8
+里氏9 芮氏9
+里氏震级 芮氏規模
+里氏规模 芮氏規模
+里氏地震规模 芮氏地震規模
+黎克特制 芮氏
+知识产权 智慧財產權
+知識產權 智慧財產權
+知识产权局 知識產權局
+知識產權局 知識產權署
+知识产权署 知識產權署
+知識產權署 知識產權署
+乒乓球 桌球
+乒乓 桌球
+首席执行官 執行長
+首席财务官 財務長
+首席运营官 營運長
+智能手机 智慧型手機
+智能手機 智慧型手機
+智能电话 智慧型電話
+智能電話 智慧型電話
+便携式 可攜式
+计算机程序 電腦程式
+电脑程序 電腦程式
+应用程序 應用程式
+激光 雷射
+高峰时间 尖峰時間
+高峰时段 尖峰時段
+东盟 東協
+亚细安 東協
+英联邦 大英國協
+英聯邦 大英國協
+共和联邦 大英國協
+阿布扎比 阿布達比
+开曼群岛 蓋曼群島
+開曼群島 蓋曼群島
+凯瑟琳 凱薩琳
+嘉芙蓮 凱薩琳
+门德尔松 孟德爾頌
+孟德爾遜 孟德爾頌
+肖斯塔科维奇 蕭士塔高維奇
+蕭士達高維契 蕭士塔高維奇
+希特拉 希特勒
+自由泳 自由式
+机床 工具機
+機床 工具機
+空气质量 空氣品質
+空氣質素 空氣品質
+俯卧撑 伏地挺身
+掌上壓 伏地挺身
+数字电视 數位電視
+數碼電視 數位電視
+数字技术 數位技術
+數碼技術 數位技術
+数字信号 數位訊號
+數碼訊號 數位訊號
+移动网络 行動網路
+流動網絡 行動網路
+咪高峰 麥克風
+電單車 機車
+搜索引擎 搜尋引擎
+福尔马林 福馬林
+福爾馬林 福馬林
+海洛英 海洛因
+高清电视 高畫質電視
+桑巴舞 森巴舞
+乔治·奥威尔 喬治·歐威爾
+結他 吉他
+了結他 了結他
+連結他 連結他
+昂山素季 翁山蘇姬
+昂山素姬 翁山蘇姬
+囯际象棋 西洋棋
+國際象棋 西洋棋
+私隱 隱私
+硅藻 硅藻 \ No newline at end of file
diff --git a/maintenance/language/zhtable/toTrad.manual b/maintenance/language/zhtable/toTrad.manual
index b0efd28e..7fc60c74 100644
--- a/maintenance/language/zhtable/toTrad.manual
+++ b/maintenance/language/zhtable/toTrad.manual
@@ -1,8 +1,9 @@
+” 」
+“ 「
+‘ 『
+’ 』
+’s ’s
手塚治虫 手塚治虫
-校仇 校讎
-仇校 讎校
-仇夷 讎夷
-仇問 讎問
無言不仇 無言不讎
視如寇仇 視如寇讎
往日無仇 往日無讎
@@ -26,8 +27,6 @@
丰韻 丰韻
丰儀 丰儀
丰標不凡 丰標不凡
-干細胞 幹細胞
-干熱 乾熱
二里頭 二里頭
水里鄉 水里鄉
蒙胧 朦朧
@@ -36,26 +35,29 @@
拜托 拜託
委托书 委託書
委托 委託
-挽詞 輓詞
-挽聯 輓聯
-挽詩 輓詩
於夫罗 於夫羅
府干預 府干預
府干擾 府干擾
-分布圖 分布圖
頁面 頁面
面條目 面條目
黃鈺筑 黃鈺筑
-仿佛 彷彿
-凶殘 兇殘
-凶殺 兇殺
-緝凶 緝兇
-行凶後 行兇後
-買凶 買兇
-逞凶鬥狠 逞兇鬥狠
-合著者 合著者
答复 答覆
反复 反覆
+候复 候覆
+待复 待覆
+批复 批覆
+复信 覆信
+复核 覆核
+的回复 的回覆
+回复中 回覆中
+回复说 回覆說
+回复你 回覆你
+有回复 有回覆
+回复邮件 回覆郵件
+回复意见 回覆意見
+回复帖子 回覆帖子
+得到回复 得到回覆
+回复: 回覆:
索馬里 索馬里
洗练 洗鍊
朝乾夕惕 朝乾夕惕
@@ -65,27 +67,20 @@
不干預 不干預
不干擾 不干擾
不干牠 不干牠
-矽谷 矽谷
范文瀾 范文瀾
-發表 發表
機械系 機械系
頂多 頂多
馬占山 馬占山
-叱咤樂壇 叱咤樂壇
闫怀礼 閆懷禮
-变髒 變髒
薴烯 薴烯
后豐 后豐
于謙 于謙
詩云 詩云
-鄭凱云 鄭凱云
云為 云為
古書云 古書云
古語云 古語云
經有云 經有云
語有云 語有云
-显著标志 顯著標志
-占領 佔領
采納 採納
風采 風采
于樂 于樂
@@ -126,7 +121,6 @@
于鳳桐 于鳳桐
于默奧 于默奧
于爾岑 于爾岑
-于默奧 于默奧
于貝爾 于貝爾
于爾根 于爾根
于雙戈 于雙戈
@@ -141,7 +135,6 @@
涂澤民 涂澤民
涂長望 涂長望
涂敏恆 涂敏恆
-台历 枱曆
艷后 艷后
廢后 廢后
后髮座 后髮座
@@ -154,10 +147,7 @@
蟻后 蟻后
馬格里布 馬格里布
佳里鎮 佳里鎮
-埔裡社撫墾局 埔裏社撫墾局
-埔裏社撫墾局 埔裏社撫墾局
有只採 有只採
-任何表達 任何表達
會干擾 會干擾
党項 党項
余三勝 余三勝
@@ -165,7 +155,6 @@
楊雅筑 楊雅筑
杰威爾音樂 杰威爾音樂
尸羅精舍 尸羅精舍
-索馬里 索馬里
騰格里 騰格里
村里長 村里長
進制 進制
@@ -179,8 +168,318 @@
黎吉雲 黎吉雲
于飛島 于飛島
鄉愿 鄉愿
+愿樸 愿樸
+謹愿 謹愿
奇迹 奇蹟
-候复 候覆
-待复 待覆
-批复 批覆
划槳 划槳
+折子戲 折子戲
+佣錢 佣錢
+佣鈿 佣鈿
+阁府 閤府
+太阁 太閤
+昆仑 崑崙
+昆山 崑山
+昆剧 崑劇
+昆曲 崑曲
+昆腔 崑腔
+昆苏 崑蘇
+昆调 崑調
+昆冈 崑岡
+西昆 西崑
+苏昆 蘇崑
+苏醒 甦醒
+复苏 復甦
+苹果 蘋果
+苹果干 蘋果乾
+后庄 后庄
+龜山庄 龜山庄
+寶山庄 寶山庄
+員山庄 員山庄
+昵称 暱稱
+單于 單于
+鮮于樞 鮮于樞
+鳳凰于飛 鳳凰于飛
+賦范 賦范
+陳士杰 陳士杰
+林杰樑 林杰樑
+茅于軾 茅于軾
+陳有后 陳有后
+天神之后 天神之后
+豔后 豔后
+后綜 后綜
+壽天里 壽天里
+貴子里 貴子里
+東湖里 東湖里
+鹿場里 鹿場里
+水里高級商工 水里高級商工
+水里鳳林 水里鳳林
+水里濁水溪 水里濁水溪
+划不來 划不來
+划來划去 划來划去
+划動 划動
+划得來 划得來
+划著 划著
+划進 划進
+划過 划過
+划龍舟 划龍舟
+只影響 只影響
+么弟 么弟
+六么 六么
+么雞 么雞
+義联 義联
+杠轂 杠轂
+局促 侷促
+開山辟谷 開山辟谷
+戲院里 戲院里
+惨淡 慘澹
+恶心 噁心
+证谏 証諫
+项链 項鍊
+手链 手鍊
+金链 金鍊
+链表 鍊表
+熏心 薰心
+熏习 薰習
+熏陶 薰陶
+熏沐 薰沐
+熏染 薰染
+熏香 薰香
+熏风 薰風
+雨蒙蒙 雨濛濛
+夹衣 袷衣
+夹裙 袷裙
+局蹐 跼蹐
+拳局 拳跼
+踡局 踡跼
+局躅 跼躅
+蹒局 蹣跼
+厘清 釐清
+厘订 釐訂
+厘革 釐革
+厘改 釐改
+厘整 釐整
+厘正 釐正
+毫厘 毫釐
+厘毫 釐毫
+剖厘 剖釐
+一厘一毫 一釐一毫
+升州 昇州
+升平 昇平
+升阳 昇陽
+陈升 陳昇
+南宮适 南宮适
+舊庄 舊庄
+拿破仑 拿破崙
+冗余 冗餘
+课余 課餘
+节余 節餘
+盈余 盈餘
+病余 病餘
+余地 餘地
+余力 餘力
+余子 餘子
+余事 餘事
+扶余 扶餘
+腐余 腐餘
+富余 富餘
+之余 之餘
+余泽 餘澤
+流风余俗 流風餘俗
+流风余韵 流風餘韻
+淋余土 淋餘土
+余一 餘一
+余二 餘二
+余三 餘三
+余四 餘四
+余五 餘五
+余六 餘六
+余七 餘七
+余八 餘八
+余九 餘九
+余十 餘十
+零余 零餘
+〇余 〇餘
+余零 餘零
+余〇 餘〇
+余1 餘1
+余2 餘2
+余3 餘3
+余4 餘4
+余5 餘5
+余6 餘6
+余7 餘7
+余8 餘8
+余9 餘9
+余0 餘0
+余数 餘數
+其余 其餘
+尸居余气 尸居餘氣
+剩余 賸餘
+余孽 餘孽
+残余 殘餘
+业余 業餘
+余割 餘割
+余款 餘款
+余角 餘角
+余切 餘切
+余霞 餘霞
+余下 餘下
+余弦 餘弦
+余震 餘震
+余貾 餘貾
+余额 餘額
+余人 餘人
+余俗 餘俗
+余倍 餘倍
+同余 同餘
+空余 空餘
+余量 餘量
+余年 餘年
+余留 餘留
+余项 餘項
+余式 餘式
+余部 餘部
+编余 編餘
+余墨 餘墨
+唾余 唾餘
+余韵 餘韻
+归余 歸餘
+公余 公餘
+宽余 寬餘
+余粮 餘糧
+余庆 餘慶
+余殃 餘殃
+余烬 餘燼
+劫余 劫餘
+结余 結餘
+烬余 燼餘
+净余 淨餘
+馂余 餕餘
+余晖 餘暉
+余辉 餘輝
+羡余 羨餘
+余悸 餘悸
+心余 心餘
+刑余 刑餘
+绪余 緒餘
+血余 血餘
+朱庆余 朱慶餘
+诸余 諸餘
+余论 餘論
+茶余 茶餘
+厨余 廚餘
+余裕 餘裕
+余气 餘氣
+诗余 詩餘
+词余 詞餘
+余僇 餘僇
+余辜 餘辜
+余责 餘責
+余罪 餘罪
+无余 無餘
+耳余 耳餘
+余烈 餘烈
+余思 餘思
+盐余 鹽餘
+嬴余 嬴餘
+赢余 贏餘
+王余鱼 王餘魚
+纡余 紆餘
+余波 餘波
+余杯 餘杯
+余步 餘步
+余妙 餘妙
+余音 餘音
+余声 餘聲
+余明 餘明
+余风 餘風
+余党 餘黨
+余毒 餘毒
+余桃 餘桃
+余桶 餘桶
+余利 餘利
+余沥 餘瀝
+余膏 餘膏
+余光 餘光
+余杭 餘杭
+余窍 餘竅
+余缺 餘缺
+余暇 餘暇
+余闲 餘閒
+余羡 餘羨
+余响 餘響
+余兴 餘興
+余蓄 餘蓄
+余绪 餘緒
+余珍 餘珍
+余众 餘眾
+余酲 餘酲
+余喘 餘喘
+余食 餘食
+余热 餘熱
+余刃 餘刃
+余闰 餘閏
+余存 餘存
+余业 餘業
+余姚 餘姚
+余荫 餘蔭
+余映 餘映
+余外 餘外
+余威 餘威
+余味 餘味
+余温 餘溫
+余勇 餘勇
+多余 多餘
+剩余 剩餘
+余生 餘生
+余欢 餘歡
+有余 有餘
+一余 一餘
+二余 二餘
+两余 兩餘
+三余 三餘
+四余 四餘
+五余 五餘
+六余 六餘
+七余 七餘
+八余 八餘
+九余 九餘
+十余 十餘
+百余 百餘
+千余 千餘
+万余 萬餘
+亿余 億餘
+兆余 兆餘
+0余 0餘
+1余 1餘
+2余 2餘
+3余 3餘
+4余 4餘
+5余 5餘
+6余 6餘
+7余 7餘
+8余 8餘
+9余 9餘
+于余曲折 于餘曲折
+尸居余气 尸居餘氣
+余光生 余光生
+余光中 余光中
+余思敏 余思敏
+余威德 余威德
+余子明 余子明
+余三胜 余三勝
+咨询 諮詢
+酒曲 酒麴
+曲霉 麴黴
+曲秀才 麴秀才
+曲尘 麴塵
+曲櫱 麴櫱
+黄曲毒素 黃麴毒素
+曲道士 麴道士
+曲钱 麴錢
+曲车 麴車
+鼠曲草 鼠麴草
+大曲酒 大麴酒
+泸州大曲 瀘州大麯 #商標名
+洋河大曲 洋河大麴
+双沟大曲 雙溝大麯 #商標名 \ No newline at end of file
diff --git a/maintenance/language/zhtable/trad2simp.manual b/maintenance/language/zhtable/trad2simp.manual
index 747a240a..f76a9498 100644
--- a/maintenance/language/zhtable/trad2simp.manual
+++ b/maintenance/language/zhtable/trad2simp.manual
@@ -1,153 +1,832 @@
+U+0347A㑺|U+04FCA俊|
+U+034BA㒺|U+07F54罔|
+U+034C2㓂|U+05BC7寇|
+U+03541㕁|U+05374却|
+U+03551㕑|U+053A8厨|
+U+03558㕘|U+053C2参|
+U+03565㕥|U+04EE5以|
+U+0362D㘭|U+05773坳|
+U+0375B㝛|U+05BBF宿|
+U+03760㝠|U+051A5冥|
+U+03800㠀|U+05C9B岛|
+U+0382F㠯|U+04EE5以|
+U+03836㠶|U+05E06帆|
+U+0384C㡌|U+05E3D帽|
+U+03898㢘|U+05EC9廉|
+U+03919㤙|U+06069恩|
+U+03966㥦|U+060EC惬|
+U+0396B㥫|U+060C7惇|
+U+039F1㧱|U+062FF拿|
+U+03A17㨗|U+06377捷|
+U+03A2A㨪|U+06643晃|
+U+03A3F㨿|U+0636E据|
+U+03A57㩗|U+0643A携|
+U+03A66㩦|U+0643A携|
+U+03A9A㪚|U+06563散|
+U+03A9F㪟|U+06566敦|
+U+03B09㬉|U+06696暖|
+U+03B2A㬪|U+053E0叠|
+U+03BED㯭|U+06A79橹|
+U+03C43㱃|U+0996E饮|
+U+03CD2㳒|U+06CD5法|
+U+03D31㴱|U+06DF1深|
+U+03F1D㼝|U+07897碗|
+U+03F5E㽞|U+07559留|
+U+03FDC㿜|U+0762A瘪|
+U+04230䈰|U+07B72筲|
+U+04280䊀|U+07CCA糊|
+U+045EC䗬|U+08702蜂|
+U+0460F䘏|U+06064恤|
+U+04611䘑|U+08109脉|
+U+0461A䘚|U+05352卒|
+U+046D0䛐|U+08BCD词|
+U+046E1䛡|U+08BDD话|
+U+04754䝔|U+0737E獾|
+U+04800䠀|U+08E5A蹚|
+U+04836䠶|U+05C04射|
+U+04965䥥|U+09570镰|
+U+04B03䬃|U+098D2飒|
+U+04B7E䭾|U+09A6E驮|
+U+04C1F䰟|U+09B42魂|
+U+04CD8䳘|U+09E45鹅|
+U+04D8A䶊|U+08844衄|
+U+04E23丣|U+0536F卯|
+U+04E57乗|U+04E58乘|
+U+04E79乹|U+05E72干|
+U+04E81亁|U+05E72干|
U+04E99亙|U+04E98亘|
-U+04F48佈|U+05E03布|
+U+04E9D亝|U+0658B斋|
+U+04EB1亱|U+0591C夜|
+U+04EB7亷|U+05EC9廉|
+U+04EBE亾|U+04EA1亡|
U+04F48佈|U+05E03布|
U+04F54佔|U+05360占|
+U+04FB7侷|U+05C40局|
+U+04FFB俻|U+05907备|
+U+05010倐|U+0500F倏|
U+05016倖|U+05E78幸|
+U+05023倣|U+04EFF仿|
+U+05038倸|U+0776C睬|
+U+0509A傚|U+06548效|
U+050A2傢|U+05BB6家|
+U+050CA僊|U+04ED9仙|
+U+050CD働|U+052A8动|
U+050F1僱|U+096C7雇|
+U+0510C儌|U+04FA5侥|
U+05138儸|U+03469㑩|U+07F57罗|
U+05147兇|U+051F6凶|
+U+0514E兎|U+05154兔|
+U+05160兠|U+0515C兜|
+U+05184冄|U+05189冉|
+U+05190冐|U+05192冒|
+U+05191冑|U+080C4胄|
+U+051BA冺|U+06CEF泯|
+U+051E2凢|U+051E1凡|
+U+051F4凴|U+051ED凭|
+U+05226刦|U+052AB劫|
+U+05227刧|U+052AB劫|
+U+0523C刼|U+052AB劫|
+U+05249剉|U+09509锉|
+U+0524F剏|U+0521B创|
+U+05259剙|U+0521B创|
+U+05273剳|U+0672D札|
U+05277剷|U+094F2铲|
+U+05279剹|U+0622E戮|
+U+05284劄|U+0672D札|
+U+05292劒|U+05251剑|
+U+052B9効|U+06548效|
+U+052C5勅|U+06555敕|
+U+052CC勌|U+05026倦|
+U+052D1勑|U+06555敕|
+U+052E6勦|U+0527F剿|
U+052F3勳|U+052CB勋|
+U+0531F匟|U+07095炕|
+U+05332匲|U+05941奁|
+U+05333匳|U+05941奁|
+U+05379卹|U+06064恤|
U+0537D卽|U+05373即|
+U+05380厀|U+0819D膝|
+U+053A0厠|U+05395厕|
U+053A4厤|U+05386历|
+U+053B0厰|U+05382厂|
+U+0541A吚|U+054BF咿|
+U+0544C呌|U+053EB叫|
+U+0546A呪|U+05492咒|
+U+0548A咊|U+0548C和|
+U+054F6哶|U+054A9咩|
+U+05515唕|U+05523唣|
+U+05518唘|U+0542F启|
+U+05538唸|U+05FF5念|
+U+0554E啎|U+05FE4忤|
+U+05551啑|U+0558B喋|
+U+05553啓|U+0542F启|
+U+05557啗|U+05556啖|
+U+05563啣|U+08854衔|
U+055AB喫|U+05403吃|
-U+05641噁|U+06076恶|
+U+055C1嗁|U+0557C啼|
+U+05605嘅|U+06168慨|
+U+05611嘑|U+0547C呼|
+U+05620嘠|U+0560E嘎|
+U+05637嘷|U+055E5嗥|
+U+05649噉|U+05556啖|
U+05690嚐|U+05C1D尝|
U+056A5嚥|U+054BD咽|
U+056AE嚮|U+05411向|
U+056CC囌|U+082CF苏|
+U+056D3囓|U+0556E啮|
+U+056D9囙|U+056E0因|
+U+05705圅|U+051FD函|
+U+0577F坿|U+09644附|
+U+0579C垜|U+0579B垛|
U+0585A塚|U+051A2冢|
+U+0585F塟|U+0846C葬|
+U+05872塲|U+0573A场|
+U+05896墖|U+05854塔|
U+058B0墰|U+0575B坛|
+U+058BB墻|U+05899墙|
+U+058CE壎|U+057D9埙|
U+058DC壜|U+0575B坛|
-U+05925夥|U+04F19伙|
+U+058FB壻|U+05A7F婿|
+U+05918夘|U+0536F卯|
+U+05925夥|U+04F19伙|U+05925夥|
+U+0596C奬|U+05956奖|
+U+059AC妬|U+05992妒|
+U+059B3妳|U+04F60你|
+U+059B7妷|U+04F84侄|
+U+059C9姉|U+059CA姊|
+U+059D9姙|U+0598A妊|
+U+059EA姪|U+04F84侄|
+U+059F8姸|U+0598D妍|
+U+05A63婣|U+059FB姻|
+U+05A6C婬|U+06DEB淫|
+U+05A8D媍|U+05987妇|
+U+05ABF媿|U+06127愧|
+U+05ACB嫋|U+08885袅|
+U+05AF0嫰|U+05AE9嫩|
+U+05AFA嫺|U+05A34娴|
+U+05B00嬀|U+059AB妫|
+U+05B1D嬝|U+08885袅|
+U+05B2D嬭|U+05976奶|
+U+05B3E嬾|U+061D2懒|
+U+05B43孃|U+05A18娘|
+U+05B7C孼|U+05B7D孽|
+U+05B82宂|U+05197冗|
U+05BC0寀|U+091C7采|
-U+05D11崑|U+06606昆|
-U+05D19崙|U+04ED1仑|
+U+05BC3寃|U+051A4冤|
+U+05BD1寑|U+05BDD寝|
+U+05BF3寳|U+05B9D宝|
+U+05C05尅|U+0514B克|
+U+05C12尒|U+05C14尔|
+U+05C19尙|U+05C1A尚|
+U+05C1F尟|U+09C9C鲜|
+U+05C20尠|U+09C9C鲜|
+U+05C5B屛|U+05C4F屏|
+U+05C6D屭|U+05C43屃|
+U+05C85岅|U+05742坂|
+U+05CDD峝|U+05CD2峒|
U+05D57嵗|U+05C81岁|
+U+05D83嶃|U+05D2D崭|
U+05DBD嶽|U+05CB3岳|
U+05DD6巖|U+05CA9岩|
-U+05DF9巹|U+0537A卺|
+U+05DD7巗|U+05CA9岩|
+U+05DF5巵|U+0536E卮|
+U+05E00帀|U+0531D匝|
+U+05E0B帋|U+07EB8纸|
+U+05E2C帬|U+088D9裙|
+U+05E47幇|U+05E2E帮|
+U+05E51幑|U+05FBD徽|
+U+05E59幙|U+05E55幕|
+U+05E5A幚|U+05E2E帮|
+U+05EBB庻|U+05EB6庶|
+U+05EBD庽|U+05BD3寓|
+U+05ED0廐|U+053A9厩|
+U+05ED5廕|U+0836B荫|
+U+05EF5廵|U+05DE1巡|
+U+05EF9廹|U+08FEB迫|
+U+05EFB廻|U+056DE回|
+U+05EFC廼|U+04E43乃|
U+05F14弔|U+0540A吊|
U+05F46彆|U+0522B别|
+U+05F6B彫|U+096D5雕|
+U+05F83徃|U+05F80往|
+U+05FA7徧|U+0904D遍|
+U+06031怱|U+05306匆|
+U+06033怳|U+0604D恍|
+U+06060恠|U+0602A怪|
+U+06061恡|U+0541D吝|
+U+060A4悤|U+05306匆|
+U+060BD悽|U+051C4凄|
+U+060CF惏|U+05A6A婪|
+U+060E5惥|U+0607F恿|
+U+060F7惷|U+08822蠢|
+U+0613D愽|U+0535A博|
+U+06159慙|U+060ED惭|
+U+06164慤|U+060AB悫|
+U+06174慴|U+06151慑|
U+0617C慼|U+0621A戚|
+U+0617D慽|U+0621A戚|
U+0617E慾|U+06B32欲|
+U+06187憇|U+061A9憩|
U+061DE懞|U+08499蒙|
+U+0621E戞|U+0621B戛|
+U+0622F戯|U+0620F戏|
+U+06239戹|U+05384厄|
+U+0625E扞|U+0634D捍|
+U+0629D抝|U+062D7拗|
U+062DA拚|U+062FC拼|
U+06331挱|U+06332挲|
-U+06371捱|U+06328挨|
+U+06335挵|U+05F04弄|
+U+06344捄|U+06551救|
U+06372捲|U+05377卷|
+U+063BD掽|U+078B0碰|
+U+063D1揑|U+0634F捏|
+U+063EB揫|U+063EA揪|
+U+063F7揷|U+063D2插|
+U+063F9揹|U+080CC背|
+U+06406搆|U+06784构|
+U+06407搇|U+063FF揿|
+U+06409搉|U+069B7榷|
+U+06424搤|U+0627C扼|
+U+06425搥|U+06376捶|
+U+06428搨|U+062D3拓|
+U+0642F搯|U+0638F掏|
+U+0643E搾|U+069A8榨|
+U+06443摃|U+0625B扛|
U+0647A摺|U+06298折|
+U+064A1撡|U+064CD操|
+U+064A6撦|U+0626F扯|
+U+064D5擕|U+0643A携|
+U+064E7擧|U+04E3E举|
+U+06529攩|U+06321挡|
+U+06537攷|U+08003考|
+U+06542敂|U+053E9叩|
+U+0654D敍|U+053D9叙|
+U+0657A敺|U+09A71驱|
U+065C2旂|U+065D7旗|
U+065E3旣|U+065E2既|
-U+06607昇|U+05347升|
+U+065E4旤|U+07978祸|
+U+065F9旹|U+065F6时|
+U+065FE旾|U+06625春|
+U+06607昇|U+06607昇|U+05347升|
+U+0662C昬|U+0660F昏|
+U+066B1暱|U+06635昵|
+U+066E1曡|U+053E0叠|
+U+0671E朞|U+0671F期|
+U+06722朢|U+0671B望|
U+0672E朮|U+0672F术|
+U+06736朶|U+06735朵|
+U+06792枒|U+04E2B桠|
+U+067B1枱|U+053F0台|
+U+067FA柺|U+062D0拐|
+U+067FB査|U+067E5查|
+U+06801栁|U+067F3柳|
+U+0681E栞|U+0520A刊|
+U+06822栢|U+067CF柏|
+U+06830栰|U+07B4F筏|
+U+06852桒|U+06851桑|
+U+0686E桮|U+0676F杯|
+U+0687A桺|U+067F3柳|
U+068CA棊|U+068CB棋|
+U+06900椀|U+07897碗|
+U+06909椉|U+04E58乘|
+U+06917椗|U+07887碇|
+U+06936椶|U+068D5棕|
+U+06937椷|U+07F04缄|
+U+0693E椾|U+07B3A笺|
+U+06965楥|U+06966楦|
U+069A6榦|U+05E72干|
U+069D3槓|U+06760杠|
+U+069D5槕|U+0684C桌|
U+06A11樑|U+06881梁|
+U+06A5C橜|U+06A5B橛|
+U+06AC8櫈|U+051F3凳|
U+06B05欅|U+06989榉|
+U+06B1D欝|U+090C1郁|
+U+06B35欵|U+06B3E款|
U+06B4E歎|U+053F9叹|
+U+06B5B歛|U+0655B敛|
+U+06B74歴|U+05386历|
+U+06B80殀|U+0592D夭|
U+06BAD殭|U+050F5僵|
+U+06BBB殻|U+058F3壳|
+U+06BE7毧|U+07ED2绒|
+U+06BEC毬|U+07403球|
+U+06C0A氊|U+06BE1毡|
+U+06C37氷|U+051B0冰|
U+06C59汙|U+06C61污|
+U+06C5A汚|U+06C61污|
+U+06C88瀋|U+06C88沈|U+0700B渖|
U+06CDD泝|U+06EAF溯|
U+06D29洩|U+06CC4泄|
+U+06D96涖|U+08385莅|
U+06DD2淒|U+051C4凄|
+U+06DDB淛|U+06D59浙|
U+06DE8淨|U+051C0净|
U+06DE9淩|U+051CC凌|
U+06E67湧|U+06D8C涌|
+U+06E7B湻|U+06DF3淳|
+U+06E7C湼|U+06D85涅|
+U+06EBC溼|U+06E7F湿|
U+06ED9滙|U+06C47汇|
+U+06EDB滛|U+06DEB淫|
+U+06EF7滷|U+05364卤|
+U+06F44潄|U+06F31漱|
+U+06F59潙|U+06CA9沩|
+U+06F81澁|U+06DA9涩|
U+06F90澐|U+06C84沄|
U+06FBE澾|U+03CE0㳠|
+U+06FC7濇|U+06DA9涩|
U+06FDB濛|U+06FDB濛|U+08499蒙|
+U+06FF6濶|U+09614阔|
U+07030瀰|U+05F25弥|
+U+0704B灋|U+06CD5法|
+U+070D6烖|U+0707E灾|
+U+07151煑|U+0716E煮|
+U+07157煗|U+06696暖|
+U+07188熈|U+07199熙|
+U+071C4燄|U+07130焰|
+U+071C9燉|U+07096炖|U+071C9燉|
U+071EC燬|U+06BC1毁|
+U+071FB燻|U+0718F熏|
+U+07217爗|U+070E8烨|
U+07232爲|U+04E3A为|
+U+07240牀|U+05E8A床|
+U+0724B牋|U+07B3A笺|
+U+0724E牎|U+07A97窗|
+U+07250牐|U+095F8闸|
+U+07253牓|U+0699C榜|
+U+07255牕|U+07A97窗|
+U+07260牠|U+05B83它|
+U+07274牴|U+062B5抵|
+U+072E5狥|U+05F87徇|
+U+07302猂|U+0608D悍|
+U+07328猨|U+0733F猿|
U+07343獃|U+05446呆|
+U+07358獘|U+06BD9毙|
+U+07367獧|U+072F7狷|
+U+07385玅|U+05999妙|
+U+07416琖|U+076CF盏|
+U+07431琱|U+096D5雕|
+U+07447瑇|U+073B3玳|
+U+0746F瑯|U+07405琅|
+U+074A2璢|U+07460瑠|
+U+0750E甎|U+07816砖|
U+07515甕|U+074EE瓮|
-U+07526甦|U+082CF苏|
-U+0752F甯|U+05B81宁|
+U+07516甖|U+07F42罂|
+U+0751E甞|U+05C1D尝|
+U+07523産|U+04EA7产|
+U+07526甦|U+07526甦|U+082CF苏|
+U+0752F甯|U+0752F甯|U+05B81宁|
+U+07542畂|U+04EA9亩|
+U+07546畆|U+04EA9亩|
+U+07567畧|U+07565略|
U+0756B畫|U+0753B画|U+05212划|
+U+0756E畮|U+04EA9亩|
+U+07571畱|U+07559留|
U+07575畵|U+0753B画|U+05212划|
+U+0758E疎|U+0758F疏|
+U+07598疘|U+0809B肛|
+U+075BF疿|U+075F1痱|
+U+075D0痐|U+086D4蛔|
U+075E0痠|U+09178酸|
+U+075FA痺|U+075F9痹|
+U+07609瘉|U+06108愈|
+U+07616瘖|U+05591喑|
+U+0763B瘻|U+07618瘘|
+U+07644癄|U+06194憔|
+U+07645癅|U+07624瘤|
+U+07648癈|U+05E9F废|
U+07652癒|U+06108愈|
U+07661癡|U+075F4痴|
+U+07681皁|U+07682皂|
+U+07690皐|U+0768B皋|
+U+0769C皜|U+07693皓|
+U+076B7皷|U+09F13鼓|
U+076C3盃|U+0676F杯|
+U+076C7盇|U+076CD盍|
+U+076CC盌|U+07897碗|
+U+0770E眎|U+089C6视|
U+0771E眞|U+0771F真|
+U+07721眡|U+089C6视|
+U+07760睠|U+07737眷|
+U+0776A睪|U+0777E睾|
+U+07787瞇|U+0772F眯|
+U+07796瞖|U+07FF3翳|
U+077AD瞭|U+04E86了|
-U+077C7矇|U+08499蒙|
+U+077C1矁|U+07785瞅|
+U+077C7矇|U+08499蒙|U+077C7矇|
+U+077D9矙|U+077B0瞰|
+U+07832砲|U+070AE炮|
U+07843硃|U+06731朱|
-U+07895碕|U+057FC埼|
+U+07881碁|U+068CB棋|
+U+078AA碪|U+07827砧|
+U+078DF磟|U+0788C碌|
+U+07906礆|U+078B1碱|
+U+0792E礮|U+070AE炮|
+U+07955祕|U+079D8秘|
U+07958祘|U+07B97算|
+U+079CA秊|U+05E74年|
+U+079CC秌|U+079CB秋|
+U+079D6秖|U+053EA只|
+U+07A09稉|U+07CB3粳|
U+07A1C稜|U+068F1棱|
+U+07A2C稬|U+07CEF糯|
+U+07A2D稭|U+079F8秸|
+U+07A3E稾|U+07A3F稿|
+U+07A64穤|U+07CEF糯|
+U+07A68穨|U+09893颓|
+U+07A7D穽|U+09631阱|
+U+07A93窓|U+07A97窗|
+U+07AB0窰|U+07A91窑|
+U+07ABB窻|U+07A97窗|
+U+07AC8竈|U+07076灶|
+U+07ADA竚|U+04F2B伫|
+U+07ADD竝|U+05E76并|
+U+07AE2竢|U+04FDF俟|
+U+07AEA竪|U+07AD6竖|
+U+07B5E筞|U+07B56策|
+U+07B69筩|U+07B52筒|
+U+07B6F筯|U+07BB8箸|
U+07B87箇|U+04E2A个|
+U+07B92箒|U+05E1A帚|
+U+07BA0箠|U+068F0棰|
+U+07BDB篛|U+07BAC箬|
U+07C11簑|U+084D1蓑|
+U+07C12簒|U+07BE1篡|
+U+07C2E簮|U+07C2A簪|
+U+07C37簷|U+06A90檐|
+U+07C50籐|U+085E4藤|
U+07C64籤|U+07B7E签|
U+07C72籲|U+05401吁|
+U+07C83粃|U+079D5秕|
+U+07CA7粧|U+05986妆|
+U+07CC9糉|U+07CBD粽|
U+07CF0糰|U+056E2团|
+U+07D25紥|U+0624E扎|
U+07D2E紮|U+0624E扎|
+U+07D43絃|U+05F26弦|
+U+07D4F絏|U+07EC1绁|
+U+07D89綉|U+07EE3绣|
+U+07D91綑|U+06346捆|
U+07DAB綫|U+07EBF线|
U+07DB5綵|U+05F69彩|U+0433D䌽|
+U+07DD0緐|U+07E41繁|
+U+07DD1緑|U+07EFF绿|
+U+07DD4緔|U+07EF1绱|
+U+07DDA線|U+07EBF线|U+07F10缐|
+U+07DDC緜|U+07EF5绵|
+U+07DE5緥|U+08913褓|
+U+07DFC緼|U+07F0A缊|
+U+07E27縧|U+07EE6绦|
U+07E34縴|U+07EA4纤|
U+07E50繐|U+07A57穗|
+U+07E56繖|U+04F1E伞|
+U+07E59繙|U+07FFB翻|
+U+07E66繦|U+08941襁|
+U+07E6E繮|U+07F30缰|
U+07E94纔|U+0624D才|
+U+07F47罇|U+06A3D樽|
+U+07F4B罋|U+074EE瓮|
U+07F4E罎|U+0575B坛|
+U+07F78罸|U+07F5A罚|
+U+07F97羗|U+07F8C羌|
+U+07FA2羢|U+07ED2绒|
+U+07FA3羣|U+07FA4群|
U+07FA8羨|U+07FA1羡|
+U+07FB6羶|U+081BB膻|
+U+07FC4翄|U+07FC5翅|
+U+07FEB翫|U+073A9玩|
+U+07FF6翶|U+07FF1翱|
+U+08021耡|U+09504锄|
+U+0808E肎|U+080AF肯|
+U+08090肐|U+080F3胳|
+U+080A7肧|U+080DA胚|
+U+080F7胷|U+080F8胸|
+U+08103脃|U+08106脆|
+U+08107脇|U+080C1胁|
+U+08117脗|U+0543B吻|
U+08123脣|U+05507唇|
+U+08141腁|U+080FC胼|
+U+08193膓|U+080A0肠|
+U+081C8臈|U+0814A腊|
+U+081CB臋|U+081C0臀|
+U+081D5臕|U+08198膘|
+U+081D9臙|U+080ED胭|
+U+081DD臝|U+088F8裸|
U+081E5臥|U+05367卧|
+U+081EF臯|U+0768B皋|
+U+08216舖|U+094FA铺|
U+08218舘|U+09986馆|
-U+083F4菴|U+05EB5庵|
+U+08229舩|U+08239船|
+U+08262艢|U+06A2F樯|
+U+08263艣|U+06A79橹|
+U+0826A艪|U+06A79橹|
+U+082B2芲|U+082B1花|
+U+08318茘|U+08354荔|
+U+08373荳|U+08C46豆|
+U+083F8菸|U+070DF烟|
+U+08432萲|U+08431萱|
U+08457著|U+08457著|U+07740着|
+U+08460葠|U+053C2参|
+U+0846F葯|U+0836F药|
+U+08493蒓|U+083BC莼|
+U+084C6蓆|U+05E2D席|
+U+084E1蓡|U+053C2参|
+U+084F4蓴|U+083BC莼|
+U+08514蔔|U+0535C卜|
+U+08515蔕|U+08482蒂|
U+08518蔘|U+053C2参|
+U+0855A蕚|U+0843C萼|
+U+0857F蕿|U+08431萱|
U+08591薑|U+059DC姜|
U+085C9藉|U+085C9藉|U+0501F借|
+U+085F4藴|U+08574蕴|
+U+085F7藷|U+085AF薯|
+U+085FC藼|U+08431萱|
+U+08610蘐|U+08431萱|
+U+08613蘓|U+082CF苏|
+U+08624蘤|U+082B1花|
+U+08698蚘|U+086D4蛔|
+U+086D5蛕|U+086D4蛔|
+U+0870B蜋|U+08782螂|
+U+08716蜖|U+086D4蛔|
+U+08728蜨|U+08776蝶|
+U+08768蝨|U+08671虱|
+U+0876F蝯|U+0733F猿|
+U+08771蝱|U+0867B虻|
+U+0878E螎|U+0878D融|
+U+087A1螡|U+0868A蚊|
+U+087C1蟁|U+0868A蚊|
+U+087C7蟇|U+087C6蟆|
U+0880D蠍|U+0874E蝎|
+U+0880F蠏|U+087F9蟹|
+U+08812蠒|U+08327茧|
+U+08814蠔|U+0869D蚝|
+U+0882D蠭|U+08702蜂|
+U+08842衂|U+08844衄|
+U+08846衆|U+04F17众|
+U+08847衇|U+08109脉|
U+0884A衊|U+08511蔑|
+U+08856衖|U+05F04弄|
+U+0885E衞|U+0536B卫|
+U+0887A衺|U+090AA邪|
+U+0889F袟|U+05E19帙|
+U+088B5袵|U+0887D衽|
+U+088CC裌|U+088B7袷|
U+088CF裏|U+091CC里|
-U+08946襆|U+05E5E幞|
+U+088E0裠|U+088D9裙|
+U+0892D褭|U+08885袅|
+U+08943襃|U+08912褒|
+U+0894D襍|U+06742杂|
U+08986覆|U+08986覆|U+0590D复|
+U+08987覇|U+09738霸|
+U+08988覈|U+06838核|
+U+0898A覊|U+07F81羁|
+U+08994覔|U+089C5觅|
+U+089A9覩|U+07779睹|
+U+089D4觔|U+065A4斤|
+U+089DD觝|U+062B5抵|
U+08A17託|U+06258托|U+08BAC讬|
-U+08AEE諮|U+054A8咨|U+08C18谘|
+U+08A3C証|U+08BC1证|
+U+08A76詶|U+0916C酬|
+U+08A96誖|U+06096悖|
+U+08AAC説|U+08BF4说|
+U+08AEE諮|U+08C18谘|U+054A8咨|
+U+08B0C謌|U+06B4C歌|
+U+08B21謡|U+08C23谣|
+U+08B2D謭|U+08C2B谫|
+U+08B41譁|U+054D7哗|
+U+08B46譆|U+0563B嘻|
+U+08B4C譌|U+08BB9讹|
+U+08B54譔|U+064B0撰|
+U+08B5F譟|U+0566A噪|
U+08B6D譭|U+06BC1毁|
-U+08B8E讎|U+04EC7仇|
+U+08B81讁|U+08C2A谪|
+U+08B8E讎|U+04EC7仇|U+096E0雠|
+U+08B90讐|U+096E0雠|
U+08B9A讚|U+08D5E赞|
+U+08C53豓|U+08273艳|
U+08C54豔|U+08273艳|
+U+08C8D貍|U+072F8狸|
+U+08C9B貛|U+0737E獾|
+U+08CC9賉|U+06064恤|
+U+08CDB賛|U+08D5E赞|
+U+08CEB賫|U+08D4D赍|
+U+08CF7賷|U+08D4D赍|
+U+08D0B贋|U+08D5D赝|
+U+08D11贑|U+08D63赣|
+U+08D1C贜|U+08D43赃|
+U+08D82趂|U+08D81趁|
+U+08DE5跥|U+08DFA跺|
+U+08DF4跴|U+08E29踩|
+U+08E01踁|U+080EB胫|
+U+08E2B踫|U+078B0碰|
+U+08E30踰|U+0903E逾|
+U+08E4F蹏|U+08E44蹄|
+U+08E54蹔|U+06682暂|
+U+08E5F蹟|U+08FF9迹|
+U+08E60蹠|U+08DD6跖|
+U+08E67蹧|U+07CDF糟|
+U+08E75蹵|U+08E74蹴|
+U+08EAD躭|U+0803D耽|
+U+08EB3躳|U+08EAC躬|
+U+08EB6躶|U+088F8裸|
+U+08F19輙|U+08F84辄|
+U+08F2D輭|U+08F6F软|
+U+08F3C輼|U+08F92辒|
+U+08FA0辠|U+07F6A罪|
+U+08FA2辢|U+08FA3辣|
+U+08FA4辤|U+08F9E辞|
+U+08FB3辳|U+0519C农|
U+08FF4迴|U+056DE回|
+U+08FFB迻|U+079FB移|
+U+09008逈|U+08FE5迥|
+U+09025逥|U+056DE回|
+U+09029逩|U+05954奔|
+U+0902C逬|U+08FF8迸|
U+09031週|U+05468周|
+U+09049遉|U+04FA6侦|
U+0904A遊|U+06E38游|
U+09061遡|U+06EAF溯|
+U+0906F遯|U+09041遁|
+U+09076遶|U+07ED5绕|
+U+09156酖|U+09E29鸩|
+U+09167酧|U+0916C酬|
+U+09183醃|U+0814C腌|
+U+09186醆|U+076CF盏|
+U+09195醕|U+09187醇|
U+091A3醣|U+07CD6糖|
U+091AF醯|U+09170酰|
+U+091BB醻|U+0916C酬|
+U+091BC醼|U+05BB4宴|
+U+091E6釦|U+06263扣|
+U+091EC釬|U+0710A焊|
+U+09205鈅|U+094A5钥|
+U+0920E鈎|U+094A9钩|
+U+09246鉆|U+094BB钻|
+U+09262鉢|U+094B5钵|
+U+092B2銲|U+0710A焊|
+U+092ED鋭|U+09510锐|
+U+09332録|U+05F55录|
+U+09341鍁|U+09528锨|
U+0934A鍊|U+070BC炼|U+094FE链|
+U+0936B鍫|U+09539锹|
+U+09373鍳|U+09274鉴|
+U+0937E鍾|U+0953A锺|U+0949F钟|
U+0938C鎌|U+09570镰|
+U+09397鎗|U+067AA枪|
+U+0939A鎚|U+09524锤|
U+093AD鎭|U+093AE镇|
+U+093AD鎭|U+09547镇|
+U+093B8鎸|U+0954C镌|
+U+093BB鎻|U+09501锁|
U+093DA鏚|U+0621A戚|
+U+0941D鐝|U+09562镢|
U+09451鑑|U+09274鉴|
-U+0955F镟|U+065CB旋|
+U+0945A鑚|U+094BB钻|
+U+0945B鑛|U+077FF矿|
+U+09464鑤|U+05228刨|
+U+09475鑵|U+07F50罐|
+U+09482钂|U+0954B镋|
U+09592閒|U+095F2闲|
-U+095A4閤|U+05408合|
+U+09599閙|U+095F9闹|
+U+095A4閤|U+09601阁|U+05408合|
+U+095A7閧|U+054C4哄|
+U+095B2閲|U+09605阅|
+U+095C7闇|U+06697暗|
+U+095DA闚|U+07AA5窥|
U+095E2闢|U+08F9F辟|
+U+09628阨|U+05384厄|
U+0962A阪|U+0962A阪|U+05742坂|
-U+0965E陞|U+05347升|
+U+0962C阬|U+05751坑|
+U+09657陗|U+05CED峭|
+U+0965C陜|U+09655陕|
+U+0965E陞|U+0965E陞|U+05347升|
+U+0967B陻|U+05819堙|
+U+0967F陿|U+072ED狭|
+U+09682隂|U+09634阴|
+U+09684隄|U+05824堤|
+U+09696隖|U+0575E坞|
+U+096A3隣|U+090BB邻|
+U+096B7隷|U+096B6隶|
+U+0976D靭|U+097E7韧|
+U+09771靱|U+097E7韧|
+U+0978C鞌|U+0978D鞍|
U+097A6鞦|U+079CB秋|U+097A7鞧|
+U+097B5鞵|U+0978B鞋|
+U+097BE鞾|U+09774靴|
U+097C6韆|U+05343千|
-U+097DD韝|U+097B2鞲|
+U+097C8韈|U+0889C袜|
+U+097E4韤|U+0889C袜|
+U+097EE韮|U+097ED韭|
+U+0981F頟|U+0989D额|
+U+0983C頼|U+08D56赖|
+U+0983D頽|U+09893颓|
+U+09847顇|U+060B4悴|
+U+0984B顋|U+0816E腮|
+U+09854顔|U+0989C颜|
U+09858願|U+0613F愿|
+U+09866顦|U+06194憔|
+U+098C3飃|U+098D8飘|
+U+098DC飜|U+07FFB翻|
+U+098E4飤|U+09972饲|
U+098F1飱|U+098E7飧|
-U+09918餘|U+04F59余|U+09980馀|
-U+09931餱|U+07CC7糇|
-U+09935餵|U+05582喂|
+U+09901餁|U+0996A饪|
+U+09908餈|U+07CCD糍|
+U+09918餘|U+09980馀|U+04F59余|
+U+09939餹|U+07CD6糖|
+U+0993B餻|U+07CD5糕|
+U+0993D餽|U+09988馈|
+U+0994D饍|U+081B3膳|
+U+09951饑|U+09965饥|
+U+0995D饝|U+0998D馍|
+U+099C8駈|U+09A71驱|
+U+099E1駡|U+09A82骂|
+U+099EE駮|U+09A73驳|
+U+09A10騐|U+09A8C验|
+U+09A23騣|U+09B03鬃|
+U+09A58驘|U+09AA1骡|
+U+09ABD骽|U+0817F腿|
+U+09ABE骾|U+09CA0鲠|
+U+09AC8髈|U+08180膀|
+U+09AE3髣|U+04EFF仿|
+U+09AE5髥|U+09AEF髯|
+U+09AF4髴|U+04F5B佛|
+U+09B00鬀|U+05243剃|
+U+09B09鬉|U+09B03鬃|
+U+09B26鬦|U+06597斗|
U+09B28鬨|U+054C4哄|
+U+09B2A鬪|U+06597斗|
+U+09B2D鬭|U+06597斗|
+U+09B30鬰|U+090C1郁|
+U+09B8E鮎|U+09C87鲇|
+U+09B9D鮝|U+09C9E鲞|
+U+09BF0鯰|U+09CB6鲶|U+09C87鲇|
+U+09C10鰐|U+09CC4鳄|
+U+09C1B鰛|U+09CC1鳁|
+U+09C2E鰮|U+09CC1鳁|
+U+09CEC鳬|U+051EB凫|
+U+09D08鴈|U+096C1雁|
+U+09D5E鵞|U+09E45鹅|
U+09D70鵰|U+096D5雕|U+05F6B彫|
+U+09D76鵶|U+09E26鸦|
+U+09DC0鷀|U+09E5A鹚|
+U+09DC4鷄|U+09E21鸡|
+U+09DF0鷰|U+071D5燕|
+U+09DF4鷴|U+09E47鹇|
+U+09E0E鸎|U+083BA莺|
+U+09E7B鹻|U+078B1碱|
U+09E7C鹼|U+078B1碱|U+07877硷|
U+09EAA麪|U+09762面|
U+09EAB麫|U+09762面|
U+09EAF麯|U+066F2曲|
-U+09EB4麴|U+066F2曲|U+09EB4麴|
+U+09EB4麴|U+09EB9麹|U+066F2曲|
+U+09EB5麵|U+09762面|U+09EBA麺|
U+09EF4黴|U+09709霉|
+U+09F03鼃|U+086D9蛙|
+U+09F07鼇|U+09CCC鳌|
+U+09F08鼈|U+09CD6鳖|
U+09F15鼕|U+051AC冬|
-U+09F47齇|U+09F44齄|
U+09F63齣|U+051FA出|
-U+09F91龑|U+04DAE䶮|
+U+09F67齧|U+0556E啮|
+U+09F69齩|U+054AC咬|
+U+201EE𠇮|U+0547D命|
+U+20302𠌂|U+04F1E伞|
+U+20542𠕂|U+0518D再|
+U+20545𠕅|U+0518D再|
+U+20587𠖇|U+051A5冥|
+U+207B0𠞰|U+0527F剿|
+U+20ABE𠪾|U+05386历|
+U+20D1F𠴟|U+054A9咩|
+U+20EF3𠻳|U+055FD嗽|
+U+21428𡐨|U+091CE野|
+U+21681𡚁|U+05F0A弊|
+U+21A18𡨘|U+051A4冤|
+U+21A25𡨥|U+05BC7寇|
+U+21B36𡬶|U+05BFB寻|
U+21ED5𡻕|U+05C81岁|
-U+298F5𩣵|U+299FB𩧻|
+U+22B38𢬸|U+062EC括|
+U+22B4F𢭏|U+06363捣|
+U+22BA5𢮥|U+064CD操|
+U+22DEC𢷬|U+06363捣|
+U+2365C𣙜|U+069B7榷|
+U+242EE𤋮|U+07199熙|
+U+24A0F𤨏|U+07410琐|
+U+24C1C𤰜|U+04EA9亩|
+U+24C48𤱈|U+04EA9亩|
+U+24C4A𤱊|U+07559留|
+U+24EA5𤺥|U+07629瘩|
+U+25128𥄨|U+07785瞅|
+U+25997𥦗|U+07A97窗|
+U+25CBB𥲻|U+07E82纂|
+U+260B3𦂳|U+07D27紧|
+U+260C2𦃂|U+07D27紧|
+U+26246𦉆|U+078B4碴|
+U+262B1𦊱|U+06302挂|
+U+26351𦍑|U+07F8C羌|
+U+26548𦕈|U+07707眇|
+U+26A99𦪙|U+0447D䑽|
+U+26D4F𦵏|U+0846C葬|
+U+28F7B𨽻|U+096B6隶|
+U+294D0𩓐|U+08116脖|
+U+295D7𩗗|U+098D3飓| \ No newline at end of file
diff --git a/maintenance/language/zhtable/trad2simp_noconvert.manual b/maintenance/language/zhtable/trad2simp_noconvert.manual
index 052bab69..15192eaf 100644
--- a/maintenance/language/zhtable/trad2simp_noconvert.manual
+++ b/maintenance/language/zhtable/trad2simp_noconvert.manual
@@ -3,3 +3,12 @@
=>"獃"
𫚭
+咤
+吒
+曏
+痾
+枒
+幺
+苹
+厘
+𫍟 \ No newline at end of file
diff --git a/maintenance/language/zhtable/tradphrases.manual b/maintenance/language/zhtable/tradphrases.manual
index 69b2c832..4d313b42 100644
--- a/maintenance/language/zhtable/tradphrases.manual
+++ b/maintenance/language/zhtable/tradphrases.manual
@@ -20,16 +20,6 @@
7隻
8隻
9隻
-0隻
-1隻
-2隻
-3隻
-4隻
-5隻
-6隻
-7隻
-8隻
-9隻
0只支援
1只支援
2只支援
@@ -58,36 +48,46 @@
至多
頂多
多隻
-0多隻
-0多隻
-零多隻
-十多隻
-百多隻
-千多隻
-萬多隻
-億多隻
這只能
這只可
這只在
這只是
這只需
+這只須
這只會
這只用
+這只比
+這只限
+這只應
+這只不過
+這只包括
那只能
那只可
那只在
那只是
那只需
+那只須
那只會
那只用
+那只怕
+那只比
+那只限
+那只應
+那只不過
+那只包括
多只能
多只可
多只在
多只有
多只是
多只需
+多只須
多只會
多只用
+多只含
+多只比
+多只限
+多只包括
大只能
大只可
大只在
@@ -102,6 +102,23 @@
小只是
小只需
小只會
+數隻
+數只能
+數只可
+數只在
+數只有
+數只是
+數只需
+數只須
+數只會
+數只含
+數只比
+數只限
+數只應
+數只包括
+人數只
+參數只
+總數只
隻身
形單影隻
首隻
@@ -134,24 +151,12 @@
7天後
8天後
9天後
-0天後
-1天後
-2天後
-3天後
-4天後
-5天後
-6天後
-7天後
-8天後
-9天後
天後來
天後天
天後半
後印
萬象
-並存著
乾絲
-乾著急
乾魚
魚乾
乾梅
@@ -176,7 +181,6 @@
淚乾
沒幹
沒乾沒淨
-枝不得大於榦
杯乾
打幹
打乾噦
@@ -249,7 +253,6 @@
乾咽
乾和
幹吏
-乾吊著下巴
乾號
乾颱
乾卦
@@ -271,136 +274,23 @@
乾麵
乾柴
枯乾
-晒乾
+曬乾
顛乾倒坤
強幹
-乾著
乾眼
幹的停當
+井幹
乾巴
偎乾
眼乾
-偷雞不著
-几絲
-划著
-划著走
-別著
-刮著
-千絲萬縷
-參合
-參考價值
-參與
-參與人員
-參與制
-參與感
-參與者
-參觀團
-參觀團體
-參閱
-吃著不盡
-合著
-吊帶褲
-吊掛著
-吊著
-吊褲
-吊褲帶
-向著
-嚴絲合縫
-回絲
-回著
-塗著
-壟斷價格
-壟斷資產
-壟斷集團
-姜絲
-帶團參加
-干著急
-幾絲
-彆著
-怎麼著
-憑藉著
-憑藉
-接著說
-擔著
-擔負著
-敘說著
-斗轉參橫
-旋繞著
-板著臉
-正當著
-沈著
-沖著
-派團參加
-涂著
-湊合著
-瀰漫著
-為著
-煙斗絲
-率團參加
-畫著
-當著
-發著
-直接參与
-睡著了
-秋褲
-積极參与
-積极參加
-簽著
-系著
-絕對參照
-絲來線去
-絲布
-絲板
-絲瓜布
-絲絨布
-絲線
-絲織廠
-絲蟲
-緊繃著
-繃著
-繃著臉
-繃著臉兒
-繫著
-罵著
肉絲麵
-背向著
-菌絲體
-著兒
-著書立說
-著色軟體
-著重指出
-著錄
-著錄規則
薑絲
-藉著
-蘊含著
-蘊涵著
-衝著
-被覆著
-覆著
-覆蓋著
反覆
-訴說著
-說著
-請參閱
-謝絕參觀
-豎著
豐濱
豐濱鄉
豐度
-象徵著
-這麼著
-那麼著
-配合著
-醞釀著
-錄著
-鍛鍊出
-關係著
雞絲
雞絲麵
-面朝著
-面臨著
-颳著
髮絲
斷髮
不斷發
@@ -411,9 +301,6 @@
打斷發
披頭散髮
髮禁
-鬥著
-鬧著玩兒
-鯰魚
世界盃
其次辟地
開闢
@@ -451,20 +338,15 @@
一彆頭
并州
併兼
-併產
併骨
併網
併線
併流
逼併
併名
-併當
併火
併肩子
-併除
併疊
-忙併
-打併
簡併
並發表
並發現
@@ -481,21 +363,8 @@
數罪併罰
催併
狂併潮
-薝蔔
提摩太後書
-當家纔知柴米價
-剛纔一載
裏海
-骨頭裡掙出來的錢纔做得肉
-恰纔
-遠縣纔至
-別日南鴻纔北去
-然身死纔數月耳
-纔得兩年
-纔則
-纔此
-你纔子發昏
-纔可容顏十五餘
不採
披榛採蘭
謬採虛聲
@@ -558,28 +427,7 @@
官地為寀
寮寀
蔘綏
-個人# “個人參數”不是“個人蔘數”
-人蔘
蕭蔘
-人參與
-人參選
-人參觀
-人參考
-人參展
-人參加
-人參議
-人參謀
-人參酌
-人參照
-人參政
-人參戰
-人參拜
-人參閱
-人參禪
-人參贊
-人參見
-人參透
-人參看
東衝西突
天克地衝
六衝
@@ -665,13 +513,6 @@
丑表功
公孫丑
么麼小丑
-齣電影
-齣電視
-齣動畫
-齣節目
-齣卡通
-齣戲
-齣劇
平平當當
滿滿當當
當當丁丁
@@ -680,7 +521,6 @@
快快當當
咯噹
啷噹
-党參
党進
党太尉
党項
@@ -739,6 +579,67 @@
髮屋
櫛髮工
鬒髮
+令人髮指
+爆發指數
+開發
+剪其髮
+吐哺捉髮
+吐哺握髮
+含齒戴髮
+大金髮苔
+寸髮千金
+心長髮短
+戴髮含齒
+拔髮
+拔鬚
+揪髮
+揪鬚
+整髮用品
+斷髮文身
+滿頭洋髮
+燙一個髮
+燙一次髮
+燙個髮
+燙完髮
+燙次髮
+理一個髮
+理一次髮
+理個髮
+理完髮
+理次髮
+細如髮
+繫於一髮
+皮膚
+生華髮
+蒼髮
+被髮佯狂
+被髮入山
+被髮左衽
+被髮纓冠
+被髮陽狂
+身體髮膚
+髮光可鑑
+髮已霜白
+髮油
+髮為血之本
+髮網
+髮踊沖冠
+髮際
+黃髮
+齒落髮白
+長髮姑娘
+長髮公主
+長髮妹
+的髮小
+是髮小
+代理發行
+美髮店
+美髮館
+美髮師
+美髮學
+美髮業
+美髮沙龍
+美容美髮
模范棒棒堂
模范三軍
模范七棒
@@ -801,19 +702,6 @@
複流
反複製
複對數
-顛覆
-答覆
-覆沒
-覆亡
-覆水難收
-翻雲覆雨
-覆雨翻雲
-覆轍
-覆巢之下無完卵
-覆蓋
-覆命
-天翻地覆
-天覆地載
撥穀
扁擬穀盜蟲
不穀
@@ -909,6 +797,7 @@
言大而夸
睏覺
愛睏
+睏了
纍堆
纍紲
纍臣
@@ -920,9 +809,7 @@
澤滲灕而下降
裏勾外連
裏手
-水里鄉
水里溪
-水里濁水溪
二里頭
年歷史
西歷史
@@ -939,7 +826,7 @@
穆罕默德曆
大明曆
大曆
-台曆
+檯曆
太初曆
通曆
曆本
@@ -997,14 +884,12 @@
懞直
老懞
放懞掙
-矇著
矇聵
矇瞍
矇事
矇頭轉
矇松雨
藏矇歌兒
-矇著鍋兒
朦朧
濛濛細雨
濛汜
@@ -1049,7 +934,6 @@
小米麵
壯麵
吃板刀麵
-吃辣麵
扯麵
搋麵
重羅麵
@@ -1064,13 +948,20 @@
湯下麵
茶麵
麵糰
+北山索麵
+土索麵
+米麵
+椒麵
+掛麵
+臊子麵
+龍鬚麵
+油潑麵
+辣麵
+肉麵
+燴麵
+雲吞麵
冷面相
糞穢衊面
-湟潦生苹
-食野之苹
-苹縈
-青苹
-青蘋果
僕僕
有僕
冉有僕
@@ -1091,6 +982,8 @@
僮僕
金僕姑
僕婢
+惡僕
+從僕
樸實
樸訥
樸念仁
@@ -1152,10 +1045,29 @@
上簽字
上簽收
上簽寫
+上簽訂
+上簽定
+上簽署
+上簽發
+上簽約
+中簽名
+中簽字
+中簽收
+中簽寫
+中簽訂
+中簽定
+中簽署
+中簽發
+中簽約
下簽名
下簽字
下簽收
下簽寫
+下簽訂
+下簽定
+下簽署
+下簽發
+下簽約
犖确
磽确
确瘠
@@ -1186,6 +1098,7 @@
蒼朮
赤朮
朮赤
+博爾朮
髼鬆
皮鬆
濛鬆雨
@@ -1201,9 +1114,11 @@
鬆一口氣
鬆元音
鬆喉
+鬆化
囉囉囌囌
囉囌
骨罈
+菜罈
罈騞
餵驢
剪牡丹喂牛
@@ -1263,6 +1178,7 @@
鬱鬱不樂
鬱鬱寡歡
鬱鬱蔥蔥
+鬱鬱蒼蒼
鬱鬱而終
愿樸
愿而恭
@@ -1290,21 +1206,12 @@
种放
种師道
种師中
-後庄
-舊庄
正官庄
-龜山庄
-寶山庄
冬山庄
-員山庄
松山庄
厂部
-閤府
-佈道
-剪綵
衝量
衝車
-書獃子
相干
府干預
府干涉
@@ -1315,6 +1222,7 @@
一干人
未乾
未干涉
+未干預
抹乾
餅乾
拭乾
@@ -1356,8 +1264,6 @@
乾季
葡萄乾
提子乾
-蘿蔔乾
-蘋果乾
芒果乾
菠蘿乾
鳳梨乾
@@ -1376,7 +1282,7 @@
幹事
幹什麼
幹細胞
-悶著頭兒幹
+頭兒幹
配水幹管
繐幃飄井幹
站乾岸兒
@@ -1410,18 +1316,21 @@
二不稜登
有稜有角
威稜
-負債纍纍
-傷痕纍纍
+債纍纍
+果纍纍
+實纍纍
儒略曆
伊斯蘭曆
酒麴
-昇平
爾冬陞
澹臺
拜託
委託
輓曲
敬輓
+輓車
+輓輸
+輓辭
万俟
万旗
鬚鯨
@@ -1442,8 +1351,6 @@
叶韻
叶音
叶恭弘
-叶 恭弘
-叶 恭弘
於1
於2
於3
@@ -1454,16 +1361,6 @@
於8
於9
於0
-於1
-於2
-於3
-於4
-於5
-於6
-於7
-於8
-於9
-於0
於一
於二
於三
@@ -1478,7 +1375,6 @@
於夫羅
於梨華
置於
-佈於
散於
播於
國於
@@ -1635,8 +1531,6 @@
心於
集於
容於
-髒詞
-髒心
新紮
紙紮
紮鐵
@@ -1654,252 +1548,6 @@
百紮
千紮
萬紮
-佔1
-佔2
-佔3
-佔4
-佔5
-佔6
-佔7
-佔8
-佔9
-佔0
-佔1
-佔2
-佔3
-佔4
-佔5
-佔6
-佔7
-佔8
-佔9
-佔0
-佔零
-佔〇
-佔一
-佔二
-佔兩
-佔三
-佔四
-佔五
-佔六
-佔七
-佔八
-佔九
-佔十
-佔百
-佔千
-佔万
-佔億
-佔超過
-佔不足
-佔至少
-佔少
-佔至多
-佔半
-佔多
-佔大
-佔小
-佔中
-佔東
-佔西
-佔南
-佔北
-佔平均
-佔總
-獨佔鰲頭
-所佔
-市佔
-佔率
-市佔率
-佔市場
-佔世界
-佔全
-佔國內
-佔美
-佔台
-佔香
-佔澳
-佔加
-佔新
-佔馬
-佔印
-佔英
-佔法
-佔德
-佔葡
-佔俄
-佔蘇
-佔缺
-佔A
-佔B
-佔C
-佔D
-佔E
-佔F
-佔G
-佔H
-佔I
-佔J
-佔K
-佔L
-佔M
-佔N
-佔O
-佔P
-佔Q
-佔R
-佔S
-佔T
-佔U
-佔V
-佔W
-佔X
-佔Y
-佔Z
-佔a
-佔b
-佔c
-佔d
-佔e
-佔f
-佔g
-佔h
-佔i
-佔j
-佔k
-佔l
-佔m
-佔n
-佔o
-佔p
-佔q
-佔r
-佔s
-佔t
-佔u
-佔v
-佔w
-佔x
-佔y
-佔z
-佔A
-佔B
-佔C
-佔D
-佔E
-佔F
-佔G
-佔H
-佔I
-佔J
-佔K
-佔L
-佔M
-佔N
-佔O
-佔P
-佔Q
-佔R
-佔S
-佔T
-佔U
-佔V
-佔W
-佔X
-佔Y
-佔Z
-佔a
-佔b
-佔c
-佔d
-佔e
-佔f
-佔g
-佔h
-佔i
-佔j
-佔k
-佔l
-佔m
-佔n
-佔o
-佔p
-佔q
-佔r
-佔s
-佔t
-佔u
-佔v
-佔w
-佔x
-佔y
-佔z
-佔不佔
-不佔
-佔了
-佔穩
-佔資源
-佔人便宜
-佔頭
-佔道
-佔屋
-佔網
-佔床
-佔座
-佔分
-佔飯
-佔個位
-佔後
-佔著
-佔山
-馬占山
-佔比
-佔停車
-佔哺乳
-佔下風
-少佔
-多佔
-費佔
-佔查
-佔壓
-佔優
-佔劣
-穩佔
-佔整體
-佔局部
-日佔
-美佔
-英佔
-德佔
-法佔
-俄佔
-葡佔
-西佔
-奧佔
-意佔
-義佔
-地佔
-佔場
-佔耕
-狂佔
-徵佔
-圈佔
-已佔
-佔囁
-佔主
-佔次
-寡佔
-佔去
-將佔
-將占卜
-要佔
-要占卜
-會佔
-會占卜
-占卜
-夢有五不占
-占有五不驗
誌異
筑前
筑後
@@ -2012,12 +1660,8 @@
鐘表面
南京鐘
南京鐘錶
-造鐘錶
造鐘
-九龍表行
-鐘錶行
鐘行
-錶行
小型鐘表面
小型鐘面
小型鐘錶
@@ -2054,12 +1698,8 @@
他鐘
寺鐘
座鐘
-盜鐘
大笨鐘
大本鐘
-鐘錶歷史
-錶的歷史
-鐘錶的歷史
點多鐘
點半鐘
分多鐘
@@ -2070,9 +1710,6 @@
操作鐘
南屏晚鐘
敲鐘
-瞧著鐘
-瞧著鐘錶
-瞧著錶
警報鐘
猶如鐘
猶如鐘錶
@@ -2085,10 +1722,7 @@
鐘差
任何鐘錶
任何鐘
-任何錶
-任何表示
-任何表達
-任何表演
+手錶
選手表現
選手表達
選手表示
@@ -2104,8 +1738,6 @@
鐘速
紅鐘
各類鐘
-打著鐘
-鐘意
衛星鐘
該鐘
錶轉
@@ -2119,23 +1751,14 @@
逆鐘
拂鐘無聲
鐘不空則啞
-看著鐘錶
-看著鐘
-看著錶
晚鐘
潛水鐘錶
潛水鐘
潛水錶
樂器鐘
鐘左右
-埋頭尋鐘錶
-埋頭尋鐘
-埋頭尋錶
鐘陳列
驚鐘
-望著鐘錶
-望著鐘
-望著錶
鐘錶停
鐘停
銫鐘
@@ -2162,10 +1785,6 @@
華嚴鐘
懷鐘
生物鐘
-鐘錶的
-錶的嘀嗒
-的鐘錶
-嘀嗒的錶
鐘好
鐘太
鐘不
@@ -2185,9 +1804,18 @@
舊錶
台鐘
鐘響
-叩鐘
計時錶
防水錶
+顯示表格
+顯示表頭
+顯示表面
+顯示表達
+顯示表明
+顯示表現
+顯示表示
+電錶
+水錶
+咪錶
射鵰
神鵰
神雕像
@@ -2200,8 +1828,7 @@
村落發
蛇髮女妖
畢生發展
-對華發動
-中美發表
+對華發
尸魂界
樹樑
屋樑
@@ -2209,152 +1836,20 @@
柱樑
下樑
上梁山
-昇陽
僥倖
夏遊
秋遊
冬遊
+傲遊 # 浏览器名
+網遊
+桌遊
+遊輪
+遊牧
+遊蕩
+遊刃
黑奴籲天錄
林郁方
讚歌
-編餘
-餘墨
-唾餘
-餘韻
-歸餘
-公餘
-寬餘
-餘糧
-餘慶
-餘殃
-餘燼
-劫餘
-結餘
-燼餘
-淨餘
-餕餘
-餘暉
-餘輝
-羨餘
-餘悸
-心餘
-刑餘
-緒餘
-血餘
-朱慶餘
-諸餘
-餘論
-茶餘
-廚餘
-餘裕
-餘氣
-詩餘
-詞餘
-餘僇
-餘辜
-餘責
-餘罪
-無餘
-耳餘
-餘烈
-餘思
-鹽餘
-嬴餘
-贏餘
-王餘魚
-紆餘
-餘波
-餘杯
-餘步
-餘妙
-餘音
-餘聲
-餘明
-餘風
-餘黨
-餘毒
-餘桃
-餘桶
-餘利
-餘瀝
-餘膏
-餘光
-餘杭
-餘竅
-餘缺
-餘暇
-餘閒
-餘羨
-餘響
-餘興
-餘蓄
-餘緒
-餘珍
-餘眾
-餘酲
-餘喘
-餘食
-餘熱
-餘刃
-餘閏
-餘存
-餘業
-餘姚
-餘蔭
-餘映
-餘外
-餘威
-餘味
-餘溫
-餘勇
-多餘
-剩餘
-餘生
-餘歡
-有餘
-一餘
-二餘
-兩餘
-三餘
-四餘
-五餘
-六餘
-七餘
-八餘
-九餘
-十餘
-百餘
-千餘
-萬餘
-億餘
-兆餘
-0餘
-1餘
-2餘
-3餘
-4餘
-5餘
-6餘
-7餘
-8餘
-9餘
-0餘
-1餘
-2餘
-3餘
-4餘
-5餘
-6餘
-7餘
-8餘
-9餘
-余姓
-余光生
-余光中
-余思敏
-余威德
-余子明
-余三勝
崑山
崑曲
崑腔
@@ -2362,36 +1857,19 @@
崑劇
崑蘇
蘇崑
-分布圖
一干家中
星期後
-不准你
-不准我
-不准他
-不准她
-不准它
-不准誰
-不准許
-准不准你
-准不准我
-准不准他
-准不准她
-准不准它
-准不准誰
-准不准許
依依不捨
戀戀不捨
窮追不捨
緊追不捨
鍥而不捨
稜登
-前言不答後語
繃扒弔拷
不弔
不通弔慶
陪弔
盆弔
-屁股大弔了心
撇弔
憑弔
門弔兒
@@ -2400,37 +1878,27 @@
搗鬼弔白
弔膀子
弔民
-弔民伐罪
弔奠
弔頭
弔古
-弔古尋幽
弔詭
-弔詭矜奇
弔客
弔拷
-弔拷繃扒
弔扣
弔賀迎送
弔鶴
弔喉
弔謊
弔祭
+弔恤
弔腳兒事
-弔頸
-弔橋
弔取
弔孝
弔紙
弔者大悅
-弔場
-弔書
弔詞
-弔死問孤
-弔死問疾
弔撒
弔喪
-弔喪問疾
弔腰撒跨
弔唁
弔宴
@@ -2439,10 +1907,7 @@
弔慰
弔文
弔問
-頭巾弔在水裡
-提心弔膽
弄鬼弔猴
-管人弔腳兒事
開弔
鶴弔
昊天不弔
@@ -2451,12 +1916,9 @@
吉凶慶弔
蟣蝨相弔
祭弔
-祭弔文
-青蠅弔客
慶弔
-形影相弔
+影相弔
哀弔
-一弔
唁弔
於水
安於
@@ -2534,7 +1996,6 @@
源於
且於
長於
-短於
現於
較於
於之
@@ -2545,9 +2006,10 @@
晚於
感於
鬼谷子
+谷子敬
+洪谷子
于美人
緊緻
-冗餘
曰云
若干
徵婚
@@ -2614,7 +2076,7 @@
鬥風
鬥雪紅
鬥暴
-鬥閑氣
+鬥閒氣
龍鬥虎傷
殷師牛鬥
二虎相鬥
@@ -2638,82 +2100,7 @@
藏歷史
頁面
方面
-表面
面條目
-課餘
-節餘
-盈餘
-病餘
-餘地
-餘力
-餘子
-餘事
-扶餘國
-腐餘
-富餘
-之餘
-餘澤
-流風餘俗
-流風餘韻
-淋餘土
-餘一
-餘二
-餘三
-餘四
-餘五
-餘六
-餘七
-餘八
-餘九
-餘十
-零餘
-〇餘
-餘零
-餘〇
-餘1
-餘2
-餘3
-餘4
-餘5
-餘6
-餘7
-餘8
-餘9
-餘0
-餘1
-餘2
-餘3
-餘4
-餘5
-餘6
-餘7
-餘8
-餘9
-餘0
-餘數
-其餘
-尸居餘氣
-賸餘
-餘孽
-殘餘
-業餘
-餘割
-餘款
-餘角
-餘切
-餘霞
-餘下
-餘弦
-餘震
-餘貾
-餘額
-禹餘糧
-餘人
-編余
-病余
-餘俗
-餘倍
-同餘
大讚
唄讚
褒讚
@@ -2782,42 +2169,7 @@
本徵
船鐘
黃鈺筑
-齊莊
-鴻案相莊
-項莊
-韋莊
-鍋莊
-鄭莊公
-通莊
-蒙莊
-端莊
-票莊
-矜莊
-楚莊問鼎
-楚莊絕纓
-整莊
-打路莊板
-莊騷
-莊語
-莊舄越吟
-莊房
-莊客
-莊農
-平泉莊
-布莊
香山庄
-寶莊
-坐莊
-周莊王
-發莊
-卞莊
-包莊
-剔莊貨
-劉克莊
-冷莊子
-石家莊
-卞莊子
-新莊市
當準
憑準
沒準
@@ -2838,7 +2190,6 @@
三準
鵝準
有準
-崑崙
鎌倉
請君入甕
甕安
@@ -2849,8 +2200,39 @@
癒合
槓桿
宣洩
+鑑別
+鑑察
+鑑定
+鑑戒
+鑑諒
+鑑賞
+鑑於
+鑑證
+鑑湖
+鑑識
+鑑藏
+鑑往知來
+品鑑
+評鑑
+可鑑
+為鑑
+之鑑
+鑑古
+明鑑
+寶鑑
+破鑑
+年鑑
圖鑑
-諮詢
+通鑑
+綱鑑
+鸞鑑
+借鑑
+龜鑑
+衡鑑
+史鑑
+殷鑑
+印鑑
+王鑑
勳章
張勳
趙治勳
@@ -2871,7 +2253,9 @@
兇槍
很兇
兇巴巴
-行兇前
+頂兇
+太兇
+好兇
凝鍊
鍊貧
鍊度
@@ -2968,30 +2352,8 @@
母醜
一齣子
齣兒
-賣獃
-發獃
-大獃
-獃獃
-獃等
-獃頭
-獃腦
-獃根
-獃磕
-獃憨獃
-獃話
-獃氣
-獃想
-獃性
-獃滯
-獃著
-獃痴
獃串了皮
-獃事
-獃人
-獃子
-好獃
占便宜的是獃
-阿獃
丰標
丰姿
丰韻
@@ -3002,56 +2364,6 @@
撲鼕鼕
普鼕鼕
鼕鼕鼓
-令人髮指
-爆發指數
-開發
-剪其髮
-吐哺捉髮
-吐哺握髮
-含齒戴髮
-大金髮苔
-寸髮千金
-心長髮短
-戴髮含齒
-拔髮
-拔鬚
-揪髮
-揪鬚
-整髮用品
-斷髮文身
-滿頭洋髮
-燙一個髮
-燙一次髮
-燙個髮
-燙完髮
-燙次髮
-理一個髮
-理一次髮
-理個髮
-理完髮
-理次髮
-細如髮
-繫於一髮
-膚髮
-皮膚
-生華髮
-蒼髮
-被髮佯狂
-被髮入山
-被髮左衽
-被髮纓冠
-被髮陽狂
-身體髮膚
-髒髮
-髮光可鑑
-髮已霜白
-髮油
-髮為血之本
-髮網
-髮踊沖冠
-髮際
-黃髮
-齒落髮白
剷頭
剷刈
口燥唇乾
@@ -3076,8 +2388,6 @@
對表揚
對表中
對表明
-不準確
-並不準確
一伙頭
一伙食
一半只
@@ -3089,7 +2399,6 @@
萬一只
上面糊
不克自制
-不准沒
不加自制
不占凶吉
不占卜
@@ -3193,7 +2502,10 @@
台子女
台子孫
台布景
-台面前
+台州
+台風穩健
+穩健的台風
+台風獎
合府上
後面店
向往常
@@ -3212,9 +2524,6 @@
好斗篷
好斗膽
好斗蓬
-家具體
-家具備
-家具有
小几
尸利
尸祿
@@ -3359,12 +2668,11 @@
面包涵
面包管
面包羅
-面包著
面包藏
面包裝
面包裹
面包起
-面店舖
+面店鋪
面粉碎
面粉紅
面食麵
@@ -3392,12 +2700,9 @@
恕乏价催
悲筑
折子戲
-揮杆
搤肮拊背
文采郁郁
-木杆
洪适
-球杆
腊之以為餌
腊毒
蜡月
@@ -3406,83 +2711,14 @@
宜云
貴价
郁郁菲菲
-馬杆
-造麯
-麴生
-麴秀才
-麴塵
-麴櫱
-大麴
-黃麴毒素
-酒醴麴櫱
-麴道士
-麴錢
-麴車
-麴院
-鼠麴草
不乾不淨
生發生
必須
須根據
·范
-、剋制
-,剋制
-。剋制
-!剋制
-?剋制
-;剋制
-:剋制
-不剋制
-也剋制
-了剋制
-他剋制
-們剋制
-剋制不了
-剋制不住
-力剋制
-力求剋制
-可以剋制
-和剋制
-在剋制
-地剋制
-夠剋制
-她剋制
-你剋制
-您剋制
-就剋制
-彼此剋制
-得剋制
-快剋制
-想剋制
-意剋制
-應剋制
-我剋制
-才剋制
-於剋制
-易剋制
-無法剋制
-的剋制
-盡量剋制
-而剋制
-能剋制
-與剋制
-著剋制
-要剋制
-軍隊剋制
-空投佈雷
-火箭佈雷
-海灣佈雷
-空中佈雷
-海上佈雷
-佈雷的
-佈雷,
-佈雷、
-佈雷。
-佈雷;
-佈雷艦
-佈雷艇
-佈雷速度
-佈雷封鎖
+剋剝
+科尼亞克期
+馬斯垂克期
滿拚自盡
拚生盡死
拚卻
@@ -3529,12 +2765,8 @@
范文藤
范文虎
范文照
-發表
乾重
-若干
鈎心鬥角
-若干
-乾重
全面包圍
全面包裹
機械系
@@ -3542,19 +2774,8 @@
心理
複分解
鹰鵰
-叱咤903
-叱咤MY903
-叱咤My903
-叱咤樂壇
-叱咤咤
-叱咤叱咤叱咤咤
-叱咤叱叱咤
-正在叱咤
-空餘
-變髒
天地志狼
薴烯
-阿斯圖里亞斯
雙折射
心繫家
心繫國
@@ -3603,7 +2824,6 @@
心繫病
心繫故
心繫哪
-心繫中
心繫英
心繫美
心繫日
@@ -3668,7 +2888,9 @@
心繫夫
心繫女
心繫子
-心繫著
+繫鞋帶
+繫船
+繫着
重回
挑大樑
扛大樑
@@ -3677,15 +2899,17 @@
限制
控制
製取
-第四出局
心臟
肝臟
脾臟
肺臟
腎臟
-參與
浮誇
-星巴克
+誇人
+誇姣
+誇容
+誇毗
+誇麗
于謙
于寘
淳于
@@ -3717,25 +2941,19 @@
電子表格
雪裡紅
雪裡蕻
+樹林裡
+叢林裡
森林裡
-日子裡
-故事裡
-領域裡
-時間裡
-深淵裡
-醫院裡
-春假裡
-暑假裡
-秋假裡
-寒假裡
-春天裡
-夏天裡
-秋天裡
-冬天裡
-春日裡
-夏日裡
-秋日裡
-冬日裡
+水裡
+子裡
+事裡
+域裡
+間裡
+淵裡
+院裡
+假裡
+天裡
+日裡
嘴裡
心裡
皮裡陽秋
@@ -3745,9 +2963,109 @@
裡面
這裡
中文裡
-山洞裡
-世界裡
+洞裡
+界裡
眼睛裡
+百科裡
+歷史裡
+戲裡
+作品裡
+專輯裡
+年代裡
+棺材裡
+假里白
+天里村
+上天里
+天里昂
+人生天里
+白子里
+朴子里
+翁子里
+田子里
+部子里
+曹子里
+埔子里
+廍子里
+廓子里
+堡子里
+墨子里
+瑞城里
+金城里
+西湖里
+子里甲
+水里商工
+車里雅賓斯克
+漠裡
+集裡
+節目裡
+場裡
+世紀裡
+亞美尼亞曆
+注釋
+月面
+路面
+修杰楷
+修杰麟
+學裡
+獄裡
+館裡
+箱裡
+系列裡
+點裡
+點里程
+家裡
+忙裡偷閒
+夜晚裡
+參數裡
+集數裡
+人數裡
+總數裡
+代數裡
+函數裡
+素數裡
+質數裡
+自然數裡
+索馬里 # (及以下)避免里海=>裏海的轉換
+西西里
+騰格里
+阿里
+村里長
+峇里海
+里海崖
+里海茨
+里海大學
+孛里海
+布里海
+公里海
+地圖裡
+版圖裡
+配圖裡
+路圖裡
+線圖裡
+幅圖裡
+鏡圖裡
+從圖裡
+的圖裡
+圖裡的
+圖裡,
+深山裡
+冰山裡
+火山裡
+在山裡
+的山裡
+到山裡
+去山裡
+從山裡
+山裡的
+山裡有
+棉裡
+語裡
+方法裡
+語法裡
+看法裡
+憲法裡
+用法裡
+法裡,
首發
夸脫
誰幹的
@@ -3758,15 +3076,11 @@
字碼表
電碼表
科斗
-佔領
灕水
-點裡
-這只是
這只不
這只容
這只允
這只採
-這只用
有只是
有只不
有只容
@@ -3778,16 +3092,7 @@
包括
特别致
分别致
-會上簽訂
-會上簽署
-周一 # (及以下)避免“周一齣版”的錯誤
-周二
-周三
-周四
-周五
-周六
韶山沖
-總裁制
于丹
于樂
于冕
@@ -3876,9 +3181,7 @@
于風政
于鳳桐
于默奧
-于家堡
于爾岑
-于默奧
于貝爾
于爾根
于雙戈
@@ -3907,93 +3210,13 @@
涂醒哲
涂善妮
涂敏恆
-總裁制
故云
強制作用
鬱南
西米谷
-一出生
-二出生
-三出生
-四出生
-五出生
-六出生
-七出生
-八出生
-九出生
-十出生
-一出版
-二出版
-三出版
-四出版
-五出版
-六出版
-七出版
-八出版
-九出版
-十出版
-一出刊
-二出刊
-三出刊
-四出刊
-五出刊
-六出刊
-七出刊
-八出刊
-九出刊
-十出刊
-一出逃
-二出逃
-三出逃
-四出逃
-五出逃
-六出逃
-七出逃
-八出逃
-九出逃
-十出逃
-一出口
-二出口
-三出口
-四出口
-五出口
-六出口
-七出口
-八出口
-九出口
-十出口
-一出祁山
-二出祁山
-三出祁山
-四出祁山
-五出祁山
-六出祁山
-七出祁山
-八出祁山
-九出祁山
-十出祁山
鬱林
饑荒
免徵
-亞美尼亞曆
-百科裡
-歷史裡
-戲裡
-作品裡
-專輯裡
-年代裡
-棺材裡
-注釋
-月面
-路面
-修杰楷
-修杰麟
-學裡
-獄裡
-館裡
-箱裡
-系列裡
-村子裡
艷后
廢后
妖后
@@ -4017,7 +3240,8 @@
后街
后羿
后稷
-后座
+仙后座
+六樓后座
后平路
后安路
后土
@@ -4050,37 +3274,29 @@
伊里布
劃入
中庄子
-埔裏社撫墾局
+埔裏社
懸掛
僱傭
四捨六入
宿舍
+校舍
會干擾
-代表
高清愿
瓷製
竹製
絲製
莜麵
-劃入
簡筑翎
楊雅筑
魔杰座
杰威爾音樂
彭于晏
尸羅精舍
-索馬里 # (及以下)避免里海=>裏海的轉換
-西西里
-騰格里
-阿里
-村里長
進制
黃詩杰
-陳冲
何杰
劉佳怜
于小惠
-于品海
于耘婕
于洋
于澄
@@ -4089,7 +3305,6 @@
于國治
于楓
于熙珍
-涂善妮
邱于庭
熊杰
卜云吉
@@ -4097,11 +3312,8 @@
于飛島
代表
水無怜奈
-傲遊 # 浏览器名
-夏于喬
賭后
-后海灣
-立后綜
+山仔后
甲后路
劉芸后
謝華后
@@ -4110,22 +3322,18 @@
聖后
陳有后
許虬
-網遊
狄志杰
伊適杰
于冠華
-于台煙
于雲鶴
于忠肅集
于友澤
于和偉
于來山
-于樂
于天龍
于謹
于榮光
電波鐘
-余三勝
掛名
啟發式
舞后
@@ -4141,16 +3349,6 @@
7年
8年
9年
-0年
-1年
-2年
-3年
-4年
-5年
-6年
-7年
-8年
-9年
〇年
零年
一年
@@ -4179,16 +3377,6 @@
7周後
8周後
9周後
-0周後
-1周後
-2周後
-3周後
-4周後
-5周後
-6周後
-7周後
-8周後
-9周後
零周後
〇周後
一周後
@@ -4231,6 +3419,10 @@
于鬯
于仲文
于再清
+茅于軾
+張樂于張徐
+鮮于樞
+于寶軒
于震
於震前
於震后
@@ -4247,66 +3439,351 @@
划行
划算
總裁制
+仲裁制
+獨裁制
恒生
嚴云農
手裏劍
-秦莊襄王
伊東怜
衛後莊公
-餘量
並行
郁郁青青
協防
-對表格
-對表示
-對表達
-對表演
-對表明
了然後
戴表元
-張樂于張徐
余力為
葉叶琴
-万俟
幾個
澀谷區
-協調
-選手
併發症
併發重症
併發模式
併發型模式
-金色長髮
-紅色長髮
-一頭長髮
+色長髮
+頭長髮
的長髮
-黑色長髮
-前天
-昨天
-今天
-明天
後天
-數學家
-科學家
-物理學家
-化學家
-生物學家
-天文學家
+學家
游離
-子晳
紅后假說
書面
不只
高涌泉
-請求
-考試
-測試
-筆試
-口試
-冰冷
王田里
后姓
-台州
田庄英雄
計劃
抑制劑
+党姓
+党家
+种丹妮
+當當網
+縴繩
+佣金
+佣錢
+佣鈿
+回佣
+蕓薹
+宋王臺
+臺佟
+臺靜農
+改採
+林鵞峰
+沙羡
+最多只
+大多只
+至多只
+只影響
+測不準
+說不準
+對不準
+量不準
+準不準
+音不準
+預報不準
+時間不準
+不太準
+非常準
+很準
+萬曆
+永曆
+囓蟲
+勳勞
+勳績
+勳爵
+勳業
+授勳
+奇勳
+功勳
+蝎虎
+磨蝎
+鬥劍
+激鬥
+政鬥
+沈海蓉
+方志恒
+古蹟
+瀋撫
+賦范
+騰衝
+沖天
+豐臺
+陽穀
+蒸乾
+太醜
+御製
+合併
+聖人曆
+电影後
+封為后
+皮托管
+白面包青天
+天神之后
+栗栖溪
+羅馬曆
+羅馬歷史
+羅馬歷代
+你誇
+誇你
+誇我
+誇他
+誇她
+誇了
+被誇
+誇辯
+誇大
+誇誕
+誇官
+誇口
+誇誇其談
+誇海口
+誇獎
+誇強說會
+誇下海口
+誇詡
+誇張
+誇示
+誇飾
+誇勝道強
+誇說
+誇才
+誇耀
+矜誇
+誇能
+自誇
+誇稱
+誇讚
+更加注
+繼承制
+布穀鳥
+黎克特制
+筆桿
+袋桿
+槍桿
+秤桿
+兩桿
+桿菌
+桿秤
+桿槍
+四桿鐵筆
+徒杠
+杠梁
+杠轂
+杠人
+石杠
+墨瀋
+米瀋
+拾瀋
+乾物
+姦污
+託兒
+同人誌
+文學誌
+衝着
+確係
+乃係
+開山辟谷
+穀祿
+製衣
+巨製
+不捲
+漫捲
+捲地
+捲葉蛾
+捲尾猴
+捲積雲
+窗簾
+吉徵
+凶徵
+臟腑
+臟胸
+弄髒胸
+腸臟
+養臟
+膵臟
+驚慄
+支配慾
+利慾
+悽美
+滷煮
+滷蝦
+滷鴨
+滷鵝
+滷牛
+滷五花
+滷子
+滷料
+滷豆
+滷了
+滷的
+滷好
+打滷
+滷麵
+烤滷
+錦滷
+汤滷
+浸滷
+石鐘
+石鐘山
+花葯
+聚葯雄蕊
+遺蹟
+開山闢谷
+受僱
+僱請
+僱車
+僱船
+米糰
+謹愿
+瞎矇
+里舖
+喧譁
+譁眾
+譁囂
+譁然
+譁噪
+譁笑
+譁變
+鼓譟
+譟詐
+蕩氣
+木籤
+薝蔔
+斗牛星
+告劄
+點劄
+嚮慕
+儘自
+憑閑
+倚閑
+踰閑
+閑邪
+摺檯
+球檯
+櫃檯
+吧檯
+賭檯
+坐檯
+妝檯
+餐檯
+工作檯
+辦公檯
+檯面上
+上檯面
+牴觸
+牴牾
+角牴
+扼肮
+搤肮
+嫩薑
+酸薑
+薑啤
+鹹濕
+騰湧
+草蓆
+竹蓆
+藤蓆
+涼蓆
+灘蓆
+麻將蓆
+裏水鎮
+被廢後
+蒸製
+體徵
+綜合徵
+价川
+商標准許
+批准確定
+御嶽山
+兩齣
+進兩出
+幾進幾出
+十出生
+十出頭
+十出擊
+十出家
+十出祁山
+0齣
+0出現
+0出線
+第一齣
+第二齣
+第三齣
+第四齣
+第五齣
+第六齣
+第七齣
+第八齣
+第九齣
+第一出現
+第一出線
+第二出線
+第三出局
+第四出局
+第五出局
+這齣
+這出現
+這出乎
+這出人
+這出生
+這出世
+這出身
+這出色
+這出版
+這出道
+本齣戲
+整齣戲
+一齣戲
+三齣戲
+一齣好戲
+一齣電影
+首齣電影
+多齣電影
+整齣電影
+一齣劇
+整齣劇
+一齣悲劇
+一齣喜劇
+捨入
+舍入口
+繫上了
+繫上頭
+繫上紅
+繫上黑
+繫上絲
+繫上繩
+繫上安全
+上繫上
+被繫上
+繫上,
+繫上。
+亂發生
+亂發脾氣
+秀發村
+秀發動
+秀發表
+秀發布
+秀發現
+秀發生
+秀發起
+秀發展 \ No newline at end of file
diff --git a/maintenance/language/zhtable/tradphrases_exclude.manual b/maintenance/language/zhtable/tradphrases_exclude.manual
index e6abb4e1..4a3613b6 100644
--- a/maintenance/language/zhtable/tradphrases_exclude.manual
+++ b/maintenance/language/zhtable/tradphrases_exclude.manual
@@ -27,7 +27,6 @@
弔架
弔桶
弔桿
-弔橋
弔燈
弔環
弔籃
@@ -54,11 +53,7 @@
饑餓
饑不擇食
饑荒
-憑藉
-藉故
-藉口
藉端
-藉詞
藉酒
蛋捲
行李捲
@@ -91,7 +86,6 @@
獃氣
獃子
獃頭獃腦
-儘量
希腊
腊肉
瞭如
@@ -301,7 +295,6 @@
光採
鍾錶
複原
-參与
浮夸
剋日
@@ -328,3 +321,345 @@
姦污
併發
衚衕
+轉檯
+檯子
+佣人
+佣工
+佣仆
+男佣
+女佣
+傢俱
+傢具
+華冑
+裔冑
+貴冑
+美髮
+癥狀
+癥候
+不準
+囓合
+囓齒類
+編製
+索麵
+專註
+鬥上
+古迹
+划了
+合并
+划出
+划到
+題籤
+克複
+意麵
+明裡
+華髮
+迴流
+採的
+複名
+看錶
+嚮應
+複電
+綵排
+綵帶
+綵樓
+綵牌樓
+綵球
+綵綢
+綵線
+綵船
+綵衣
+結綵
+戲綵娛親
+剪綵
+複檢
+黃曲霉
+佔有慾
+不佔
+佔上風
+佔下
+佔了
+佔位
+佔住
+佔佔
+佔便宜
+佔個
+佔優勢
+佔先
+佔光
+佔到
+佔去
+佔取
+佔在
+佔地
+佔多數
+佔好
+佔得
+佔掉
+佔據
+佔有
+佔滿
+佔為
+佔用
+佔畢
+佔盡
+佔線
+佔起
+佔過
+佔領
+佔頭籌
+佔高枝兒
+侵佔
+先佔
+分佔
+只佔
+強佔
+搶佔
+攻佔
+會佔
+照佔
+約佔
+連佔
+進佔
+還佔
+隱佔
+霸佔
+非佔不可
+鳩佔鵲巢
+占
+佔0
+佔1
+佔2
+佔3
+佔4
+佔5
+佔6
+佔7
+佔8
+佔9
+佔A
+佔B
+佔C
+佔D
+佔E
+佔F
+佔G
+佔H
+佔I
+佔J
+佔K
+佔L
+佔M
+佔N
+佔O
+佔P
+佔Q
+佔R
+佔S
+佔T
+佔U
+佔V
+佔W
+佔X
+佔Y
+佔Z
+佔〇
+佔一
+佔七
+佔三
+佔下風
+佔不佔
+佔不足
+佔世界
+佔中
+佔主
+佔九
+佔二
+佔五
+佔人便宜
+佔俄
+佔個位
+佔億
+佔優
+佔全
+佔兩
+佔八
+佔六
+佔分
+佔加
+佔劣
+佔北
+佔十
+佔千
+佔半
+佔南
+佔印
+佔台
+佔囁
+佔四
+佔國
+佔場
+佔壓
+佔多
+佔大
+佔小
+佔少
+佔局部
+佔屋
+佔山為
+佔市
+佔平均
+佔床
+佔座
+佔後
+佔德
+佔整
+佔新
+佔東
+佔查
+佔次
+佔比
+佔法
+佔澳
+佔率
+佔百
+佔網
+佔總
+佔缺
+佔美
+佔耕
+佔至多
+佔至少
+佔臺
+佔英
+佔萬
+佔葡
+佔蘇
+佔西
+佔資
+佔超過
+佔道
+佔零
+佔頭
+佔香
+佔馬
+俄佔
+圈佔
+地佔
+多佔
+奧佔
+寡佔
+將佔
+少佔
+已佔
+市佔
+徵佔
+德佔
+意佔
+所佔
+日佔
+法佔
+狂佔
+獨佔
+穩佔
+美佔
+義佔
+英佔
+葡佔
+西佔
+要佔
+費佔
+標準桿
+單杠
+杠子
+杠鈴
+經濟杠桿
+高低杠
+陞官
+姦汙
+興緻
+景緻
+別緻
+雅緻
+崑
+表
+錶
+小夥子
+夸父
+夸特
+夸脫
+心臟痲痹
+心臟麻痺
+悽涼
+悽悽
+悽豔
+悽切
+悽楚
+家裏
+利欲熏心
+遊離票
+遊離份子
+閑
+鍊鋼
+事迹
+痕迹
+遺迹
+僱員
+僱用
+霉素
+遊盪
+搖蕩
+激蕩
+動蕩
+跌蕩
+震蕩
+充饑
+儘力
+彈葯
+炸葯
+醫葯
+骯臟
+釐升
+蓆地
+晒
+窗檯
+和尚撞一天鍾
+製為
+裡布
+里布
+圖裡
+山裡
+複發
+照準
+四齣
+五齣
+六齣
+弔兒郎當
+髮小
+髮網
+修鍊
+麵線
+繫上
+清湯掛麵
+牛肉麵
+檯面
+庄
+複信
+複核
+三複
+來複
+匡複
+傾複
+墾複
+往複
+被複
+複仞年如
+複以百萬
+複位
+複合
+複員
+複壯
+複復
+複流
+複畝珍
+起複
+餘 \ No newline at end of file
diff --git a/maintenance/mergeMessageFileList.php b/maintenance/mergeMessageFileList.php
index 2a6f8a8b..b4914971 100644
--- a/maintenance/mergeMessageFileList.php
+++ b/maintenance/mergeMessageFileList.php
@@ -85,12 +85,24 @@ class MergeMessageFileList extends Maintenance {
if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
continue;
}
- $extfile = "{$extdir}/{$extname}/{$extname}.php";
- if ( file_exists( $extfile ) ) {
- $mmfl['setupFiles'][] = $extfile;
- } else {
+ $possibilities = array(
+ "$extdir/$extname/extension.json",
+ "$extdir/$extname/skin.json",
+ "$extdir/$extname/$extname.php"
+ );
+ $found = false;
+ foreach ( $possibilities as $extfile ) {
+ if ( file_exists( $extfile ) ) {
+ $mmfl['setupFiles'][] = $extfile;
+ $found = true;
+ break;
+ }
+ }
+
+ if ( !$found ) {
$this->hasError = true;
- $this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
+ $this->error( "Extension {$extname} in {$extdir} lacks expected entry point: " .
+ "extension.json, skin.json, or {$extname}.php." );
}
}
}
@@ -150,6 +162,7 @@ class MergeMessageFileList extends Maintenance {
require_once RUN_MAINTENANCE_IF_MAIN;
+$queue = array();
foreach ( $mmfl['setupFiles'] as $fileName ) {
if ( strval( $fileName ) === '' ) {
continue;
@@ -157,12 +170,24 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
if ( empty( $mmfl['quiet'] ) ) {
fwrite( STDERR, "Loading data from $fileName\n" );
}
- // Include the extension to update $wgExtensionMessagesFiles
- if ( !( include_once $fileName ) ) {
- fwrite( STDERR, "Unable to read $fileName\n" );
- exit( 1 );
+ // Using extension.json or skin.json
+ if ( substr( $fileName, -strlen( '.json' ) ) === '.json' ) {
+ $queue[$fileName] = 1;
+ } else {
+ require_once $fileName;
+ }
+}
+
+if ( $queue ) {
+ $registry = new ExtensionRegistry();
+ $data = $registry->readFromQueue( $queue );
+ foreach ( array( 'wgExtensionMessagesFiles', 'wgMessagesDirs' ) as $var ) {
+ if ( isset( $data['globals'][$var] ) ) {
+ $GLOBALS[$var] = array_merge( $data['globals'][$var], $GLOBALS[$var] );
+ }
}
}
+
fwrite( STDERR, "\n" );
$s =
"<" . "?php\n" .
diff --git a/maintenance/moveBatch.php b/maintenance/moveBatch.php
index 713753f2..a27a7726 100644
--- a/maintenance/moveBatch.php
+++ b/maintenance/moveBatch.php
@@ -103,10 +103,10 @@ class MoveBatch extends Maintenance {
$this->output( $source->getPrefixedText() . ' --> ' . $dest->getPrefixedText() );
$dbw->begin( __METHOD__ );
- $err = $source->moveTo( $dest, false, $reason, !$noredirects );
- if ( $err !== true ) {
- $msg = array_shift( $err[0] );
- $this->output( "\nFAILED: " . wfMessage( $msg, $err[0] )->text() );
+ $mp = new MovePage( $source, $dest );
+ $status = $mp->move( $wgUser, $reason, !$noredirects );
+ if ( !$status->isOK() ) {
+ $this->output( "\nFAILED: " . $status->getWikiText() );
}
$dbw->commit( __METHOD__ );
$this->output( "\n" );
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index b9cd7159..5b09ffdc 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -111,7 +111,6 @@ CREATE TABLE /*_*/page (
page_namespace INT NOT NULL,
page_title NVARCHAR(255) NOT NULL,
page_restrictions NVARCHAR(255) NOT NULL,
- page_counter BIGINT NOT NULL DEFAULT 0,
page_is_redirect BIT NOT NULL DEFAULT 0,
page_is_new BIT NOT NULL DEFAULT 0,
page_random real NOT NULL DEFAULT RAND(),
@@ -422,9 +421,6 @@ CREATE TABLE /*_*/site_stats (
-- The single row should contain 1 here.
ss_row_id int NOT NULL,
- -- Total number of page views, if hit counters are enabled.
- ss_total_views bigint default 0,
-
-- Total number of edits performed.
ss_total_edits bigint default 0,
@@ -453,18 +449,6 @@ CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
--
--- Stores an ID for every time any article is visited;
--- depending on $wgHitcounterUpdateFreq, it is
--- periodically cleared and the page_counter column
--- in the page table updated for all the articles
--- that have been visited.)
---
-CREATE TABLE /*_*/hitcounter (
- hc_id int NOT NULL
-);
-
-
---
-- The internet is full of jerks, alas. Sometimes it's handy
-- to block a vandal or troll account.
--
diff --git a/maintenance/mwdoc-filter.php b/maintenance/mwdoc-filter.php
index c80981b5..0cc7bde8 100644
--- a/maintenance/mwdoc-filter.php
+++ b/maintenance/mwdoc-filter.php
@@ -16,8 +16,33 @@ if ( PHP_SAPI != 'cli' ) {
}
$source = file_get_contents( $argv[1] );
-$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
-$replac = '${2} */ ${3} ${1} ${4}';
+$regexp = '#'
+ . '\@var'
+ . '\s+'
+ // Type hint
+ . '([^\s]+)'
+ . '\s+'
+ // Any text or line(s) between type hint and '/' closing the comment
+ // (includes the star of "*/"). Descriptions containing a slash
+ // are not supported. Those will have to to be rewritten to have their
+ // description *before* the @var:
+ // /**
+ // * Description with / in it.
+ // * @var array
+ // */
+ // instead of:
+ // /**
+ // * @var array Description with / in it.
+ // */
+ . '([^/]+)'
+ . '/'
+ . '\s+'
+ . '(var|public|protected|private)'
+ . '\s+'
+ // Variable name
+ . '(\$[^\s;=]+)'
+ . '#';
+$replac = '${2}/ ${3} ${1} ${4}';
$source = preg_replace( $regexp, $replac, $source );
echo $source;
diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php
index ee0ff017..49eae4a5 100644
--- a/maintenance/mwdocgen.php
+++ b/maintenance/mwdocgen.php
@@ -91,6 +91,7 @@ class MWDocGen extends Maintenance {
$this->template = $IP . '/maintenance/Doxyfile';
$this->excludes = array(
'vendor',
+ 'node_modules',
'images',
'static',
);
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php
index cbc389be..96e01fe4 100644
--- a/maintenance/namespaceDupes.php
+++ b/maintenance/namespaceDupes.php
@@ -39,28 +39,46 @@ class NamespaceConflictChecker extends Maintenance {
*/
protected $db;
+ private $resolvableCount = 0;
+ private $totalPages = 0;
+
public function __construct() {
parent::__construct();
$this->mDescription = "";
$this->addOption( 'fix', 'Attempt to automatically fix errors' );
- $this->addOption( 'suffix', "Dupes will be renamed with correct namespace with " .
+ $this->addOption( 'merge', "Instead of renaming conflicts, do a history merge with " .
+ "the correct title" );
+ $this->addOption( 'add-suffix', "Dupes will be renamed with correct namespace with " .
"<text> appended after the article name", false, true );
- $this->addOption( 'prefix', "Do an explicit check for the given title prefix " .
- "appended after the article name", false, true );
+ $this->addOption( 'add-prefix', "Dupes will be renamed with correct namespace with " .
+ "<text> prepended before the article name", false, true );
+ $this->addOption( 'source-pseudo-namespace', "Move all pages with the given source " .
+ "prefix (with an implied colon following it). If --dest-namespace is not specified, " .
+ "the colon will be replaced with a hyphen.",
+ false, true );
+ $this->addOption( 'dest-namespace', "In combination with --source-pseudo-namespace, " .
+ "specify the namespace ID of the destination.", false, true );
+ $this->addOption( 'move-talk', "If this is specified, pages in the Talk namespace that " .
+ "begin with a conflicting prefix will be renamed, for example " .
+ "Talk:File:Foo -> File_Talk:Foo" );
}
public function execute() {
$this->db = wfGetDB( DB_MASTER );
- $fix = $this->hasOption( 'fix' );
- $suffix = $this->getOption( 'suffix', '' );
- $prefix = $this->getOption( 'prefix', '' );
- $key = intval( $this->getOption( 'key', 0 ) );
-
- if ( $prefix ) {
- $retval = $this->checkPrefix( $key, $prefix, $fix, $suffix );
+ $options = array(
+ 'fix' => $this->hasOption( 'fix' ),
+ 'merge' => $this->hasOption( 'merge' ),
+ 'add-suffix' => $this->getOption( 'add-suffix', '' ),
+ 'add-prefix' => $this->getOption( 'add-prefix', '' ),
+ 'move-talk' => $this->hasOption( 'move-talk' ),
+ 'source-pseudo-namespace' => $this->getOption( 'source-pseudo-namespace', '' ),
+ 'dest-namespace' => intval( $this->getOption( 'dest-namespace', 0 ) ) );
+
+ if ( $options['source-pseudo-namespace'] !== '' ) {
+ $retval = $this->checkPrefix( $options );
} else {
- $retval = $this->checkAll( $fix, $suffix );
+ $retval = $this->checkAll( $options );
}
if ( $retval ) {
@@ -71,13 +89,13 @@ class NamespaceConflictChecker extends Maintenance {
}
/**
- * @todo Document
- * @param bool $fix Whether or not to fix broken entries
- * @param string $suffix Suffix to append to renamed articles
+ * Check all namespaces
+ *
+ * @param array $options Associative array of validated command-line options
*
* @return bool
*/
- private function checkAll( $fix, $suffix = '' ) {
+ private function checkAll( $options ) {
global $wgContLang, $wgNamespaceAliases, $wgCapitalLinks;
$spaces = array();
@@ -131,14 +149,31 @@ class NamespaceConflictChecker extends Maintenance {
}
}
- ksort( $spaces );
- asort( $spaces );
+ // Sort by namespace index, and if there are two with the same index,
+ // break the tie by sorting by name
+ $origSpaces = $spaces;
+ uksort( $spaces, function ( $a, $b ) use ( $origSpaces ) {
+ if ( $origSpaces[$a] < $origSpaces[$b] ) {
+ return -1;
+ } elseif ( $origSpaces[$a] > $origSpaces[$b] ) {
+ return 1;
+ } elseif ( $a < $b ) {
+ return -1;
+ } elseif ( $a > $b ) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } );
$ok = true;
foreach ( $spaces as $name => $ns ) {
- $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok;
+ $ok = $this->checkNamespace( $ns, $name, $options ) && $ok;
}
+ $this->output( "{$this->totalPages} pages to fix, " .
+ "{$this->resolvableCount} were resolvable.\n" );
+
return $ok;
}
@@ -158,178 +193,273 @@ class NamespaceConflictChecker extends Maintenance {
}
/**
- * @todo Document
- * @param int $ns A namespace id
+ * Check a given prefix and try to move it into the given destination namespace
+ *
+ * @param int $ns Destination namespace id
* @param string $name
- * @param bool $fix Whether to fix broken entries
- * @param string $suffix Suffix to append to renamed articles
+ * @param array $options Associative array of validated command-line options
* @return bool
*/
- private function checkNamespace( $ns, $name, $fix, $suffix = '' ) {
- $conflicts = $this->getConflicts( $ns, $name );
- $count = count( $conflicts );
+ private function checkNamespace( $ns, $name, $options ) {
+ $targets = $this->getTargetList( $ns, $name, $options );
+ $count = $targets->numRows();
+ $this->totalPages += $count;
if ( $count == 0 ) {
return true;
}
+ $dryRunNote = $options['fix'] ? '' : ' DRY RUN ONLY';
+
$ok = true;
- foreach ( $conflicts as $row ) {
- $resolvable = $this->reportConflict( $row, $suffix );
- $ok = $ok && $resolvable;
- if ( $fix && ( $resolvable || $suffix != '' ) ) {
- $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok;
+ foreach ( $targets as $row ) {
+
+ // Find the new title and determine the action to take
+
+ $newTitle = $this->getDestinationTitle( $ns, $name, $row, $options );
+ $logStatus = false;
+ if ( !$newTitle ) {
+ $logStatus = 'invalid title';
+ $action = 'abort';
+ } elseif ( $newTitle->exists() ) {
+ if ( $options['merge'] ) {
+ if ( $this->canMerge( $row->page_id, $newTitle, $logStatus ) ) {
+ $action = 'merge';
+ } else {
+ $action = 'abort';
+ }
+ } elseif ( $options['add-prefix'] == '' && $options['add-suffix'] == '' ) {
+ $action = 'abort';
+ $logStatus = 'dest title exists and --add-prefix not specified';
+ } else {
+ $newTitle = $this->getAlternateTitle( $newTitle, $options );
+ if ( !$newTitle ) {
+ $action = 'abort';
+ $logStatus = 'alternate title is invalid';
+ } elseif ( $newTitle->exists() ) {
+ $action = 'abort';
+ $logStatus = 'title conflict';
+ } else {
+ $action = 'move';
+ $logStatus = 'alternate';
+ }
+ }
+ } else {
+ $action = 'move';
+ $logStatus = 'no conflict';
+ }
+
+ // Take the action or log a dry run message
+
+ $logTitle = "id={$row->page_id} ns={$row->page_namespace} dbk={$row->page_title}";
+ $pageOK = true;
+
+ switch ( $action ) {
+ case 'abort':
+ $this->output( "$logTitle *** $logStatus\n" );
+ $pageOK = false;
+ break;
+ case 'move':
+ $this->output( "$logTitle -> " .
+ $newTitle->getPrefixedDBkey() . " ($logStatus)$dryRunNote\n" );
+
+ if ( $options['fix'] ) {
+ $pageOK = $this->movePage( $row->page_id, $newTitle );
+ }
+ break;
+ case 'merge':
+ $this->output( "$logTitle => " .
+ $newTitle->getPrefixedDBkey() . " (merge)$dryRunNote\n" );
+
+ if ( $options['fix'] ) {
+ $pageOK = $this->mergePage( $row->page_id, $newTitle );
+ }
+ break;
+ }
+
+ if ( $pageOK ) {
+ $this->resolvableCount++;
+ } else {
+ $ok = false;
}
}
+ // @fixme Also needs to do like self::getTargetList() on the
+ // *_namespace and *_title fields of pagelinks, templatelinks, and
+ // redirects, and schedule a LinksUpdate job or similar for each found
+ // *_from.
+
return $ok;
}
/**
- * @todo Do this for real
- * @param int $key
- * @param string $prefix
- * @param bool $fix
- * @param string $suffix
+ * Move the given pseudo-namespace, either replacing the colon with a hyphen
+ * (useful for pseudo-namespaces that conflict with interwiki links) or move
+ * them to another namespace if specified.
+ * @param array $options Associative array of validated command-line options
* @return bool
*/
- private function checkPrefix( $key, $prefix, $fix, $suffix = '' ) {
- $this->output( "Checking prefix \"$prefix\" vs namespace $key\n" );
+ private function checkPrefix( $options ) {
+ $prefix = $options['source-pseudo-namespace'];
+ $ns = $options['dest-namespace'];
+ $this->output( "Checking prefix \"$prefix\" vs namespace $ns\n" );
- return $this->checkNamespace( $key, $prefix, $fix, $suffix );
+ return $this->checkNamespace( $ns, $prefix, $options );
}
/**
- * Find pages in mainspace that have a prefix of the new namespace
- * so we know titles that will need migrating
+ * Find pages in main and talk namespaces that have a prefix of the new
+ * namespace so we know titles that will need migrating
*
- * @param int $ns Namespace id (id for new namespace?)
+ * @param int $ns Destination namespace id
* @param string $name Prefix that is being made a namespace
+ * @param array $options Associative array of validated command-line options
*
- * @return array
+ * @return ResultWrapper
*/
- private function getConflicts( $ns, $name ) {
- $titleSql = "TRIM(LEADING {$this->db->addQuotes( "$name:" )} FROM page_title)";
- if ( $ns == 0 ) {
- // An interwiki; try an alternate encoding with '-' for ':'
- $titleSql = $this->db->buildConcat( array(
- $this->db->addQuotes( "$name-" ),
- $titleSql,
- ) );
+ private function getTargetList( $ns, $name, $options ) {
+ if ( $options['move-talk'] && MWNamespace::isSubject( $ns ) ) {
+ $checkNamespaces = array( NS_MAIN, NS_TALK );
+ } else {
+ $checkNamespaces = NS_MAIN;
}
- return iterator_to_array( $this->db->select( 'page',
+ return $this->db->select( 'page',
array(
- 'id' => 'page_id',
- 'oldtitle' => 'page_title',
- 'namespace' => $this->db->addQuotes( $ns ) . ' + page_namespace',
- 'title' => $titleSql,
- 'oldnamespace' => 'page_namespace',
+ 'page_id',
+ 'page_title',
+ 'page_namespace',
),
array(
- 'page_namespace' => array( 0, 1 ),
+ 'page_namespace' => $checkNamespaces,
'page_title' . $this->db->buildLike( "$name:", $this->db->anyString() ),
),
__METHOD__
- ) );
+ );
}
/**
- * Report any conflicts we find
- *
+ * Get the preferred destination title for a given target page row.
+ * @param integer $ns The destination namespace ID
+ * @param string $name The conflicting prefix
* @param stdClass $row
- * @param string $suffix
- * @return bool
+ * @param array $options Associative array of validated command-line options
+ * @return Title|false
*/
- private function reportConflict( $row, $suffix ) {
- $newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
- if ( is_null( $newTitle ) || !$newTitle->canExist() ) {
- // Title is also an illegal title...
- // For the moment we'll let these slide to cleanupTitles or whoever.
- $this->output( sprintf( "... %d (%d,\"%s\")\n",
- $row->id,
- $row->oldnamespace,
- $row->oldtitle ) );
- $this->output( "... *** cannot resolve automatically; illegal title ***\n" );
-
- return false;
+ private function getDestinationTitle( $ns, $name, $row, $options ) {
+ $dbk = substr( $row->page_title, strlen( "$name:" ) );
+ if ( $ns == 0 ) {
+ // An interwiki; try an alternate encoding with '-' for ':'
+ $dbk = "$name-" . $dbk;
}
-
- $this->output( sprintf( "... %d (%d,\"%s\") -> (%d,\"%s\") [[%s]]\n",
- $row->id,
- $row->oldnamespace,
- $row->oldtitle,
- $newTitle->getNamespace(),
- $newTitle->getDBkey(),
- $newTitle->getPrefixedText() ) );
-
- $id = $newTitle->getArticleID();
- if ( $id ) {
- $this->output( "... *** cannot resolve automatically; page exists with ID $id ***\n" );
-
+ $destNS = $ns;
+ if ( $row->page_namespace == NS_TALK && MWNamespace::isSubject( $ns ) ) {
+ // This is an associated talk page moved with the --move-talk feature.
+ $destNS = MWNamespace::getTalk( $destNS );
+ }
+ $newTitle = Title::makeTitleSafe( $destNS, $dbk );
+ if ( !$newTitle || !$newTitle->canExist() ) {
return false;
- } else {
- return true;
}
+ return $newTitle;
}
/**
- * Resolve any conflicts
+ * Get an alternative title to move a page to. This is used if the
+ * preferred destination title already exists.
*
- * @param stClass $row Row from the page table to fix
- * @param bool $resolvable
- * @param string $suffix Suffix to append to the fixed page
- * @return bool
+ * @param Title $title
+ * @param array $options Associative array of validated command-line options
+ * @return Title|bool
*/
- private function resolveConflict( $row, $resolvable, $suffix ) {
- if ( !$resolvable ) {
- $this->output( "... *** old title {$row->title}\n" );
- while ( true ) {
- $row->title .= $suffix;
- $this->output( "... *** new title {$row->title}\n" );
- $title = Title::makeTitleSafe( $row->namespace, $row->title );
- if ( !$title ) {
- $this->output( "... !!! invalid title\n" );
-
- return false;
- }
- $id = $title->getArticleID();
- if ( $id ) {
- $this->output( "... *** page exists with ID $id ***\n" );
- } else {
- break;
- }
+ private function getAlternateTitle( $title, $options ) {
+ $prefix = $options['add-prefix'];
+ $suffix = $options['add-suffix'];
+ if ( $prefix == '' && $suffix == '' ) {
+ return false;
+ }
+ while ( true ) {
+ $dbk = $prefix . $title->getDBkey() . $suffix;
+ $title = Title::makeTitleSafe( $title->getNamespace(), $dbk );
+ if ( !$title ) {
+ return false;
+ }
+ if ( !$title->exists() ) {
+ return $title;
}
- $this->output( "... *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n" );
}
- $this->resolveConflictOn( $row, 'page', 'page' );
-
- return true;
}
/**
- * Resolve a given conflict
+ * Move a page
+ *
+ * @fixme Update pl_from_namespace etc.
*
- * @param stdClass $row Row from the old broken entry
- * @param string $table Table to update
- * @param string $prefix Prefix for column name, like page or ar
+ * @param integer $id The page_id
+ * @param Title $newTitle The new title
* @return bool
*/
- private function resolveConflictOn( $row, $table, $prefix ) {
- $this->output( "... resolving on $table... " );
- $newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
- $this->db->update( $table,
+ private function movePage( $id, Title $newTitle ) {
+ $this->db->update( 'page',
array(
- "{$prefix}_namespace" => $newTitle->getNamespace(),
- "{$prefix}_title" => $newTitle->getDBkey(),
+ "page_namespace" => $newTitle->getNamespace(),
+ "page_title" => $newTitle->getDBkey(),
),
array(
- // "{$prefix}_namespace" => 0,
- // "{$prefix}_title" => $row->oldtitle,
- "{$prefix}_id" => $row->id,
+ "page_id" => $id,
),
__METHOD__ );
- $this->output( "ok.\n" );
+ // @fixme Needs updating the *_from_namespace fields in categorylinks,
+ // pagelinks, templatelinks and imagelinks.
+
+ return true;
+ }
+
+ /**
+ * Determine if we can merge a page.
+ * We check if an inaccessible revision would become the latest and
+ * deny the merge if so -- it's theoretically possible to update the
+ * latest revision, but opens a can of worms -- search engine updates,
+ * recentchanges review, etc.
+ *
+ * @param integer $id The page_id
+ * @param Title $newTitle The new title
+ * @param string $logStatus This is set to the log status message on failure
+ * @return bool
+ */
+ private function canMerge( $id, Title $newTitle, &$logStatus ) {
+ $latestDest = Revision::newFromTitle( $newTitle, 0, Revision::READ_LATEST );
+ $latestSource = Revision::newFromPageId( $id, 0, Revision::READ_LATEST );
+ if ( $latestSource->getTimestamp() > $latestDest->getTimestamp() ) {
+ $logStatus = 'cannot merge since source is later';
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Merge page histories
+ *
+ * @param integer $id The page_id
+ * @param Title $newTitle The new title
+ */
+ private function mergePage( $id, Title $newTitle ) {
+ $destId = $newTitle->getArticleId();
+ $this->db->begin( __METHOD__ );
+ $this->db->update( 'revision',
+ // SET
+ array( 'rev_page' => $destId ),
+ // WHERE
+ array( 'rev_page' => $id ),
+ __METHOD__ );
+
+ $this->db->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
+
+ // @fixme Need WikiPage::doDeleteUpdates() or similar to avoid orphan
+ // rows in the links tables.
+
+ $this->db->commit( __METHOD__ );
return true;
}
}
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
index 36be16e4..12f6518a 100644
--- a/maintenance/oracle/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -69,7 +69,6 @@ CREATE TABLE &mw_prefix.page (
page_namespace NUMBER DEFAULT 0 NOT NULL,
page_title VARCHAR2(255) NOT NULL,
page_restrictions VARCHAR2(255),
- page_counter NUMBER DEFAULT 0 NOT NULL,
page_is_redirect CHAR(1) DEFAULT '0' NOT NULL,
page_is_new CHAR(1) DEFAULT '0' NOT NULL,
page_random NUMBER(15,14) NOT NULL,
@@ -247,7 +246,6 @@ CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, i
CREATE TABLE &mw_prefix.site_stats (
ss_row_id NUMBER NOT NULL ,
- ss_total_views NUMBER DEFAULT 0,
ss_total_edits NUMBER DEFAULT 0,
ss_good_articles NUMBER DEFAULT 0,
ss_total_pages NUMBER DEFAULT -1,
@@ -257,10 +255,6 @@ CREATE TABLE &mw_prefix.site_stats (
);
CREATE UNIQUE INDEX &mw_prefix.site_stats_u01 ON &mw_prefix.site_stats (ss_row_id);
-CREATE TABLE &mw_prefix.hitcounter (
- hc_id NUMBER NOT NULL
-);
-
CREATE SEQUENCE ipblocks_ipb_id_seq;
CREATE TABLE &mw_prefix.ipblocks (
ipb_id NUMBER NOT NULL,
diff --git a/maintenance/parse.php b/maintenance/parse.php
index 638d7c5b..7b05cb7b 100644
--- a/maintenance/parse.php
+++ b/maintenance/parse.php
@@ -3,7 +3,7 @@
* Parse some wikitext.
*
* Wikitext can be given by stdin or using a file. The wikitext will be parsed
- * using 'CLIParser' as a title. This can be overriden with --title option.
+ * using 'CLIParser' as a title. This can be overridden with --title option.
*
* Example1:
* @code
@@ -110,7 +110,7 @@ class CLIParser extends Maintenance {
/**
* Title object to use for CLI parsing.
- * Default title is 'CLIParser', it can be overriden with the option
+ * Default title is 'CLIParser', it can be overridden with the option
* --title <Your:Title>
*
* @return Title
diff --git a/maintenance/populateBloomCache.php b/maintenance/populateBloomCache.php
deleted file mode 100644
index 40ad5fc6..00000000
--- a/maintenance/populateBloomCache.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- * Script to populate a bloom filter with a BloomFilter* class
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Script to populate a bloom filter with a BloomFilter* class
- *
- * @ingroup Maintenance
- */
-class PopulateBloomFilter extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->addOption( 'cache', 'Bloom cache store name', true, true );
- $this->addOption( 'filter', 'Bloom filter name', true, true );
- $this->addOption( 'domain', 'Bloom filter domain', true, true );
- $this->addOption( 'delay', 'Sleep delay between batches (us)', false, true );
- $this->mDescription = "Populate the specified bloom filter";
- }
-
- public function execute() {
- $type = $this->getOption( 'filter' );
- $domain = $this->getOption( 'domain' );
- $bcache = BloomCache::get( $this->getOption( 'cache' ) );
- $delay = $this->getOption( 'delay', 1e5 );
-
- if ( !method_exists( "BloomFilter{$type}", 'merge' ) ) {
- $this->error( "No \"BloomFilter{$type}::merge\" method found.", 1 );
- }
-
- $virtualKey = "$domain:$type";
- $status = $bcache->getStatus( $virtualKey );
- if ( $status == false ) {
- $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
- }
-
- $startTime = microtime( true );
- $this->output( "Current timestamp is '$startTime'.\n" );
- $this->output( "Current filter timestamp is '{$status['asOfTime']}'.\n" );
-
- do {
- $status = call_user_func_array(
- array( "BloomFilter{$type}", 'merge' ),
- array( $bcache, $domain, $virtualKey, $status )
- );
- if ( $status == false ) {
- $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
- }
- $this->output( "Filter updated to timestamp '{$status['asOfTime']}'.\n" );
- usleep( $delay );
- } while ( $status['asOfTime'] && $status['asOfTime'] < $startTime );
-
- $this->output( "Done, filter $type of domain $domain reached time '$startTime'.\n" );
- }
-}
-
-$maintClass = "PopulateBloomFilter";
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateParentId.php b/maintenance/populateParentId.php
index f77978fc..686d9f2b 100644
--- a/maintenance/populateParentId.php
+++ b/maintenance/populateParentId.php
@@ -84,7 +84,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
"rev_id < " . intval( $row->rev_id ) ),
__METHOD__,
array( 'ORDER BY' => 'rev_id DESC' ) );
- # If there are none, check the the highest ID with a lower timestamp
+ # If there are none, check the highest ID with a lower timestamp
if ( !$previousID ) {
# Get the highest older timestamp
$lastTimestamp = $db->selectField(
diff --git a/maintenance/populateRevisionSha1.php b/maintenance/populateRevisionSha1.php
index f06b56be..b401db03 100644
--- a/maintenance/populateRevisionSha1.php
+++ b/maintenance/populateRevisionSha1.php
@@ -153,7 +153,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
? Revision::newFromArchiveRow( $row )
: new Revision( $row );
$text = $rev->getSerializedData();
- } catch ( MWException $e ) {
+ } catch ( Exception $e ) {
$this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
return false; // bug 22624?
@@ -182,7 +182,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
$db = $this->getDB( DB_MASTER );
try {
$rev = Revision::newFromArchiveRow( $row );
- } catch ( MWException $e ) {
+ } catch ( Exception $e ) {
$this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
return false; // bug 22624?
diff --git a/maintenance/postgres/compare_schemas.pl b/maintenance/postgres/compare_schemas.pl
index 53aeb147..bb08237b 100644
--- a/maintenance/postgres/compare_schemas.pl
+++ b/maintenance/postgres/compare_schemas.pl
@@ -395,7 +395,6 @@ ss_active_users bigint INTEGER
ss_good_articles bigint INTEGER
ss_total_edits bigint INTEGER
ss_total_pages bigint INTEGER
-ss_total_views bigint INTEGER
ss_users bigint INTEGER
## True IP - keep an eye on these, coders tend to make textual assumptions
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 12e357fc..60762063 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -81,7 +81,6 @@ CREATE TABLE page (
page_namespace SMALLINT NOT NULL,
page_title TEXT NOT NULL,
page_restrictions TEXT,
- page_counter BIGINT NOT NULL DEFAULT 0,
page_is_redirect SMALLINT NOT NULL DEFAULT 0,
page_is_new SMALLINT NOT NULL DEFAULT 0,
page_random NUMERIC(15,14) NOT NULL DEFAULT RANDOM(),
@@ -262,7 +261,6 @@ CREATE INDEX langlinks_lang_title ON langlinks (ll_lang,ll_title);
CREATE TABLE site_stats (
ss_row_id INTEGER NOT NULL UNIQUE,
- ss_total_views INTEGER DEFAULT 0,
ss_total_edits INTEGER DEFAULT 0,
ss_good_articles INTEGER DEFAULT 0,
ss_total_pages INTEGER DEFAULT -1,
@@ -272,10 +270,6 @@ CREATE TABLE site_stats (
ss_images INTEGER DEFAULT 0
);
-CREATE TABLE hitcounter (
- hc_id BIGINT NOT NULL
-);
-
CREATE SEQUENCE ipblocks_ipb_id_seq;
CREATE TABLE ipblocks (
diff --git a/maintenance/preprocessorFuzzTest.php b/maintenance/preprocessorFuzzTest.php
index cb55f0f2..e1710c14 100644
--- a/maintenance/preprocessorFuzzTest.php
+++ b/maintenance/preprocessorFuzzTest.php
@@ -64,7 +64,7 @@ class PPFuzzTester {
self::$currentTest = new PPFuzzTest( $this );
self::$currentTest->execute();
$passed = 'passed';
- } catch ( MWException $e ) {
+ } catch ( Exception $e ) {
$testReport = self::$currentTest->getReport();
$exceptionReport = $e->getText();
$hash = md5( $testReport );
diff --git a/maintenance/purgeChangedFiles.php b/maintenance/purgeChangedFiles.php
index 1e702dea..d21a296d 100644
--- a/maintenance/purgeChangedFiles.php
+++ b/maintenance/purgeChangedFiles.php
@@ -2,7 +2,6 @@
/**
* Scan the logging table and purge affected files within a timeframe.
*
- * @section LICENSE
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
diff --git a/maintenance/purgeChangedPages.php b/maintenance/purgeChangedPages.php
index 67022094..56e22c40 100644
--- a/maintenance/purgeChangedPages.php
+++ b/maintenance/purgeChangedPages.php
@@ -2,7 +2,6 @@
/**
* Send purge requests for pages edited in date range to squid/varnish.
*
- * @section LICENSE
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
diff --git a/maintenance/rebuildLocalisationCache.php b/maintenance/rebuildLocalisationCache.php
index b04639c0..47866dc0 100644
--- a/maintenance/rebuildLocalisationCache.php
+++ b/maintenance/rebuildLocalisationCache.php
@@ -113,6 +113,7 @@ class RebuildLocalisationCache extends Maintenance {
$total = count( $codes );
$chunks = array_chunk( $codes, ceil( count( $codes ) / $threads ) );
$pids = array();
+ $parentStatus = 0;
foreach ( $chunks as $codes ) {
// Do not fork for only one thread
$pid = ( $threads > 1 ) ? pcntl_fork() : -1;
@@ -121,9 +122,8 @@ class RebuildLocalisationCache extends Maintenance {
// Child, reseed because there is no bug in PHP:
// http://bugs.php.net/bug.php?id=42465
mt_srand( getmypid() );
- $numRebuilt = $this->doRebuild( $codes, $lc, $force );
- // Abuse the exit value for the count of rebuild languages
- exit( $numRebuilt );
+ $this->doRebuild( $codes, $lc, $force );
+ exit( 0 );
} elseif ( $pid === -1 ) {
// Fork failed or one thread, do it serialized
$numRebuilt += $this->doRebuild( $codes, $lc, $force );
@@ -136,13 +136,20 @@ class RebuildLocalisationCache extends Maintenance {
foreach ( $pids as $pid ) {
$status = 0;
pcntl_waitpid( $pid, $status );
- // Fetch the count from the return value
- $numRebuilt += pcntl_wexitstatus( $status );
+ if ( pcntl_wexitstatus( $status ) ) {
+ // Pass a fatal error code through to the caller
+ $parentStatus = pcntl_wexitstatus( $status );
+ }
}
- $this->output( "$numRebuilt languages rebuilt out of $total\n" );
- if ( $numRebuilt === 0 ) {
- $this->output( "Use --force to rebuild the caches which are still fresh.\n" );
+ if ( !$pids ) {
+ $this->output( "$numRebuilt languages rebuilt out of $total\n" );
+ if ( $numRebuilt === 0 ) {
+ $this->output( "Use --force to rebuild the caches which are still fresh.\n" );
+ }
+ }
+ if ( $parentStatus ) {
+ exit( $parentStatus );
}
}
diff --git a/maintenance/dumpSisterSites.php b/maintenance/rebuildSitesCache.php
index 784dc7a8..2bc75108 100644
--- a/maintenance/dumpSisterSites.php
+++ b/maintenance/rebuildSitesCache.php
@@ -1,11 +1,6 @@
<?php
+
/**
- * Quickie page name dump script for SisterSites usage.
- * http://www.eekim.com/cgi-bin/wiki.pl?SisterSites
- *
- * Copyright © 2006 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -28,35 +23,46 @@
require_once __DIR__ . '/Maintenance.php';
/**
- * Maintenance script that generates a page name dump for SisterSites usage.
+ * Maintenance script to dump a SiteStore as a static json file.
*
* @ingroup Maintenance
*/
-class DumpSisterSites extends Maintenance {
+class RebuildSitesCache extends Maintenance {
+
public function __construct() {
parent::__construct();
- $this->mDescription = "Quickie page name dump script for SisterSites usage";
+
+ $this->mDescription = "Cache sites as json for file-based lookup.";
+ $this->addOption( 'file', 'File to output the json to', false, true );
}
public function execute() {
- $dbr = wfGetDB( DB_SLAVE );
- $dbr->bufferResults( false );
- $result = $dbr->select( 'page',
- array( 'page_namespace', 'page_title' ),
- array(
- 'page_namespace' => NS_MAIN,
- 'page_is_redirect' => 0,
- ),
- __METHOD__ );
-
- foreach ( $result as $row ) {
- $title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $url = $title->getFullURL();
- $text = $title->getPrefixedText();
- $this->output( "$url $text\n" );
+ $sitesCacheFileBuilder = new SitesCacheFileBuilder(
+ new DBSiteStore(),
+ $this->getCacheFile()
+ );
+
+ $sitesCacheFileBuilder->build();
+ }
+
+ /**
+ * @return string
+ */
+ private function getCacheFile() {
+ if ( $this->hasOption( 'file' ) ) {
+ $jsonFile = $this->getOption( 'file' );
+ } else {
+ $jsonFile = $this->getConfig()->get( 'SitesCacheFile' );
+
+ if ( $jsonFile === false ) {
+ $this->error( 'Error: No file set in configuration for SitesCacheFile.', 1 );
+ }
}
+
+ return $jsonFile;
}
+
}
-$maintClass = "DumpSisterSites";
+$maintClass = "RebuildSitesCache";
require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php
index bc85c666..e29d89e1 100644
--- a/maintenance/rebuildtextindex.php
+++ b/maintenance/rebuildtextindex.php
@@ -70,6 +70,7 @@ class RebuildTextIndex extends Maintenance {
if ( $this->db->getType() == 'mysql' ) {
$this->dropMysqlTextIndex();
+ $this->clearSearchIndex();
$this->populateSearchIndex();
$this->createMysqlTextIndex();
} else {
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 0c2f722c..e1b6ac68 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -36,42 +36,51 @@ class RefreshLinks extends Maintenance {
$this->addOption( 'new-only', 'Only affect articles with just a single edit' );
$this->addOption( 'redirects-only', 'Only fix redirects, not all links' );
$this->addOption( 'old-redirects-only', 'Only fix redirects with no redirect table entry' );
- $this->addOption( 'm', 'Maximum replication lag', false, true );
$this->addOption( 'e', 'Last page id to refresh', false, true );
+ $this->addOption( 'dfn-chunk-size', 'Maximum number of existent IDs to check per ' .
+ 'query, default 100000', false, true );
$this->addArg( 'start', 'Page_id to start from, default 1', false );
$this->setBatchSize( 100 );
}
public function execute() {
- $max = $this->getOption( 'm', 0 );
+ // Note that there is a difference between not specifying the start
+ // and end IDs and using the minimum and maximum values from the page
+ // table. In the latter case, deleteLinksFromNonexistent() will not
+ // delete entries for nonexistent IDs that fall outside the range.
+ $start = (int)$this->getArg( 0 ) ?: null;
+ $end = (int)$this->getOption( 'e' ) ?: null;
+ $dfnChunkSize = (int)$this->getOption( 'dfn-chunk-size', 100000 );
if ( !$this->hasOption( 'dfn-only' ) ) {
- $start = $this->getArg( 0, 1 );
$new = $this->getOption( 'new-only', false );
- $end = $this->getOption( 'e', 0 );
$redir = $this->getOption( 'redirects-only', false );
$oldRedir = $this->getOption( 'old-redirects-only', false );
- $this->doRefreshLinks( $start, $new, $max, $end, $redir, $oldRedir );
+ $this->doRefreshLinks( $start, $new, $end, $redir, $oldRedir );
+ $this->deleteLinksFromNonexistent( null, null, $this->mBatchSize, $dfnChunkSize );
+ } else {
+ $this->deleteLinksFromNonexistent( $start, $end, $this->mBatchSize, $dfnChunkSize );
}
- $this->deleteLinksFromNonexistent( $max, $this->mBatchSize );
}
/**
* Do the actual link refreshing.
- * @param int $start Page_id to start from
+ * @param int|null $start Page_id to start from
* @param bool $newOnly Only do pages with 1 edit
- * @param int $maxLag Max DB replication lag
- * @param int $end Page_id to stop at
+ * @param int|null $end Page_id to stop at
* @param bool $redirectsOnly Only fix redirects
* @param bool $oldRedirectsOnly Only fix redirects without redirect entries
*/
- private function doRefreshLinks( $start, $newOnly = false, $maxLag = false,
- $end = 0, $redirectsOnly = false, $oldRedirectsOnly = false
+ private function doRefreshLinks( $start, $newOnly = false,
+ $end = null, $redirectsOnly = false, $oldRedirectsOnly = false
) {
global $wgParser, $wgUseTidy;
$reportingInterval = 100;
$dbr = wfGetDB( DB_SLAVE );
- $start = intval( $start );
+
+ if ( $start === null ) {
+ $start = 1;
+ }
// Give extensions a chance to optimize settings
wfRunHooks( 'MaintenanceRefreshLinksInit', array( $this ) );
@@ -89,15 +98,10 @@ class RefreshLinks extends Maintenance {
$conds = array(
"page_is_redirect=1",
- "rd_from IS NULL"
+ "rd_from IS NULL",
+ self::intervalCond( $dbr, 'page_id', $start, $end ),
);
- if ( $end == 0 ) {
- $conds[] = "page_id >= $start";
- } else {
- $conds[] = "page_id BETWEEN $start AND $end";
- }
-
$res = $dbr->select(
array( 'page', 'redirect' ),
'page_id',
@@ -124,7 +128,8 @@ class RefreshLinks extends Maintenance {
array( 'page_id' ),
array(
'page_is_new' => 1,
- "page_id >= $start" ),
+ self::intervalCond( $dbr, 'page_id', $start, $end ),
+ ),
__METHOD__
);
$num = $res->numRows();
@@ -253,19 +258,60 @@ class RefreshLinks extends Maintenance {
* Removes non-existing links from pages from pagelinks, imagelinks,
* categorylinks, templatelinks, externallinks, interwikilinks, langlinks and redirect tables.
*
- * @param int $maxLag
+ * @param int|null $start Page_id to start from
+ * @param int|null $end Page_id to stop at
* @param int $batchSize The size of deletion batches
+ * @param int $chunkSize Maximum number of existent IDs to check per query
*
* @author Merlijn van Deen <valhallasw@arctus.nl>
*/
- private function deleteLinksFromNonexistent( $maxLag = 0, $batchSize = 100 ) {
+ private function deleteLinksFromNonexistent( $start = null, $end = null, $batchSize = 100,
+ $chunkSize = 100000
+ ) {
wfWaitForSlaves();
+ $this->output( "Deleting illegal entries from the links tables...\n" );
+ $dbr = wfGetDB( DB_SLAVE );
+ do {
+ // Find the start of the next chunk. This is based only
+ // on existent page_ids.
+ $nextStart = $dbr->selectField(
+ 'page',
+ 'page_id',
+ self::intervalCond( $dbr, 'page_id', $start, $end ),
+ __METHOD__,
+ array( 'ORDER BY' => 'page_id', 'OFFSET' => $chunkSize )
+ );
- $dbw = wfGetDB( DB_MASTER );
+ if ( $nextStart !== false ) {
+ // To find the end of the current chunk, subtract one.
+ // This will serve to limit the number of rows scanned in
+ // dfnCheckInterval(), per query, to at most the sum of
+ // the chunk size and deletion batch size.
+ $chunkEnd = $nextStart - 1;
+ } else {
+ // This is the last chunk. Check all page_ids up to $end.
+ $chunkEnd = $end;
+ }
+
+ $fmtStart = $start !== null ? "[$start" : '(-INF';
+ $fmtChunkEnd = $chunkEnd !== null ? "$chunkEnd]" : 'INF)';
+ $this->output( " Checking interval $fmtStart, $fmtChunkEnd\n" );
+ $this->dfnCheckInterval( $start, $chunkEnd, $batchSize );
+
+ $start = $nextStart;
- $lb = wfGetLBFactory()->newMainLB();
- $dbr = $lb->getConnection( DB_SLAVE );
- $dbr->bufferResults( false );
+ } while ( $nextStart !== false );
+ }
+
+ /**
+ * @see RefreshLinks::deleteLinksFromNonexistent()
+ * @param int|null $start Page_id to start from
+ * @param int|null $end Page_id to stop at
+ * @param int $batchSize The size of deletion batches
+ */
+ private function dfnCheckInterval( $start = null, $end = null, $batchSize = 100 ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbr = wfGetDB( DB_SLAVE );
$linksTables = array( // table name => page_id field
'pagelinks' => 'pl_from',
@@ -280,40 +326,58 @@ class RefreshLinks extends Maintenance {
);
foreach ( $linksTables as $table => $field ) {
- $this->output( "Retrieving illegal entries from $table... " );
-
- // SELECT DISTINCT( $field ) FROM $table LEFT JOIN page ON $field=page_id WHERE page_id IS NULL;
- $results = $dbr->select(
- array( $table, 'page' ),
- $field,
- array( 'page_id' => null ),
- __METHOD__,
- 'DISTINCT',
- array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
- );
-
+ $this->output( " $table: 0" );
$counter = 0;
- $list = array();
- $this->output( "0.." );
- foreach ( $results as $row ) {
- $counter++;
- $list[] = $row->$field;
- if ( ( $counter % $batchSize ) == 0 ) {
+ do {
+ $ids = $dbr->selectFieldValues(
+ $table,
+ $field,
+ array(
+ self::intervalCond( $dbr, $field, $start, $end ),
+ "$field NOT IN ({$dbr->selectSQLText( 'page', 'page_id' )})",
+ ),
+ __METHOD__,
+ array( 'DISTINCT', 'ORDER BY' => $field, 'LIMIT' => $batchSize )
+ );
+
+ $numIds = count( $ids );
+ if ( $numIds ) {
+ $counter += $numIds;
wfWaitForSlaves();
- $dbw->delete( $table, array( $field => $list ), __METHOD__ );
-
- $this->output( $counter . ".." );
- $list = array();
+ $dbw->delete( $table, array( $field => $ids ), __METHOD__ );
+ $this->output( ", $counter" );
+ $start = $ids[$numIds - 1] + 1;
}
- }
- $this->output( $counter );
- if ( count( $list ) > 0 ) {
- $dbw->delete( $table, array( $field => $list ), __METHOD__ );
- }
- $this->output( "\n" );
+
+ } while ( $numIds >= $batchSize && ( $end === null || $start <= $end ) );
+
+ $this->output( " deleted.\n" );
+
wfWaitForSlaves();
}
- $lb->closeAll();
+ }
+
+ /**
+ * Build a SQL expression for a closed interval (i.e. BETWEEN).
+ *
+ * By specifying a null $start or $end, it is also possible to create
+ * half-bounded or unbounded intervals using this function.
+ *
+ * @param IDatabase $db Database connection
+ * @param string $var Field name
+ * @param mixed $start First value to include or null
+ * @param mixed $end Last value to include or null
+ */
+ private static function intervalCond( IDatabase $db, $var, $start, $end ) {
+ if ( $start === null && $end === null ) {
+ return "$var IS NOT NULL";
+ } elseif ( $end === null ) {
+ return "$var >= {$db->addQuotes( $start )}";
+ } elseif ( $start === null ) {
+ return "$var <= {$db->addQuotes( $end )}";
+ } else {
+ return "$var BETWEEN {$db->addQuotes( $start )} AND {$db->addQuotes( $end )}";
+ }
}
}
diff --git a/maintenance/removeInvalidEmails.php b/maintenance/removeInvalidEmails.php
new file mode 100644
index 00000000..265723a4
--- /dev/null
+++ b/maintenance/removeInvalidEmails.php
@@ -0,0 +1,78 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * A script to remove emails that are invalid from
+ * the user_email column of the user table. Emails
+ * are validated before users can add them, but
+ * this was not always the case so older users may
+ * have invalid ones.
+ *
+ * By default it does a dry-run, pass --commit
+ * to actually update the database.
+ */
+class RemoveInvalidEmails extends Maintenance {
+
+ private $commit = false;
+
+ public function __construct() {
+ parent::__construct();
+ $this->addOption( 'commit', 'Whether to actually update the database', false, false );
+ $this->setBatchSize( 500 );
+ }
+ public function execute() {
+ $this->commit = $this->hasOption( 'commit' );
+ $dbr = $this->getDB( DB_SLAVE );
+ $dbw = $this->getDB( DB_MASTER );
+ $lastId = 0;
+ do {
+ $rows = $dbr->select(
+ 'user',
+ array( 'user_id', 'user_email' ),
+ array(
+ 'user_id > ' . $dbr->addQuotes( $lastId ),
+ 'user_email != ""',
+ 'user_email_authenticated IS NULL'
+ ),
+ __METHOD__,
+ array( 'LIMIT' => $this->mBatchSize )
+ );
+ $count = $rows->numRows();
+ $badIds = array();
+ foreach ( $rows as $row ) {
+ if ( !Sanitizer::validateEmail( trim( $row->user_email ) ) ) {
+ $this->output( "Found bad email: {$row->user_email} for user #{$row->user_id}\n" );
+ $badIds[] = $row->user_id;
+ }
+ if ( $row->user_id > $lastId ) {
+ $lastId = $row->user_id;
+ }
+ }
+
+ if ( $badIds ) {
+ $badCount = count( $badIds );
+ if ( $this->commit ) {
+ $this->output( "Removing $badCount emails from the database.\n" );
+ $dbw->update(
+ 'user',
+ array( 'user_email' => '' ),
+ array( 'user_id' => $badIds ),
+ __METHOD__
+ );
+ foreach ( $badIds as $badId ) {
+ User::newFromId( $badId )->invalidateCache();
+ }
+ wfWaitForSlaves();
+ } else {
+ $this->output( "Would have removed $badCount emails from the database.\n" );
+
+ }
+ }
+ } while ( $count !== 0 );
+ $this->output( "Done.\n" );
+ }
+}
+
+$maintClass = 'RemoveInvalidEmails';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/renderDump.php b/maintenance/renderDump.php
index 169f512c..2218a5e7 100644
--- a/maintenance/renderDump.php
+++ b/maintenance/renderDump.php
@@ -61,7 +61,7 @@ class DumpRenderer extends Maintenance {
}
$source = new ImportStreamSource( $this->getStdin() );
- $importer = new WikiImporter( $source );
+ $importer = new WikiImporter( $source, $this->getConfig() );
$importer->setRevisionCallback(
array( &$this, 'handleRevision' ) );
diff --git a/maintenance/resources/update-oojs-ui.sh b/maintenance/resources/update-oojs-ui.sh
index 1b352922..f6245f27 100644
--- a/maintenance/resources/update-oojs-ui.sh
+++ b/maintenance/resources/update-oojs-ui.sh
@@ -1,95 +1,69 @@
#!/usr/bin/env bash
-# This script generates a commit that updates our distribution copy of OOjs UI
+# This script generates a commit that updates our copy of OOjs UI
-if [ -z "$1" ]
+if [ -n "$2" ]
then
- # Missing required parameter
- echo >&2 "Usage: $0 path/to/repo/for/oojs-ui"
+ # Too many parameters
+ echo >&2 "Usage: $0 [<version>]"
exit 1
fi
-TARGET_REPO=$(cd "$(dirname $0)/../.."; pwd)
-TARGET_DIR=resources/lib/oojs-ui
-UI_REPO=$1
-
-function oojsuihash() {
- grep "OOjs UI v" "$TARGET_REPO/$TARGET_DIR/oojs-ui.js" \
- | head -n 1 \
- | grep -Eo '\([a-z0-9]+\)' \
- | sed 's/^(//' \
- | sed 's/)$//'
-}
-
-function oojsuitag() {
- grep "OOjs UI v" "$TARGET_REPO/$TARGET_DIR/oojs-ui.js" \
- | head -n 1 \
- | grep -Eo '\bv[0-9a-z.-]+\b'
-}
-
-function oojsuiversion() {
- grep "OOjs UI v" "$TARGET_REPO/$TARGET_DIR/oojs-ui.js" \
- | head -n 1 \
- | grep -Eo '\bv[0-9a-z.-]+\b.*$'
-}
+REPO_DIR=$(cd "$(dirname $0)/../.."; pwd) # Root dir of the git repo working tree
+TARGET_DIR="resources/lib/oojs-ui" # Destination relative to the root of the repo
+NPM_DIR=$(mktemp -d 2>/dev/null || mktemp -d -t 'update-oojs-ui') # e.g. /tmp/update-oojs-ui.rI0I5Vir
# Prepare working tree
-cd "$TARGET_REPO" &&
+cd "$REPO_DIR" &&
+git reset composer.json && git checkout composer.json &&
git reset $TARGET_DIR && git checkout $TARGET_DIR && git fetch origin &&
-git checkout -B upstream-oojsui origin/master || exit 1
-
-cd $UI_REPO || exit 1
+git checkout -B upstream-oojs-ui origin/master || exit 1
-# Read the old version and check for changes
-OLDHASH=$(oojsuihash)
-if [ -z "$OLDHASH" ]
+# Fetch upstream version
+cd $NPM_DIR
+if [ -n "$1" ]
then
- OLDTAG=$(oojsuitag)
+ npm install "oojs-ui@$1" || exit 1
+else
+ npm install oojs-ui || exit 1
fi
-if [ "$OLDHASH" == "" ]
-then
- OLDHASH=$(git rev-parse "$OLDTAG")
- if [ $? != 0 ]
- then
- echo "Could not find OOjs UI version"
- cd -
- exit 1
- fi
-fi
-if [ "$(git rev-parse $OLDHASH)" == "$(git rev-parse HEAD)" ]
+
+OOJSUI_VERSION=$(node -e 'console.log(require("./node_modules/oojs-ui/package.json").version);')
+if [ "$OOJSUI_VERSION" == "" ]
then
- echo "No changes (already at $OLDHASH)"
- cd -
- exit 0
+ echo 'Could not find OOjs UI version'
+ exit 1
fi
-# Build the distribution
-npm install && grunt git-build || exit 1
-
-# Get the list of changes
-NEWCHANGES=$(git log $OLDHASH.. --oneline --no-merges --reverse --color=never)
-NEWCHANGESDISPLAY=$(git log $OLDHASH.. --oneline --no-merges --reverse --color=always)
-
-# Copy files
-# - Exclude the default non-svg stylesheet
-rsync --recursive --delete --force --exclude 'oojs-ui.css' --exclude 'oojs-ui*.rtl.css' ./dist/ "$TARGET_REPO/$TARGET_DIR" || exit 1
-
-# Read the new version
-NEWVERSION=$(oojsuiversion)
+# Copy files, excluding:
+# * the Apex theme files,
+# * the minimised distribution files, and
+# * the RTL sheets for non-CSSJanus environments
+# * the raster- and vector-only distribution sheets
+rsync --force --recursive --delete \
+ --exclude '*apex*' \
+ --exclude 'oojs-ui*.min.*' \
+ --exclude 'oojs-ui*.rtl.css' \
+ --exclude 'oojs-ui*.raster.css' \
+ --exclude 'oojs-ui*.vector.css' \
+ ./node_modules/oojs-ui/dist/ "$REPO_DIR/$TARGET_DIR" || exit 1
+
+# Clean up temporary area
+rm -rf "$NPM_DIR"
# Generate commit
-cd "$TARGET_REPO"
+cd $REPO_DIR || exit 1
+
COMMITMSG=$(cat <<END
-Update OOjs UI to $NEWVERSION
+Update OOjs UI to v$OOJSUI_VERSION
-New changes:
-$NEWCHANGES
+Release notes:
+ https://git.wikimedia.org/blob/oojs%2Fui.git/v$OOJSUI_VERSION/History.md
END
)
-git add -u $TARGET_DIR && git add $TARGET_DIR && git commit -m "$COMMITMSG"
-cat >&2 <<END
+# Update composer.json as well
+composer require oojs/oojs-ui $OOJSUI_VERSION --no-update
-Created commit with changes:
-$NEWCHANGESDISPLAY
-END
+# Stage deletion, modification and creation of files. Then commit.
+git add --update $TARGET_DIR && git add $TARGET_DIR && git add composer.json && git commit -m "$COMMITMSG" || exit 1
diff --git a/maintenance/resources/update-oojs.sh b/maintenance/resources/update-oojs.sh
index d9e6fb9d..1d5c2b17 100644
--- a/maintenance/resources/update-oojs.sh
+++ b/maintenance/resources/update-oojs.sh
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
+# This script generates a commit that updates our copy of OOjs
+
if [ -n "$2" ]
then
# Too many parameters
@@ -25,7 +27,7 @@ else
npm install oojs || exit 1
fi
-OOJS_VERSION=$(node -e 'console.log(JSON.parse(require("fs").readFileSync("./node_modules/oojs/package.json")).version);')
+OOJS_VERSION=$(node -e 'console.log(require("./node_modules/oojs/package.json").version);')
if [ "$OOJS_VERSION" == "" ]
then
echo 'Could not find OOjs version'
diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index 40605ceb..3864e3c6 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -23,6 +23,8 @@
require_once __DIR__ . '/Maintenance.php';
+use MediaWiki\Logger\LoggerFactory;
+
/**
* Maintenance script that runs pending jobs.
*
@@ -68,7 +70,7 @@ class RunJobs extends Maintenance {
$json = ( $this->getOption( 'result' ) === 'json' );
- $runner = new JobRunner();
+ $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
if ( !$json ) {
$runner->setDebugHandler( array( $this, 'debugInternal' ) );
}
diff --git a/maintenance/showJobs.php b/maintenance/showJobs.php
index b8dc5548..9e9ad327 100644
--- a/maintenance/showJobs.php
+++ b/maintenance/showJobs.php
@@ -38,16 +38,19 @@ class ShowJobs extends Maintenance {
parent::__construct();
$this->mDescription = "Show number of jobs waiting in master database";
$this->addOption( 'group', 'Show number of jobs per job type' );
- $this->addOption(
- 'list',
- 'Show a complete list of all jobs in a machine-readable format, instead of statistics'
- );
+ $this->addOption( 'list',
+ 'Show a list of all jobs in a machine-readable format, instead of statistics' );
+ $this->addOption( 'type', 'Only show/count jobs of a given type', false, true );
}
public function execute() {
+ $filterType = $this->getOption( 'type', '' );
$group = JobQueueGroup::singleton();
if ( $this->hasOption( 'list' ) ) {
foreach ( $group->getQueueTypes() as $type ) {
+ if ( $filterType != '' && $type != $filterType ) {
+ continue;
+ }
$queue = $group->get( $type );
foreach ( $queue->getAllQueuedJobs() as $job ) {
$this->output( $job->toString() . " status=unclaimed\n" );
@@ -55,9 +58,15 @@ class ShowJobs extends Maintenance {
foreach ( $queue->getAllDelayedJobs() as $job ) {
$this->output( $job->toString() . " status=delayed\n" );
}
+ foreach ( $queue->getAllAbandonedJobs() as $job ) {
+ $this->output( $job->toString() . " status=abandoned\n" );
+ }
}
} elseif ( $this->hasOption( 'group' ) ) {
foreach ( $group->getQueueTypes() as $type ) {
+ if ( $filterType != '' && $type != $filterType ) {
+ continue;
+ }
$queue = $group->get( $type );
$delayed = $queue->getDelayedCount();
$pending = $queue->getSize();
@@ -75,6 +84,9 @@ class ShowJobs extends Maintenance {
} else {
$count = 0;
foreach ( $group->getQueueTypes() as $type ) {
+ if ( $filterType != '' && $type != $filterType ) {
+ continue;
+ }
$count += $group->get( $type )->getSize();
}
$this->output( "$count\n" );
diff --git a/maintenance/showSiteStats.php b/maintenance/showSiteStats.php
index 374a66e9..370d14eb 100644
--- a/maintenance/showSiteStats.php
+++ b/maintenance/showSiteStats.php
@@ -44,7 +44,6 @@ class ShowSiteStats extends Maintenance {
public function execute() {
$fields = array(
- 'ss_total_views' => 'Total views',
'ss_total_edits' => 'Total edits',
'ss_good_articles' => 'Number of articles',
'ss_total_pages' => 'Total pages',
diff --git a/maintenance/sql.php b/maintenance/sql.php
index afa3ef72..886e3f10 100644
--- a/maintenance/sql.php
+++ b/maintenance/sql.php
@@ -39,7 +39,8 @@ class MwSql extends Maintenance {
}
public function execute() {
- $wiki = $this->getOption( 'wikidb' ) ?: false;
+ // We wan't to allow "" for the wikidb, meaning don't call select_db()
+ $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
// Get the appropriate load balancer (for this wiki)
if ( $this->hasOption( 'cluster' ) ) {
$lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc
index 5c0fd07f..e1731908 100644
--- a/maintenance/sqlite.inc
+++ b/maintenance/sqlite.inc
@@ -59,7 +59,7 @@ class Sqlite {
'blob', // NULL type is omitted intentionally
) );
- $db = new DatabaseSqliteStandalone( ':memory:' );
+ $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
try {
foreach ( $files as $file ) {
$err = $db->sourceFile( $file );
diff --git a/maintenance/sqlite.php b/maintenance/sqlite.php
index edc9e145..7e02a4b2 100644
--- a/maintenance/sqlite.php
+++ b/maintenance/sqlite.php
@@ -81,7 +81,7 @@ class SqliteMaintenance extends Maintenance {
}
private function vacuum() {
- $prevSize = filesize( $this->db->mDatabaseFile );
+ $prevSize = filesize( $this->db->getDbFilePath() );
if ( $prevSize == 0 ) {
$this->error( "Can't vacuum an empty database.\n", true );
}
@@ -89,7 +89,7 @@ class SqliteMaintenance extends Maintenance {
$this->output( 'VACUUM: ' );
if ( $this->db->query( 'VACUUM' ) ) {
clearstatcache();
- $newSize = filesize( $this->db->mDatabaseFile );
+ $newSize = filesize( $this->db->getDbFilePath() );
$this->output( sprintf( "Database size was %d, now %d (%.1f%% reduction).\n",
$prevSize, $newSize, ( $prevSize - $newSize ) * 100.0 / $prevSize ) );
} else {
@@ -115,7 +115,7 @@ class SqliteMaintenance extends Maintenance {
private function backup( $fileName ) {
$this->output( "Backing up database:\n Locking..." );
$this->db->query( 'BEGIN IMMEDIATE TRANSACTION', __METHOD__ );
- $ourFile = $this->db->mDatabaseFile;
+ $ourFile = $this->db->getDbFilePath();
$this->output( " Copying database file $ourFile to $fileName... " );
wfSuppressWarnings( false );
if ( !copy( $ourFile, $fileName ) ) {
diff --git a/maintenance/sqlite/archives/initial-indexes.sql b/maintenance/sqlite/archives/initial-indexes.sql
index 954c85d3..f322a03c 100644
--- a/maintenance/sqlite/archives/initial-indexes.sql
+++ b/maintenance/sqlite/archives/initial-indexes.sql
@@ -69,7 +69,6 @@ CREATE TABLE /*_*/page_tmp (
page_namespace int NOT NULL,
page_title varchar(255) binary NOT NULL,
page_restrictions tinyblob NOT NULL,
- page_counter bigint unsigned NOT NULL default 0,
page_is_redirect tinyint unsigned NOT NULL default 0,
page_is_new tinyint unsigned NOT NULL default 0,
page_random real unsigned NOT NULL,
@@ -164,7 +163,6 @@ CREATE INDEX /*i*/ll_lang_title ON /*_*/langlinks_tmp (ll_lang, ll_title);
CREATE TABLE /*_*/site_stats_tmp (
ss_row_id int unsigned NOT NULL,
- ss_total_views bigint unsigned default 0,
ss_total_edits bigint unsigned default 0,
ss_good_articles bigint unsigned default 0,
ss_total_pages bigint default '-1',
diff --git a/maintenance/sqlite/archives/patch-drop-page_counter.sql b/maintenance/sqlite/archives/patch-drop-page_counter.sql
new file mode 100644
index 00000000..ac8151da
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-drop-page_counter.sql
@@ -0,0 +1,31 @@
+-- field is deprecated and no longer updated as of 1.25
+CREATE TABLE /*_*/page_tmp (
+ page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ page_namespace int NOT NULL,
+ page_title varchar(255) binary NOT NULL,
+ page_restrictions tinyblob NOT NULL,
+ page_is_redirect tinyint unsigned NOT NULL default 0,
+ page_is_new tinyint unsigned NOT NULL default 0,
+ page_random real unsigned NOT NULL,
+ page_touched binary(14) NOT NULL default '',
+ page_links_updated varbinary(14) NULL default NULL,
+ page_latest int unsigned NOT NULL,
+ page_len int unsigned NOT NULL,
+ page_content_model varbinary(32) DEFAULT NULL,
+ page_lang varbinary(35) DEFAULT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/page_tmp
+ SELECT page_id, page_namespace, page_title, page_restrictions, page_is_redirect,
+ page_is_new, page_random, page_touched, page_links_updated, page_latest, page_len,
+ page_content_model, page_lang
+ FROM /*_*/page;
+
+DROP TABLE /*_*/page;
+
+ALTER TABLE /*_*/page_tmp RENAME TO /*_*/page;
+
+CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
+CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
+CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
+CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
diff --git a/maintenance/sqlite/archives/patch-drop-ss_admins.sql b/maintenance/sqlite/archives/patch-drop-ss_admins.sql
index 9951e17e..39606630 100644
--- a/maintenance/sqlite/archives/patch-drop-ss_admins.sql
+++ b/maintenance/sqlite/archives/patch-drop-ss_admins.sql
@@ -1,7 +1,6 @@
-- field is deprecated and no longer updated as of 1.5
CREATE TABLE /*_*/site_stats_tmp (
ss_row_id int unsigned NOT NULL,
- ss_total_views bigint unsigned default 0,
ss_total_edits bigint unsigned default 0,
ss_good_articles bigint unsigned default 0,
ss_total_pages bigint default '-1',
@@ -11,7 +10,7 @@ CREATE TABLE /*_*/site_stats_tmp (
) /*$wgDBTableOptions*/;
INSERT INTO /*_*/site_stats_tmp
- SELECT ss_row_id, ss_total_views, ss_total_edits, ss_good_articles,
+ SELECT ss_row_id, ss_total_edits, ss_good_articles,
ss_total_pages, ss_users, ss_active_users, ss_images
FROM /*_*/site_stats;
diff --git a/maintenance/sqlite/archives/patch-drop-ss_total_views.sql b/maintenance/sqlite/archives/patch-drop-ss_total_views.sql
new file mode 100644
index 00000000..ad80988d
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-drop-ss_total_views.sql
@@ -0,0 +1,21 @@
+-- field is deprecated and no longer updated as of 1.25
+CREATE TABLE /*_*/site_stats_tmp (
+ ss_row_id int unsigned NOT NULL,
+ ss_total_edits bigint unsigned default 0,
+ ss_good_articles bigint unsigned default 0,
+ ss_total_pages bigint default '-1',
+ ss_users bigint default '-1',
+ ss_active_users bigint default '-1',
+ ss_images int default 0
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/site_stats_tmp
+ SELECT ss_row_id, ss_total_edits, ss_good_articles, ss_total_pages,
+ ss_users, ss_active_users, ss_images
+ FROM /*_*/site_stats;
+
+DROP TABLE /*_*/site_stats;
+
+ALTER TABLE /*_*/site_stats_tmp RENAME TO /*_*/site_stats;
+
+CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
diff --git a/maintenance/sqlite/archives/patch-editsummary-length.sql b/maintenance/sqlite/archives/patch-editsummary-length.sql
new file mode 100644
index 00000000..f86b2ada
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-editsummary-length.sql
@@ -0,0 +1,65 @@
+CREATE TABLE /*_*/filearchive_tmp (
+ -- Unique row id
+ fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+ -- Original base filename; key to image.img_name, page.page_title, etc
+ fa_name varchar(255) binary NOT NULL default '',
+
+ -- Filename of archived file, if an old revision
+ fa_archive_name varchar(255) binary default '',
+
+ -- Which storage bin (directory tree or object store) the file data
+ -- is stored in. Should be 'deleted' for files that have been deleted;
+ -- any other bin is not yet in use.
+ fa_storage_group varbinary(16),
+
+ -- SHA-1 of the file contents plus extension, used as a key for storage.
+ -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
+ --
+ -- If NULL, the file was missing at deletion time or has been purged
+ -- from the archival storage.
+ fa_storage_key varbinary(64) default '',
+
+ -- Deletion information, if this file is deleted.
+ fa_deleted_user int,
+ fa_deleted_timestamp binary(14) default '',
+ fa_deleted_reason varbinary(767) default '',
+ -- Duped fields from image
+ fa_size int unsigned default 0,
+ fa_width int default 0,
+ fa_height int default 0,
+ fa_metadata mediumblob,
+ fa_bits int default 0,
+ fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+ fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
+ fa_minor_mime varbinary(100) default "unknown",
+ fa_description varbinary(767),
+ fa_user int unsigned default 0,
+ fa_user_text varchar(255) binary,
+ fa_timestamp binary(14) default '',
+
+ -- Visibility of deleted revisions, bitfield
+ fa_deleted tinyint unsigned NOT NULL default 0,
+
+ -- sha1 hash of file content
+ fa_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+
+INSERT INTO /*_*/filearchive_tmp
+ SELECT fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key, fa_deleted_user, fa_deleted_timestamp,
+ fa_deleted_reason, fa_size, fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
+ fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp, fa_deleted, fa_sha1
+ FROM /*_*/filearchive;
+
+DROP TABLE /*_*/filearchive;
+
+ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive;
+
+
+CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
+CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
+CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
+CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
+
diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php
index 0f996625..c0f6c7b6 100644
--- a/maintenance/storage/checkStorage.php
+++ b/maintenance/storage/checkStorage.php
@@ -39,6 +39,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
/**
* Maintenance script to do various checks on external storage.
*
+ * @fixme this should extend the base Maintenance class
* @ingroup Maintenance ExternalStorage
*/
class CheckStorage {
@@ -466,7 +467,10 @@ class CheckStorage {
$dbw->ping();
$source = new ImportStreamSource( $file );
- $importer = new WikiImporter( $source );
+ $importer = new WikiImporter(
+ $source,
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ );
$importer->setRevisionCallback( array( &$this, 'importRevision' ) );
$importer->doImport();
}
diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php
index cfffbbca..3cb4a2ba 100644
--- a/maintenance/storage/compressOld.php
+++ b/maintenance/storage/compressOld.php
@@ -50,9 +50,15 @@ require_once __DIR__ . '/../Maintenance.php';
*/
class CompressOld extends Maintenance {
/**
- * @todo document
+ * Option to load each revision individually.
+ *
*/
const LS_INDIVIDUAL = 0;
+
+ /**
+ * Option to load revisions in chunks.
+ *
+ */
const LS_CHUNKED = 1;
public function __construct() {
@@ -137,7 +143,8 @@ class CompressOld extends Maintenance {
}
/**
- * @todo document
+ * Fetch the text row-by-row to 'compressPage' function for compression.
+ *
* @param int $start
* @param string $extdb
*/
@@ -172,7 +179,8 @@ class CompressOld extends Maintenance {
}
/**
- * @todo document
+ * Compress the text in gzip format.
+ *
* @param stdClass $row
* @param string $extdb
* @return bool
@@ -214,6 +222,8 @@ class CompressOld extends Maintenance {
}
/**
+ * Compress the text in chunks after concatenating the revisions.
+ *
* @param int $startId
* @param int $maxChunkSize
* @param string $beginDate
diff --git a/maintenance/storage/moveToExternal.php b/maintenance/storage/moveToExternal.php
index 348fb773..ab59cb8d 100644
--- a/maintenance/storage/moveToExternal.php
+++ b/maintenance/storage/moveToExternal.php
@@ -25,7 +25,6 @@ define( 'REPORTING_INTERVAL', 1 );
if ( !defined( 'MEDIAWIKI' ) ) {
require_once __DIR__ . '/../commandLine.inc';
- require_once __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php';
require_once 'resolveStubs.php';
$fname = 'moveToExternal';
diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php
index 910f56bd..3562df62 100644
--- a/maintenance/storage/recompressTracked.php
+++ b/maintenance/storage/recompressTracked.php
@@ -22,6 +22,8 @@
* @ingroup Maintenance ExternalStorage
*/
+use MediaWiki\Logger\LegacyLogger;
+
$optionsWithArgs = RecompressTracked::getOptionsWithArgs();
require __DIR__ . '/../commandLine.inc';
@@ -141,7 +143,7 @@ class RecompressTracked {
$header .= "({$this->slaveId})";
}
$header .= ' ' . wfWikiID();
- wfErrorLog( sprintf( "%-50s %s\n", $header, $msg ), $file );
+ LegacyLogger::emit( sprintf( "%-50s %s\n", $header, $msg ), $file );
}
/**
@@ -471,7 +473,7 @@ class RecompressTracked {
* @param int $pageId
*/
function doPage( $pageId ) {
- $title = Title::newFromId( $pageId );
+ $title = Title::newFromID( $pageId );
if ( $title ) {
$titleText = $title->getPrefixedText();
} else {
diff --git a/maintenance/storage/resolveStubs.php b/maintenance/storage/resolveStubs.php
index 290f1649..36741cb2 100644
--- a/maintenance/storage/resolveStubs.php
+++ b/maintenance/storage/resolveStubs.php
@@ -22,8 +22,6 @@
* @ingroup Maintenance ExternalStorage
*/
-define( 'REPORTING_INTERVAL', 100 );
-
if ( !defined( 'MEDIAWIKI' ) ) {
$optionsWithArgs = array( 'm' );
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index 02286848..bf93a232 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -182,7 +182,7 @@ CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg
--
CREATE TABLE /*_*/user_newtalk (
-- Key to user.user_id
- user_id int NOT NULL default 0,
+ user_id int unsigned NOT NULL default 0,
-- If the user is an anonymous user their IP address is stored here
-- since the user_id of 0 is ambiguous
user_ip varbinary(40) NOT NULL default '',
@@ -241,9 +241,6 @@ CREATE TABLE /*_*/page (
-- can move or edit the page.
page_restrictions tinyblob NOT NULL,
- -- Number of times this page has been viewed.
- page_counter bigint unsigned NOT NULL default 0,
-
-- 1 indicates the article is a redirect.
page_is_redirect tinyint unsigned NOT NULL default 0,
@@ -307,7 +304,7 @@ CREATE TABLE /*_*/revision (
-- Text comment summarizing the change.
-- This text is shown in the history and other changes lists,
-- rendered in a subset of wiki markup by Linker::formatComment()
- rev_comment tinyblob NOT NULL,
+ rev_comment varbinary(767) NOT NULL,
-- Key to user.user_id of the user who made this edit.
-- Stores 0 for anonymous edits and for some mass imports.
@@ -374,13 +371,20 @@ CREATE TABLE /*_*/text (
-- Comma-separated list of flags:
-- gzip: text is compressed with PHP's gzdeflate() function.
- -- utf8: text was stored as UTF-8.
- -- If $wgLegacyEncoding option is on, rows *without* this flag
- -- will be converted to UTF-8 transparently at load time.
+ -- utf-8: text was stored as UTF-8.
+ -- If $wgLegacyEncoding option is on, rows *without* this flag
+ -- will be converted to UTF-8 transparently at load time. Note
+ -- that due to a bug in a maintenance script, this flag may
+ -- have been stored as 'utf8' in some cases (T18841).
-- object: text field contained a serialized PHP object.
-- The object either contains multiple versions compressed
-- together to achieve a better compression ratio, or it refers
-- to another row where the text can be found.
+ -- external: text was stored in an external location specified by old_text.
+ -- Any additional flags apply to the data stored at that URL, not
+ -- the URL itself. The 'object' flag is *not* set for URLs of the
+ -- form 'DB://cluster/id/itemid', because the external storage
+ -- system itself decompresses these.
old_flags tinyblob NOT NULL
) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
@@ -407,7 +411,7 @@ CREATE TABLE /*_*/archive (
ar_text mediumblob NOT NULL,
-- Basic revision stuff...
- ar_comment tinyblob NOT NULL,
+ ar_comment varbinary(767) NOT NULL,
ar_user int unsigned NOT NULL default 0,
ar_user_text varchar(255) binary NOT NULL,
ar_timestamp binary(14) NOT NULL default '',
@@ -697,9 +701,6 @@ CREATE TABLE /*_*/site_stats (
-- The single row should contain 1 here.
ss_row_id int unsigned NOT NULL,
- -- Total number of page views, if hit counters are enabled.
- ss_total_views bigint unsigned default 0,
-
-- Total number of edits performed.
ss_total_edits bigint unsigned default 0,
@@ -726,19 +727,6 @@ CREATE TABLE /*_*/site_stats (
-- Pointless index to assuage developer superstitions
CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
-
---
--- Stores an ID for every time any article is visited;
--- depending on $wgHitcounterUpdateFreq, it is
--- periodically cleared and the page_counter column
--- in the page table updated for all the articles
--- that have been visited.)
---
-CREATE TABLE /*_*/hitcounter (
- hc_id int unsigned NOT NULL
-) ENGINE=MEMORY MAX_ROWS=25000;
-
-
--
-- The internet is full of jerks, alas. Sometimes it's handy
-- to block a vandal or troll account.
@@ -760,7 +748,7 @@ CREATE TABLE /*_*/ipblocks (
ipb_by_text varchar(255) binary NOT NULL default '',
-- Text comment made by blocker.
- ipb_reason tinyblob NOT NULL,
+ ipb_reason varbinary(767) NOT NULL,
-- Creation (or refresh) date in standard YMDHMS form.
-- IP blocks expire automatically.
@@ -858,7 +846,7 @@ CREATE TABLE /*_*/image (
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
- img_description tinyblob NOT NULL,
+ img_description varbinary(767) NOT NULL,
-- user_id and user_name of uploader.
img_user int unsigned NOT NULL default 0,
@@ -900,7 +888,7 @@ CREATE TABLE /*_*/oldimage (
oi_width int NOT NULL default 0,
oi_height int NOT NULL default 0,
oi_bits int NOT NULL default 0,
- oi_description tinyblob NOT NULL,
+ oi_description varbinary(767) NOT NULL,
oi_user int unsigned NOT NULL default 0,
oi_user_text varchar(255) binary NOT NULL,
oi_timestamp binary(14) NOT NULL default '',
@@ -948,7 +936,7 @@ CREATE TABLE /*_*/filearchive (
-- Deletion information, if this file is deleted.
fa_deleted_user int,
fa_deleted_timestamp binary(14) default '',
- fa_deleted_reason text,
+ fa_deleted_reason varbinary(767) default '',
-- Duped fields from image
fa_size int unsigned default 0,
@@ -959,7 +947,7 @@ CREATE TABLE /*_*/filearchive (
fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
fa_minor_mime varbinary(100) default "unknown",
- fa_description tinyblob,
+ fa_description varbinary(767),
fa_user int unsigned default 0,
fa_user_text varchar(255) binary,
fa_timestamp binary(14) default '',
@@ -1057,7 +1045,7 @@ CREATE TABLE /*_*/recentchanges (
rc_title varchar(255) binary NOT NULL default '',
-- as in revision...
- rc_comment varchar(255) binary NOT NULL default '',
+ rc_comment varbinary(767) NOT NULL default '',
rc_minor tinyint unsigned NOT NULL default 0,
-- Edits by user accounts with the 'bot' rights key are
@@ -1265,7 +1253,7 @@ CREATE TABLE /*_*/logging (
log_page int unsigned NULL,
-- Freeform text. Interpreted as edit history comments.
- log_comment varchar(255) NOT NULL default '',
+ log_comment varbinary(767) NOT NULL default '',
-- miscellaneous parameters:
-- LF separated list (old system) or serialized PHP array (new system)
@@ -1424,7 +1412,7 @@ CREATE TABLE /*_*/protected_titles (
pt_namespace int NOT NULL,
pt_title varchar(255) binary NOT NULL,
pt_user int unsigned NOT NULL,
- pt_reason tinyblob,
+ pt_reason varbinary(767),
pt_timestamp binary(14) NOT NULL,
pt_expiry varbinary(14) NOT NULL default '',
pt_create_perm varbinary(60) NOT NULL
diff --git a/maintenance/update.php b/maintenance/update.php
index 046d73cd..7e0748be 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -26,11 +26,6 @@
* @ingroup Maintenance
*/
-if ( !function_exists( 'version_compare' ) || ( version_compare( PHP_VERSION, '5.3.2' ) < 0 ) ) {
- require dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
- wfPHPVersionError( 'cli' );
-}
-
$wgUseMasterForMaintenance = true;
require_once __DIR__ . '/Maintenance.php';
@@ -56,6 +51,10 @@ class UpdateMediaWiki extends Maintenance {
true
);
$this->addOption( 'force', 'Override when $wgAllowSchemaUpdates disables this script' );
+ $this->addOption(
+ 'skip-external-dependencies',
+ 'Skips checking whether external dependencies are up to date, mostly for developers'
+ );
}
function getDbType() {
@@ -131,13 +130,23 @@ class UpdateMediaWiki extends Maintenance {
wfCountdown( 5 );
}
+ // Check external dependencies are up to date
+ if ( !$this->hasOption( 'skip-external-dependencies' ) ) {
+ $composerLockUpToDate = $this->runChild( 'CheckComposerLockUpToDate' );
+ $composerLockUpToDate->execute();
+ } else {
+ $this->output(
+ "Skipping checking whether external dependencies are up to date, proceed at your own risk\n"
+ );
+ }
+
# Attempt to connect to the database as a privileged user
# This will vomit up an error if there are permissions problems
$db = wfGetDB( DB_MASTER );
$this->output( "Going to run database updates for " . wfWikiID() . "\n" );
if ( $db->getType() === 'sqlite' ) {
- $this->output( "Using SQLite file: '{$db->mDatabaseFile}'\n" );
+ $this->output( "Using SQLite file: '{$db->getDbFilePath()}'\n" );
}
$this->output( "Depending on the size of your database this may take a while!\n" );
@@ -178,11 +187,12 @@ class UpdateMediaWiki extends Maintenance {
}
}
+ $updater->setFileAccess();
if ( !$this->hasOption( 'nopurge' ) ) {
$updater->purgeCache();
}
- $time2 = new MWTimestamp();
+ $time2 = new MWTimestamp();
$timeDiff = $time2->diff( $time1 );
$this->output( "\nDone in " . $timeDiff->format( "%i:%S" ) . ".\n" );
}
diff --git a/maintenance/updateArticleCount.php b/maintenance/updateArticleCount.php
index 470647a4..55f535d2 100644
--- a/maintenance/updateArticleCount.php
+++ b/maintenance/updateArticleCount.php
@@ -37,12 +37,18 @@ class UpdateArticleCount extends Maintenance {
parent::__construct();
$this->mDescription = "Count of the number of articles and update the site statistics table";
$this->addOption( 'update', 'Update the site_stats table with the new count' );
+ $this->addOption( 'use-master', 'Count using the master database' );
}
public function execute() {
$this->output( "Counting articles..." );
- $counter = new SiteStatsInit( false );
+ if ( $this->hasOption( 'use-master' ) ) {
+ $dbr = wfGetDB( DB_MASTER );
+ } else {
+ $dbr = wfGetDB( DB_SLAVE, 'vslow' );
+ }
+ $counter = new SiteStatsInit( $dbr );
$result = $counter->articles();
$this->output( "found {$result}.\n" );
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index 61642828..d67ef6bb 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -81,16 +81,16 @@ class UpdateSpecialPages extends Maintenance {
if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
$this->output( sprintf( '%-30s [QueryPage] ', $special ) );
if ( $queryPage->isExpensive() ) {
- $t1 = explode( ' ', microtime() );
+ $t1 = microtime( true );
# Do the query
$num = $queryPage->recache( $limit === null ? $wgQueryCacheLimit : $limit );
- $t2 = explode( ' ', microtime() );
+ $t2 = microtime( true );
if ( $num === false ) {
$this->output( "FAILED: database error\n" );
} else {
$this->output( "got $num rows in " );
- $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+ $elapsed = $t2 - $t1;
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
$seconds = $elapsed - $hours * 3600 - $minutes * 60;
@@ -139,12 +139,12 @@ class UpdateSpecialPages extends Maintenance {
continue;
}
$this->output( sprintf( '%-30s [callback] ', $special ) );
- $t1 = explode( ' ', microtime() );
+ $t1 = microtime( true );
call_user_func( $call, $dbw );
- $t2 = explode( ' ', microtime() );
+ $t2 = microtime( true );
$this->output( "completed in " );
- $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+ $elapsed = $t2 - $t1;
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
$seconds = $elapsed - $hours * 3600 - $minutes * 60;
diff --git a/maintenance/validateRegistrationFile.php b/maintenance/validateRegistrationFile.php
new file mode 100644
index 00000000..e7646610
--- /dev/null
+++ b/maintenance/validateRegistrationFile.php
@@ -0,0 +1,37 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+class ValidateRegistrationFile extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->addArg( 'path', 'Path to extension.json/skin.json file.', true );
+ }
+ public function execute() {
+ if ( !class_exists( 'JsonSchema\Uri\UriRetriever' ) ) {
+ $this->error( 'The JsonSchema library cannot be found, please install it through composer.', 1 );
+ }
+
+ $retriever = new JsonSchema\Uri\UriRetriever();
+ $schema = $retriever->retrieve('file://' . dirname( __DIR__ ) . '/docs/extension.schema.json' );
+ $path = $this->getArg( 0 );
+ $data = json_decode( file_get_contents( $path ) );
+ if ( !is_object( $data ) ) {
+ $this->error( "$path is not a valid JSON file.", 1 );
+ }
+
+ $validator = new JsonSchema\Validator();
+ $validator->check( $data, $schema );
+ if ( $validator->isValid() ) {
+ $this->output( "$path validates against the schema!\n" );
+ } else {
+ foreach ( $validator->getErrors() as $error ) {
+ $this->output( "[{$error['property']}] {$error['message']}\n" );
+ }
+ $this->error( "$path does not validate.", 1 );
+ }
+ }
+}
+
+$maintClass = 'ValidateRegistrationFile';
+require_once RUN_MAINTENANCE_IF_MAIN;