diff options
Diffstat (limited to 'maintenance')
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; |