User:R'n'B/Hatnote bot spec

According to this disambiguation guideline, intentional links to disambiguation pages should be directed to the title that includes the text "(disambiguation)", even if that's a redirect – for example, link to the redirect "America (disambiguation)" rather than the target page at "America". ... This helps distinguish accidental links to the disambiguation page from intentional ones.

This bot task will locate links to disambiguation pages in hatnotes. Hatnotes are templates designed specifically for the task of assisting readers who searched for ambiguous article titles (or clicked on a link to one); therefore, links to disambiguation pages appearing in these templates can be presumed to be intentional, unlike those appearing elsewhere in an article. Where applicable, as defined in the specification below, the bot will change a link such as PAGE1 to PAGE1 (disambiguation).


 * Specification

Identifying hatnote links is a little tricky because each hatnote template has its own format, by which some template parameters are automatically converted into links, others are not, and some are ignored entirely. The bot will search through all pages that transclude specific templates, and then parse the wikitext to identify the parameters of the template, and act upon only the parameters specified below (only if they are present, of course). Only the following arguments will be treated as un-bracketed links: N.B.: The bot will only edit links on pages in namespace 0, and only links to pages in namespace 0.
 * 1) On pages that transclude About, arguments 3, 5, 7, and 9.
 * 2) On pages that transclude Distinguish, arguments 1, 2, 3, and 4.
 * 3) On pages that transclude For, arguments 2 and 3.
 * 4) On pages that transclude Other hurricane uses, argument 1.
 * 5) On pages that transclude Other persons, argument 2.
 * 6) On pages that transclude Other persons3, argument 2.
 * 7) On pages that transclude Other people2, argument 1.
 * 8) On pages that transclude Other people3, argument 3.
 * 9) On pages that transclude Other places3, argument 1.
 * 10) On pages that transclude Other uses, argument 1.
 * 11) On pages that transclude Other uses6, arguments 1 and 2.
 * 12) On pages that transclude Other uses of, argument 2.
 * 13) On pages that transclude Redirect, arguments 3, 5, 7, and 9.
 * 14) On pages that transclude Redirect2, arguments 4, 6, and 8.
 * 15) On pages that transclude Redirect6, arguments 3 and 5.
 * 16) On pages that transclude Redirect7, arguments 3 and 5.
 * 17) On pages that transclude Redirect-distinguish, arguments 2, 3, 4, and 5.
 * 18) On pages that transclude See also, arguments 1 through 15.

As the above list makes clear, there is no rhyme or reason to the formatting of these templates, so the bot will simply parse the text of each page that transcludes any of the above templates and look for matching arguments. As a precaution, the bot will ignore any template invocation that includes a recursive template call (i.e., any "{" character between " " will cause the bot to skip the page entirely).

The bot will edit an identified link only if (for purposes of these criteria, the identified link is designated as PAGE1):
 * 1) PAGE1 is a disambiguation page or a redirect to a disambiguation page; and
 * If PAGE1 (disambiguation) exists, it is a redirect whose target is either PAGE1 or, if PAGE1 is also a redirect, the same as the target of PAGE1, or
 * If PAGE1 (disambiguation) does not exist, the bot will create it as a redirect to PAGE1 (or the target of PAGE1 if it is a redirect)
 * If PAGE1 (disambiguation) does not exist, the bot will create it as a redirect to PAGE1 (or the target of PAGE1 if it is a redirect)

When all these criteria are true, the bot will change "PAGE1" to "PAGE1 (disambiguation)" in the hatnote (but will not change any other links on the page).