A lot of the overhead here is re-implement a lot of what the VE converter does - taking Parsoid HTML and turning into a linear document we can search, with releveant metadata extracted, normalised and cached - and other data discarded (e.g. all template generated content needs to be ignored).
The bulk of the work may be in the above - essentially rewriting a light version of the VE data model converter on the server side.
Then there is another bulk of work in rewriting support for all the configurable options that are shared between checks: ignoreSections, ignoreDisambiguationPages, includeCategories, includeTemplates etc.
That would be a fairly significant amount of work to get going and to maintain (i.e. keep in sync with the client side implementation). Once done many individual checks wouldn't add much complexity.
Already pre-computed on the server:
- tone
- suggestedLink
- suggestedImage
Simpler logic
- addReference - just excluding anything with an existing ref - we also have logic to merge in lists that follow paragraphs
- disambiguation - should be fairly trivial if Parsoid is including disambig classes - otherwise just an API lookup
- redirect - as with disambiguation - should be simple, may require an API lookup
- doubleBold
- externalLink - requires some API work to exclude interwiki links
- headingLevel
- imageCaption
- yearLink
- fakeHeading
Harder
- duplicateLink - a bit more complex it that is requires a few passes to count links in paragraphs, and there are some config options to respect - as well as the "Merge adjacent links" special case (although not 100% necessary)
- convertReference - one of the more complicated ones, lots of logic and config to decide to which reference are "convertible"
- citationNeeded - more complex as it requires pulling config from various places
Big projects
- textMatch - a very complex check given all the user config and regex performance concerns - although potential to yield a lot of suggestions
Experimental
- requiredTemplateParam - would require porting a lot of TemplateData parsing code - pretty complex