Строка 25: |
Строка 25: |
| // Собственно, викификация: | | // Собственно, викификация: |
| /* | | /* |
− | Следует ограничиться использованием функций hide(), hideTags(), restore() и r(). | + | Следует ограничиться использованием функций hide(), hideTags(), restore(), r(), collect_link(), resolve_links() и internalise_link(). |
| Они будут также распознаны и выполнены в том же порядке серверным викификатором | | Они будут также распознаны и выполнены в том же порядке серверным викификатором |
| Module:Wikifier. | | Module:Wikifier. |
Строка 32: |
Строка 32: |
| а в JavaScript они не будут иметь эффекта. | | а в JavaScript они не будут иметь эффекта. |
| */ | | */ |
| + | |
| + | var hidden = []; |
| + | var external_links = new Set (); |
| + | var resolved = {}; |
| | | |
| // Скрытие преформатированных тегов и прочих тегов, не подлежащих викификации: | | // Скрытие преформатированных тегов и прочих тегов, не подлежащих викификации: |
Строка 45: |
Строка 49: |
| s = hide (s, /^ .*/mg); // — преформатированный текст. | | s = hide (s, /^ .*/mg); // — преформатированный текст. |
| | | |
− | s = r (s, /<\s*a\s+href\s*=\s*(["'])\s*https?:\/\/in(?:formatorium)?\.wiki(?:\/wiki)?\/(\S+?)\s*\1\s*>(.+?)<\s*\/a\s*>/gi, wikifyInternalLinks); | + | s = r (s, /<\s*a\s+href\s*=\s*(["'])\s*https?:\/\/in\.wiki?\/(\S+?)\s*\1\s*>(.+?)<\s*\/a\s*>/gi, wikifyInternalLinks); |
| // -- внутренние <a> → [[]); | | // -- внутренние <a> → [[]); |
− | s = r (s, /<\s*a\s+href\s*=\s*(["'])(\S+?)\1\s*>(.+?)<\s*\/a\s*>/gi, '[$2 $3]'); // — <a> → [); | + | s = r (s, /<\s*a\s+href\s*=\s*(["'])(\S+?)\1\s*>(.+?)<\s*\/a\s*>/gi, '[$2 $3]'); // — <a> → []. |
| s = r (s, /\[\s*(https?:\/\/[^\]\s]+)\s*([^\]]*)\]/gi, collect_link); // — сбор внешних ссылок для последующей замены внутренними. | | s = r (s, /\[\s*(https?:\/\/[^\]\s]+)\s*([^\]]*)\]/gi, collect_link); // — сбор внешних ссылок для последующей замены внутренними. |
| s = resolve_links (s); // — массовая интернализация ссылок. Выполняется только в Lua. | | s = resolve_links (s); // — массовая интернализация ссылок. Выполняется только в Lua. |
Строка 261: |
Строка 265: |
| return string.replace (pattern, replacement); | | return string.replace (pattern, replacement); |
| } | | } |
− |
| |
− | var hidden = [];
| |
| | | |
| // Скрытие фрагментов путём окружения \x01 и \x02: | | // Скрытие фрагментов путём окружения \x01 и \x02: |
Строка 297: |
Строка 299: |
| } | | } |
| | | |
− | var external_links = new Set (); | + | function collect_link (_, url, alias) { |
− | function collect_link (_, __, url, alias) {
| + | console.log ('_ = ' + _ + ', url = ' + url + ', alias = ' + alias); |
| external_links.add (url); | | external_links.add (url); |
| return '[' + url + ' ' + alias + ']'; | | return '[' + url + ' ' + alias + ']'; |
| } | | } |
− | var resolved = {};
| |
| function resolve_links (/* String */ s) { | | function resolve_links (/* String */ s) { |
| + | var text = s; |
| if ( external_links.size > 0 ) { | | if ( external_links.size > 0 ) { |
− | let property = 'URL источника'; | + | var property = 'URL источника'; |
− | let list = Array.from (external_links).join ('||'); | + | var list = Array.from (external_links).join ('||'); |
− | let api = new mw.Api (); | + | var api = new mw.Api (); |
| api.get ({ | | api.get ({ |
| action: 'askargs', | | action: 'askargs', |
| conditions: property + '::' + list, | | conditions: property + '::' + list, |
| printouts: property, | | printouts: property, |
| + | format: 'json', |
| parameters: 'limit=' + external_links.size, | | parameters: 'limit=' + external_links.size, |
| api_version: 3 | | api_version: 3 |
− | }).done (function (data) { | + | }).done (function (result) { |
− | for (const row of data.query.results) { | + | if ( !result.query || !result.query.results ) return false; |
− | let page = row.fulltext; | + | result.query.results.forEach (function (row) { |
− | for (const url of row [page].printouts [property]) {
| + | Object.keys (row).forEach (function (page) { |
− | resolved [url] = page; | + | row [page].printouts [property].forEach (function (url) { |
| + | resolved [url] = page; |
| + | }); |
| + | }) |
| + | }); |
| + | Object.keys (resolved).forEach (function (url) { |
| + | if ( resolved [url] ) { |
| + | text = r (text, /\[\s*(https?:\/\/[^\]\s]+)\s*([^\]]*)\]/gi, '[[' + resolved [url] + '|\\2]]'); |
| } | | } |
− | } | + | }); |
− | }) | + | }).fail (function (code, result) { |
| + | return false; |
| + | }); |
| } | | } |
− | return s; | + | return text; |
| } | | } |
− | function internalise_link (_, __, url, alias) { | + | function internalise_link (_, url, alias) { |
− | if ( resolved [url] ) { | + | return '[' + url + ' ' + alias + ']'; |
− | return '[[' + resolved [url] + (alias ? '|' + alias : '') + ']]'
| |
− | } else {
| |
− | return '[' + url + ' ' + alias + ']';
| |
− | }
| |
| } | | } |
| | | |
Строка 352: |
Строка 360: |
| mw.edit_gadget_extensions.push (function () { | | mw.edit_gadget_extensions.push (function () { |
| mw.tools_above [0].splice (1, 0 | | mw.tools_above [0].splice (1, 0 |
− | , {w: wikifyText, b: '<img src="/images/1/1f/Etool_wikify.png" width="20" height="16" alt="W"/>', t: 'Викификация', all: true} | + | , {w: wikifyText, b: '<img src="/files/1/1f/Etool_wikify.png" width="20" height="16" alt="W"/>', t: 'Викификация', all: true} |
− | , {url: mw.util.getUrl ('Справка:Викификатор'), b: '<img src="/images/d/d5/Etool_help.png" height="16" width="16" alt="?">', t: '(справка о викификаторе)'} | + | , {url: mw.util.getUrl ('Справка:Викификатор'), b: '<img src="/files/d/d5/Etool_help.png" height="16" width="16" alt="?">', t: '(справка о викификаторе)'} |
| ); | | ); |
| }); | | }); |
| } | | } |