mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-12-23 14:00:55 +01:00
Add spell check linter
Summary: Inspired by http://news.ycombinator.com/item?id=3464671 and a lot of diffs I've seen @ FB, I've added a spell checking linter. To reduce false positives, it's only a blacklist. Still, it catches a large number of 'issues'. Test Plan: Unit tests. Ran on FB's codebase. No false positives noticed but a lot of cases caught. Reviewers: epriestley Reviewed By: epriestley CC: aran, epriestley, jack Differential Revision: https://secure.phabricator.com/D1409
This commit is contained in:
parent
7e63e232ba
commit
c5dfa34f10
9 changed files with 803 additions and 1 deletions
|
@ -81,6 +81,9 @@ phutil_register_library_map(array(
|
|||
'ArcanistPyLintLinter' => 'lint/linter/pylint',
|
||||
'ArcanistRepositoryAPI' => 'repository/api/base',
|
||||
'ArcanistShellCompleteWorkflow' => 'workflow/shell-complete',
|
||||
'ArcanistSpellingDefaultData' => 'lint/linter/spelling',
|
||||
'ArcanistSpellingLinter' => 'lint/linter/spelling',
|
||||
'ArcanistSpellingLinterTestCase' => 'lint/linter/spelling/__tests__',
|
||||
'ArcanistSubversionAPI' => 'repository/api/subversion',
|
||||
'ArcanistSubversionHookAPI' => 'repository/hookapi/subversion',
|
||||
'ArcanistSvnHookPreCommitWorkflow' => 'workflow/svn-hook-pre-commit',
|
||||
|
@ -150,6 +153,8 @@ phutil_register_library_map(array(
|
|||
'ArcanistPyFlakesLinter' => 'ArcanistLinter',
|
||||
'ArcanistPyLintLinter' => 'ArcanistLinter',
|
||||
'ArcanistShellCompleteWorkflow' => 'ArcanistBaseWorkflow',
|
||||
'ArcanistSpellingLinter' => 'ArcanistLinter',
|
||||
'ArcanistSpellingLinterTestCase' => 'ArcanistLinterTestCase',
|
||||
'ArcanistSubversionAPI' => 'ArcanistRepositoryAPI',
|
||||
'ArcanistSubversionHookAPI' => 'ArcanistHookAPI',
|
||||
'ArcanistSvnHookPreCommitWorkflow' => 'ArcanistBaseWorkflow',
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2011 Facebook, Inc.
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -58,6 +58,9 @@ class PhutilLintEngine extends ArcanistLintEngine {
|
|||
|
||||
$text_linter = new ArcanistTextLinter();
|
||||
$linters[] = $text_linter;
|
||||
|
||||
$spelling_linter = new ArcanistSpellingLinter();
|
||||
$linters[] = $spelling_linter;
|
||||
foreach ($paths as $path) {
|
||||
$is_text = false;
|
||||
if (preg_match('/\.(php|css|js|hpp|cpp|l|y)$/', $path)) {
|
||||
|
@ -72,6 +75,9 @@ class PhutilLintEngine extends ArcanistLintEngine {
|
|||
|
||||
$text_linter->addPath($path);
|
||||
$text_linter->addData($path, $this->loadData($path));
|
||||
|
||||
$spelling_linter->addPath($path);
|
||||
$spelling_linter->addData($path, $this->loadData($path));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ phutil_require_module('arcanist', 'lint/linter/filename');
|
|||
phutil_require_module('arcanist', 'lint/linter/generated');
|
||||
phutil_require_module('arcanist', 'lint/linter/nolint');
|
||||
phutil_require_module('arcanist', 'lint/linter/phutilmodule');
|
||||
phutil_require_module('arcanist', 'lint/linter/spelling');
|
||||
phutil_require_module('arcanist', 'lint/linter/text');
|
||||
phutil_require_module('arcanist', 'lint/linter/xhpast');
|
||||
|
||||
|
|
549
src/lint/linter/spelling/ArcanistSpellingDefaultData.php
Normal file
549
src/lint/linter/spelling/ArcanistSpellingDefaultData.php
Normal file
|
@ -0,0 +1,549 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Contains default spelling correction rules for ArcanistSpellingLinter.
|
||||
* Inside its own file to keep logic of ArcanistSpellingLinter clean
|
||||
*
|
||||
* @nolint
|
||||
* @group linter
|
||||
*/
|
||||
class ArcanistSpellingDefaultData {
|
||||
// From http://cpansearch.perl.org/src/APOCAL/Pod-Spell-CommonMistakes-1.000/lib/Pod/Spell/CommonMistakes/WordList.pm
|
||||
// Pruned by hand. If you modify this list, remember to remove case only
|
||||
// spelling suggestions and any with special characters like - or '
|
||||
public static function getFullWordRules() {
|
||||
return array(
|
||||
array(
|
||||
// Variable common
|
||||
"abandonning" => "abandoning",
|
||||
"abigious" => "ambiguous",
|
||||
"abitrate" => "arbitrate",
|
||||
"absense" => "absence",
|
||||
"absolut" => "absolute",
|
||||
"absoulte" => "absolute",
|
||||
"acceleratoin" => "acceleration",
|
||||
"accelleration" => "acceleration",
|
||||
"accesing" => "accessing",
|
||||
"accesnt" => "accent",
|
||||
"accessable" => "accessible",
|
||||
"accidentaly" => "accidentally",
|
||||
"accidentually" => "accidentally",
|
||||
"accomodate" => "accommodate",
|
||||
"accomodates" => "accommodates",
|
||||
"accout" => "account",
|
||||
"acessable" => "accessible",
|
||||
"ackowledge" => "acknowledge",
|
||||
"ackowledged" => "acknowledged",
|
||||
"acknowldegement" => "acknowldegement",
|
||||
"acording" => "according",
|
||||
"activete" => "activate",
|
||||
"acumulating" => "accumulating",
|
||||
"addional" => "additional",
|
||||
"additionaly" => "additionally",
|
||||
"addreses" => "addresses",
|
||||
"aditional" => "additional",
|
||||
"aditionally" => "additionally",
|
||||
"aditionaly" => "additionally",
|
||||
"adress" => "address",
|
||||
"adresses" => "addresses",
|
||||
"adviced" => "advised",
|
||||
"afecting" => "affecting",
|
||||
"albumns" => "albums",
|
||||
"alegorical" => "allegorical",
|
||||
"algorith" => "algorithm",
|
||||
"algorithmical" => "algorithmically",
|
||||
"algoritm" => "algorithm",
|
||||
"algoritms" => "algorithms",
|
||||
"algorrithm" => "algorithm",
|
||||
"algorritm" => "algorithm",
|
||||
"allpication" => "application",
|
||||
"altough" => "although",
|
||||
"ambigious" => "ambiguous",
|
||||
"amoung" => "among",
|
||||
"amout" => "amount",
|
||||
"analysator" => "analyzer",
|
||||
"anniversery" => "anniversary",
|
||||
"annoucement" => "announcement",
|
||||
"anomolies" => "anomalies",
|
||||
"anomoly" => "anomaly",
|
||||
"aplication" => "application",
|
||||
"appearence" => "appearance",
|
||||
"appropiate" => "appropriate",
|
||||
"appropriatly" => "appropriately",
|
||||
"aquired" => "acquired",
|
||||
"arbitary" => "arbitrary",
|
||||
"architechture" => "architecture",
|
||||
"arguement" => "argument",
|
||||
"arguements" => "arguments",
|
||||
"aritmetic" => "arithmetic",
|
||||
"arraival" => "arrival",
|
||||
"artifical" => "artificial",
|
||||
"artillary" => "artillery",
|
||||
"assigment" => "assignment",
|
||||
"assigments" => "assignments",
|
||||
"assistent" => "assistant",
|
||||
"asuming" => "assuming",
|
||||
"atomatically" => "automatically",
|
||||
"attemps" => "attempts",
|
||||
"attruibutes" => "attributes",
|
||||
"authentification" => "authentication",
|
||||
"automaticaly" => "automatically",
|
||||
"automaticly" => "automatically",
|
||||
"automatize" => "automate",
|
||||
"automatized" => "automated",
|
||||
"automatizes" => "automates",
|
||||
"autonymous" => "autonomous",
|
||||
"auxilliary" => "auxiliary",
|
||||
"avaiable" => "available",
|
||||
"availabled" => "available",
|
||||
"availablity" => "availability",
|
||||
"availale" => "available",
|
||||
"availavility" => "availability",
|
||||
"availble" => "available",
|
||||
"availiable" => "available",
|
||||
"avaliable" => "available",
|
||||
"backgroud" => "background",
|
||||
"bahavior" => "behavior",
|
||||
"baloon" => "balloon",
|
||||
"baloons" => "balloons",
|
||||
"batery" => "battery",
|
||||
"becomming" => "becoming",
|
||||
"becuase" => "because",
|
||||
"begining" => "beginning",
|
||||
"calender" => "calendar",
|
||||
"cancelation" => "cancellation",
|
||||
"capabilites" => "capabilities",
|
||||
"capatibilities" => "capabilities",
|
||||
"cariage" => "carriage",
|
||||
"challange" => "challenge",
|
||||
"challanges" => "challenges",
|
||||
"changable" => "changeable",
|
||||
"charachter" => "character",
|
||||
"charachters" => "characters",
|
||||
"charcter" => "character",
|
||||
"childs" => "children",
|
||||
"chnage" => "change",
|
||||
"chnages" => "changes",
|
||||
"choosen" => "chosen",
|
||||
"collapsable" => "collapsible",
|
||||
"colorfull" => "colorful",
|
||||
"comand" => "command",
|
||||
"comit" => "commit",
|
||||
"commerical" => "commercial",
|
||||
"comminucation" => "communication",
|
||||
"commited" => "committed",
|
||||
"commiting" => "committing",
|
||||
"committ" => "commit",
|
||||
"commoditiy" => "commodity",
|
||||
"compability" => "compatibility",
|
||||
"compatability" => "compatibility",
|
||||
"compatable" => "compatible",
|
||||
"compatibiliy" => "compatibility",
|
||||
"compatibilty" => "compatibility",
|
||||
"compleatly" => "completely",
|
||||
"completly" => "completely",
|
||||
"complient" => "compliant",
|
||||
"compres" => "compress",
|
||||
"compresion" => "compression",
|
||||
"configuratoin" => "configuration",
|
||||
"conjuction" => "conjunction",
|
||||
"connectinos" => "connections",
|
||||
"connnection" => "connection",
|
||||
"connnections" => "connections",
|
||||
"consistancy" => "consistency",
|
||||
"containes" => "contains",
|
||||
"containts" => "contains",
|
||||
"contence" => "contents",
|
||||
"continous" => "continuous",
|
||||
"continueing" => "continuing",
|
||||
"contraints" => "constraints",
|
||||
"convertor" => "converter",
|
||||
"convinient" => "convenient",
|
||||
"corected" => "corrected",
|
||||
"correponding" => "corresponding",
|
||||
"correponds" => "corresponds",
|
||||
"correspoding" => "corresponding",
|
||||
"cryptocraphic" => "cryptographic",
|
||||
"curently" => "currently",
|
||||
"dafault" => "default",
|
||||
"deafult" => "default",
|
||||
"deamon" => "daemon",
|
||||
"decompres" => "decompress",
|
||||
"definate" => "definite",
|
||||
"definately" => "definitely",
|
||||
"delemiter" => "delimiter",
|
||||
"dependancies" => "dependencies",
|
||||
"dependancy" => "dependency",
|
||||
"dependant" => "dependent",
|
||||
"desactivate" => "deactivate",
|
||||
"detabase" => "database",
|
||||
"developement" => "development",
|
||||
"developped" => "developed",
|
||||
"developpement" => "development",
|
||||
"developper" => "developer",
|
||||
"deveolpment" => "development",
|
||||
"devided" => "divided",
|
||||
"dictionnary" => "dictionary",
|
||||
"diplay" => "display",
|
||||
"disapeared" => "disappeared",
|
||||
"discontiguous" => "noncontiguous",
|
||||
"dispertion" => "dispersion",
|
||||
"dissapears" => "disappears",
|
||||
"docuentation" => "documentation",
|
||||
"documantation" => "documentation",
|
||||
"documentaion" => "documentation",
|
||||
"downlad" => "download",
|
||||
"downlads" => "downloads",
|
||||
"easilly" => "easily",
|
||||
"ecspecially" => "especially",
|
||||
"edditable" => "editable",
|
||||
"editting" => "editing",
|
||||
"eletronic" => "electronic",
|
||||
"enchanced" => "enhanced",
|
||||
"encorporating" => "incorporating",
|
||||
"endianess" => "endianness",
|
||||
"enhaced" => "enhanced",
|
||||
"enlightnment" => "enlightenment",
|
||||
"enocded" => "encoded",
|
||||
"enterily" => "entirely",
|
||||
"enviroiment" => "environment",
|
||||
"enviroment" => "environment",
|
||||
"environement" => "environment",
|
||||
"environent" => "environment",
|
||||
"equivelant" => "equivalent",
|
||||
"equivilant" => "equivalent",
|
||||
"excecutable" => "executable",
|
||||
"exceded" => "exceeded",
|
||||
"excellant" => "excellent",
|
||||
"exlcude" => "exclude",
|
||||
"exlcusive" => "exclusive",
|
||||
"expecially" => "especially",
|
||||
"explicitely" => "explicitly",
|
||||
"expresion" => "expression",
|
||||
"exprimental" => "experimental",
|
||||
"extention" => "extension",
|
||||
"failuer" => "failure",
|
||||
"familar" => "familiar",
|
||||
"fatser" => "faster",
|
||||
"feauture" => "feature",
|
||||
"feautures" => "features",
|
||||
"fetaure" => "feature",
|
||||
"fetaures" => "features",
|
||||
"forse" => "force",
|
||||
"fortan" => "fortran",
|
||||
"forwardig" => "forwarding",
|
||||
"framwork" => "framework",
|
||||
"fuction" => "function",
|
||||
"fuctions" => "functions",
|
||||
"functionaly" => "functionally",
|
||||
"functionnality" => "functionality",
|
||||
"functonality" => "functionality",
|
||||
"futhermore" => "furthermore",
|
||||
"generiously" => "generously",
|
||||
"grahical" => "graphical",
|
||||
"grahpical" => "graphical",
|
||||
"grapic" => "graphic",
|
||||
"guage" => "gauge",
|
||||
"halfs" => "halves",
|
||||
"heirarchically" => "hierarchically",
|
||||
"helpfull" => "helpful",
|
||||
"hierachy" => "hierarchy",
|
||||
"hierarchie" => "hierarchy",
|
||||
"howver" => "however",
|
||||
"immeadiately" => "immediately",
|
||||
"implemantation" => "implementation",
|
||||
"implemention" => "implementation",
|
||||
"incomming" => "incoming",
|
||||
"incompatabilities" => "incompatibilities",
|
||||
"incompatable" => "incompatible",
|
||||
"inconsistant" => "inconsistent",
|
||||
"indendation" => "indentation",
|
||||
"indended" => "intended",
|
||||
"independant" => "independent",
|
||||
"informatiom" => "information",
|
||||
"informations" => "information",
|
||||
"infromation" => "information",
|
||||
"initalize" => "initialize",
|
||||
"initators" => "initiators",
|
||||
"initializiation" => "initialization",
|
||||
"inofficial" => "unofficial",
|
||||
"integreated" => "integrated",
|
||||
"integrety" => "integrity",
|
||||
"integrey" => "integrity",
|
||||
"intendet" => "intended",
|
||||
"interchangable" => "interchangeable",
|
||||
"intermittant" => "intermittent",
|
||||
"interupted" => "interrupted",
|
||||
"jave" => "java",
|
||||
"langage" => "language",
|
||||
"langauage" => "language",
|
||||
"langugage" => "language",
|
||||
"lauch" => "launch",
|
||||
"lesstiff" => "lesstif",
|
||||
"libaries" => "libraries",
|
||||
"libary" => "library",
|
||||
"libraris" => "libraries",
|
||||
"licenceing" => "licencing",
|
||||
"loggging" => "logging",
|
||||
"loggin" => "login",
|
||||
"logile" => "logfile",
|
||||
"machinary" => "machinery",
|
||||
"maintainance" => "maintenance",
|
||||
"maintainence" => "maintenance",
|
||||
"makeing" => "making",
|
||||
"malplace" => "misplace",
|
||||
"malplaced" => "misplaced",
|
||||
"managable" => "manageable",
|
||||
"manoeuvering" => "maneuvering",
|
||||
"mathimatical" => "mathematical",
|
||||
"mathimatic" => "mathematic",
|
||||
"mathimatics" => "mathematics",
|
||||
"ment" => "meant",
|
||||
"messsage" => "message",
|
||||
"messsages" => "messages",
|
||||
"microprocesspr" => "microprocessor",
|
||||
"milliseonds" => "milliseconds",
|
||||
"miscelleneous" => "miscellaneous",
|
||||
"misformed" => "malformed",
|
||||
"mispelled" => "misspelled",
|
||||
"mmnemonic" => "mnemonic",
|
||||
"modulues" => "modules",
|
||||
"monochorome" => "monochrome",
|
||||
"monochromo" => "monochrome",
|
||||
"monocrome" => "monochrome",
|
||||
"mroe" => "more",
|
||||
"multidimensionnal" => "multidimensional",
|
||||
"mulitplied" => "multiplied",
|
||||
"mutiple" => "multiple",
|
||||
"nam" => "name",
|
||||
"nams" => "names",
|
||||
"navagating" => "navigating",
|
||||
"nead" => "need",
|
||||
"neccesary" => "necessary",
|
||||
"neccessary" => "necessary",
|
||||
"necesary" => "necessary",
|
||||
"negotation" => "negotiation",
|
||||
"nescessary" => "necessary",
|
||||
"nessessary" => "necessary",
|
||||
"noticable" => "noticeable",
|
||||
"notications" => "notifications",
|
||||
"omitt" => "omit",
|
||||
"ommitted" => "omitted",
|
||||
"onself" => "oneself",
|
||||
"optionnal" => "optional",
|
||||
"optmizations" => "optimizations",
|
||||
"orientatied" => "orientated",
|
||||
"orientied" => "oriented",
|
||||
"ouput" => "output",
|
||||
"overaall" => "overall",
|
||||
"overriden" => "overridden",
|
||||
"pacakge" => "package",
|
||||
"pachage" => "package",
|
||||
"packacge" => "package",
|
||||
"packege" => "package",
|
||||
"packge" => "package",
|
||||
"pakage" => "package",
|
||||
"pallette" => "palette",
|
||||
"paramameters" => "parameters",
|
||||
"paramater" => "parameter",
|
||||
"parametes" => "parameters",
|
||||
"paramter" => "parameter",
|
||||
"paramters" => "parameters",
|
||||
"particularily" => "particularly",
|
||||
"pased" => "passed",
|
||||
"peprocessor" => "preprocessor",
|
||||
"perfoming" => "performing",
|
||||
"permissons" => "permissions",
|
||||
"persistant" => "persistent",
|
||||
"plattform" => "platform",
|
||||
"pleaes" => "please",
|
||||
"ploting" => "plotting",
|
||||
"posible" => "possible",
|
||||
"powerfull" => "powerful",
|
||||
"preceeded" => "preceded",
|
||||
"preceeding" => "preceding",
|
||||
"precendence" => "precedence",
|
||||
"precission" => "precision",
|
||||
"prefered" => "preferred",
|
||||
"prefferably" => "preferably",
|
||||
"prepaired" => "prepared",
|
||||
"primative" => "primitive",
|
||||
"princliple" => "principle",
|
||||
"priorty" => "priority",
|
||||
"procceed" => "proceed",
|
||||
"proccesors" => "processors",
|
||||
"proces" => "process",
|
||||
"processessing" => "processing",
|
||||
"processpr" => "processor",
|
||||
"processsing" => "processing",
|
||||
"progams" => "programs",
|
||||
"programers" => "programmers",
|
||||
"programm" => "program",
|
||||
"programms" => "programs",
|
||||
"promps" => "prompts",
|
||||
"pronnounced" => "pronounced",
|
||||
"prononciation" => "pronunciation",
|
||||
"pronouce" => "pronounce",
|
||||
"pronunce" => "pronounce",
|
||||
"propery" => "property",
|
||||
"prosess" => "process",
|
||||
"protable" => "portable",
|
||||
"protcol" => "protocol",
|
||||
"protecion" => "protection",
|
||||
"protocoll" => "protocol",
|
||||
"psychadelic" => "psychedelic",
|
||||
"quering" => "querying",
|
||||
"reasearch" => "research",
|
||||
"reasearcher" => "researcher",
|
||||
"reasearchers" => "researchers",
|
||||
"recogniced" => "recognised",
|
||||
"recognizeable" => "recognizable",
|
||||
"recommanded" => "recommended",
|
||||
"redircet" => "redirect",
|
||||
"redirectrion" => "redirection",
|
||||
"refence" => "reference",
|
||||
"registerd" => "registered",
|
||||
"registraration" => "registration",
|
||||
"regulamentations" => "regulations",
|
||||
"remoote" => "remote",
|
||||
"removeable" => "removable",
|
||||
"repectively" => "respectively",
|
||||
"replacments" => "replacements",
|
||||
"replys" => "replies",
|
||||
"requiere" => "require",
|
||||
"requred" => "required",
|
||||
"resizeable" => "resizable",
|
||||
"ressize" => "resize",
|
||||
"ressource" => "resource",
|
||||
"retransmited" => "retransmitted",
|
||||
"runned" => "ran",
|
||||
"runnning" => "running",
|
||||
"safly" => "safely",
|
||||
"savable" => "saveable",
|
||||
"searchs" => "searches",
|
||||
"secund" => "second",
|
||||
"separatly" => "separately",
|
||||
"sepcify" => "specify",
|
||||
"seperated" => "separated",
|
||||
"seperately" => "separately",
|
||||
"seperate" => "separate",
|
||||
"seperatly" => "separately",
|
||||
"seperator" => "separator",
|
||||
"sequencial" => "sequential",
|
||||
"serveral" => "several",
|
||||
"setts" => "sets",
|
||||
"similiar" => "similar",
|
||||
"simliar" => "similar",
|
||||
"speach" => "speech",
|
||||
"speciefied" => "specified",
|
||||
"specifed" => "specified",
|
||||
"specificaton" => "specification",
|
||||
"specifing" => "specifying",
|
||||
"speficied" => "specified",
|
||||
"speling" => "spelling",
|
||||
"splitted" => "split",
|
||||
"staically" => "statically",
|
||||
"standardss" => "standards",
|
||||
"standart" => "standard",
|
||||
"staticly" => "statically",
|
||||
"subdirectoires" => "subdirectories",
|
||||
"suble" => "subtle",
|
||||
"succesfully" => "successfully",
|
||||
"succesful" => "successful",
|
||||
"sucessfully" => "successfully",
|
||||
"superflous" => "superfluous",
|
||||
"superseeded" => "superseded",
|
||||
"suplied" => "supplied",
|
||||
"suport" => "support",
|
||||
"suppored" => "supported",
|
||||
"supportin" => "supporting",
|
||||
"suppoted" => "supported",
|
||||
"suppported" => "supported",
|
||||
"suppport" => "support",
|
||||
"surpresses" => "suppresses",
|
||||
"suspicously" => "suspiciously",
|
||||
"synax" => "syntax",
|
||||
"synchonized" => "synchronized",
|
||||
"syncronize" => "synchronize",
|
||||
"syncronizing" => "synchronizing",
|
||||
"syncronus" => "synchronous",
|
||||
"syste" => "system",
|
||||
"sythesis" => "synthesis",
|
||||
"taht" => "that",
|
||||
"throught" => "through",
|
||||
"transfering" => "transferring",
|
||||
"trasmission" => "transmission",
|
||||
"treshold" => "threshold",
|
||||
"trigerring" => "triggering",
|
||||
"unecessary" => "unnecessary",
|
||||
"unexecpted" => "unexpected",
|
||||
"unfortunatelly" => "unfortunately",
|
||||
"unknonw" => "unknown",
|
||||
"unkown" => "unknown",
|
||||
"unuseful" => "useless",
|
||||
"usefull" => "useful",
|
||||
"usualy" => "usually",
|
||||
"utilites" => "utilities",
|
||||
"utillities" => "utilities",
|
||||
"utilties" => "utilities",
|
||||
"utiltity" => "utility",
|
||||
"utitlty" => "utility",
|
||||
"variantions" => "variations",
|
||||
"varient" => "variant",
|
||||
"verbse" => "verbose",
|
||||
"verisons" => "versions",
|
||||
"verison" => "version",
|
||||
"verson" => "version",
|
||||
"visiters" => "visitors",
|
||||
"vitual" => "virtual",
|
||||
"whataver" => "whatever",
|
||||
"wheter" => "whether",
|
||||
"wierd" => "weird",
|
||||
"yur" => "your",
|
||||
|
||||
// Variable common_cpan
|
||||
"refering" => "referring",
|
||||
"writeable" => "writable",
|
||||
"nineth" => "ninth",
|
||||
"ommited" => "omitted",
|
||||
"omited" => "omitted",
|
||||
"requrie" => "require",
|
||||
"existant" => "existent",
|
||||
"explict" => "explicit",
|
||||
"agument" => "augument",
|
||||
"destionation" => "destination",
|
||||
), array(
|
||||
'teh' => 'the'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public static function getPartialWordRules() {
|
||||
return array(
|
||||
array (),
|
||||
array (
|
||||
'recieve' => 'receive',
|
||||
'uft8' => 'utf8',
|
||||
'lenght' => 'length',
|
||||
'heigth' => 'height',
|
||||
'fuction' => 'function',
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
151
src/lint/linter/spelling/ArcanistSpellingLinter.php
Normal file
151
src/lint/linter/spelling/ArcanistSpellingLinter.php
Normal file
|
@ -0,0 +1,151 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Enforces basic spelling. Spelling inside code is actually pretty hard to
|
||||
* get right without false positives. I take a conservative approach and
|
||||
* just use a blacklisted set of words that are commonly spelled
|
||||
* incorrectly.
|
||||
*
|
||||
* @group linter
|
||||
*/
|
||||
class ArcanistSpellingLinter extends ArcanistLinter {
|
||||
|
||||
const LINT_SPELLING_PICKY = 0;
|
||||
const LINT_SPELLING_IMPORTANT = 1;
|
||||
|
||||
private $partialWordRules;
|
||||
private $wholeWordRules;
|
||||
private $severity;
|
||||
|
||||
public function __construct($severity = self::LINT_SPELLING_PICKY) {
|
||||
$this->severity = $severity;
|
||||
$this->wholeWordRules = ArcanistSpellingDefaultData::getFullWordRules();
|
||||
$this->partialWordRules =
|
||||
ArcanistSpellingDefaultData::getPartialWordRules();
|
||||
}
|
||||
|
||||
public function willLintPaths(array $paths) {
|
||||
return;
|
||||
}
|
||||
|
||||
public function getLinterName() {
|
||||
return 'SPELL';
|
||||
}
|
||||
|
||||
public function removeLintRule($word) {
|
||||
foreach ($this->partialWordRules as $severity=>&$wordlist) {
|
||||
unset($wordlist[$word]);
|
||||
}
|
||||
|
||||
foreach ($this->wholeWordRules as $severity=>&$wordlist) {
|
||||
unset($wordlist[$word]);
|
||||
}
|
||||
}
|
||||
|
||||
public function addPartialWordRule(
|
||||
$incorrect_word,
|
||||
$correct_word,
|
||||
$severity=self::LINT_SPELLING_IMPORTANT) {
|
||||
$this->partialWordRules[$severity][$incorrect_word] = $correct_word;
|
||||
}
|
||||
|
||||
public function addWholeWordRule(
|
||||
$incorrect_word,
|
||||
$correct_word,
|
||||
$severity=self::LINT_SPELLING_IMPORTANT) {
|
||||
$this->wholeWordRules[$severity][$incorrect_word] = $correct_word;
|
||||
}
|
||||
|
||||
public function getLintSeverityMap() {
|
||||
return array(
|
||||
self::LINT_SPELLING_PICKY => ArcanistLintSeverity::SEVERITY_WARNING,
|
||||
self::LINT_SPELLING_IMPORTANT => ArcanistLintSeverity::SEVERITY_ERROR,
|
||||
);
|
||||
}
|
||||
|
||||
public function getLintNameMap() {
|
||||
return array(
|
||||
self::LINT_SPELLING_PICKY => 'Possible spelling mistake',
|
||||
self::LINT_SPELLING_IMPORTANT => 'Possible spelling mistake',
|
||||
);
|
||||
}
|
||||
|
||||
public function lintPath($path) {
|
||||
foreach ($this->partialWordRules as $severity => $wordlist) {
|
||||
if ($severity >= $this->severity) {
|
||||
foreach ($wordlist as $misspell => $correct) {
|
||||
$this->checkPartialWord($path, $misspell, $correct, $severity);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($this->wholeWordRules as $severity => $wordlist) {
|
||||
if ($severity >= $this->severity) {
|
||||
foreach ($wordlist as $misspell => $correct) {
|
||||
$this->checkWholeWord($path, $misspell, $correct, $severity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function checkPartialWord($path, $word, $correct_word, $severity) {
|
||||
$text = $this->getData($path);
|
||||
$pos = 0;
|
||||
while ($pos < strlen($text)) {
|
||||
$next = stripos($text, $word, $pos);
|
||||
if ($next === false) {
|
||||
return;
|
||||
}
|
||||
$this->raiseLintAtOffset(
|
||||
$next,
|
||||
$severity,
|
||||
sprintf(
|
||||
"Possible spelling error. You wrote '%s', but did you mean '%s'",
|
||||
$word,
|
||||
$correct_word
|
||||
)
|
||||
);
|
||||
$pos = $next + 1;
|
||||
}
|
||||
}
|
||||
|
||||
protected function checkWholeWord($path, $word, $correct_word, $severity) {
|
||||
$text = $this->getData($path);
|
||||
$matches = array();
|
||||
$num_matches = preg_match_all(
|
||||
'#\b' . preg_quote($word, '#') . '\b#i',
|
||||
$text,
|
||||
$matches,
|
||||
PREG_OFFSET_CAPTURE
|
||||
);
|
||||
if (!$num_matches) {
|
||||
return;
|
||||
}
|
||||
foreach ($matches[0] as $match) {
|
||||
$this->raiseLintAtOffset(
|
||||
$match[1],
|
||||
$severity,
|
||||
sprintf(
|
||||
"Possible spelling error. You wrote '%s', but did you mean '%s'",
|
||||
$word,
|
||||
$correct_word
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
13
src/lint/linter/spelling/__init__.php
Normal file
13
src/lint/linter/spelling/__init__.php
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
phutil_require_module('arcanist', 'lint/linter/base');
|
||||
phutil_require_module('arcanist', 'lint/severity');
|
||||
|
||||
phutil_require_source('ArcanistSpellingLinter.php');
|
||||
phutil_require_source('ArcanistSpellingDefaultData.php');
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test cases for @{class:ArcanistSpellingLinter}.
|
||||
*
|
||||
* @group testcase
|
||||
*/
|
||||
class ArcanistSpellingLinterTestCase extends ArcanistLinterTestCase {
|
||||
|
||||
public function testSpellingLint() {
|
||||
$linter = new ArcanistSpellingLinter();
|
||||
$linter->removeLintRule('acc'.'out');
|
||||
$linter->addPartialWordRule('supermn', 'superman');
|
||||
$linter->addWholeWordRule('batmn', 'batman');
|
||||
$working_copy = ArcanistWorkingCopyIdentity::newFromPath(__FILE__);
|
||||
return $this->executeTestsInDirectory(
|
||||
dirname(__FILE__).'/data/',
|
||||
$linter,
|
||||
$working_copy);
|
||||
}
|
||||
|
||||
}
|
14
src/lint/linter/spelling/__tests__/__init__.php
Normal file
14
src/lint/linter/spelling/__tests__/__init__.php
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
phutil_require_module('arcanist', 'lint/linter/base/test');
|
||||
phutil_require_module('arcanist', 'lint/linter/spelling');
|
||||
phutil_require_module('arcanist', 'workingcopyidentity');
|
||||
|
||||
|
||||
phutil_require_source('ArcanistSpellingLinterTestCase.php');
|
25
src/lint/linter/spelling/__tests__/data/spell.lint-test
Normal file
25
src/lint/linter/spelling/__tests__/data/spell.lint-test
Normal file
|
@ -0,0 +1,25 @@
|
|||
Hello
|
||||
teh
|
||||
word
|
||||
$y = $x->recieveData();
|
||||
for (i=0; i<y.lenght; i++) {
|
||||
}
|
||||
Check uFT8 ufT8 (<-- repeated)
|
||||
removed accout d
|
||||
didn't remove acording
|
||||
Added ZZZZsupermnZZZZ
|
||||
Added full batmn batmnZZZZ
|
||||
~~~~~~~~~~
|
||||
error:2:1
|
||||
error:4:10
|
||||
error:5:15
|
||||
error:7:7
|
||||
error:7:12
|
||||
warning:9:15
|
||||
error:10:11
|
||||
error:11:12
|
||||
~~~~~~~~~~
|
||||
~~~~~~~~~~
|
||||
{
|
||||
"hook" : true
|
||||
}
|
Loading…
Reference in a new issue