Изменения

Перейти к навигации Перейти к поиску
м
обновление
Строка 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: '(справка о викификаторе)'}
 
    );
 
    );
 
});
 
});
 
}
 
}

Реклама:

Навигация