Строка 17: |
Строка 17: |
| local radically_wikify = require 'Module:RadicalWikifier'.run | | local radically_wikify = require 'Module:RadicalWikifier'.run |
| | | |
− | local function memoize (func)
| |
− | local memoized = {}
| |
− | return function (...)
| |
− | local key = {...}
| |
− | if not memoized [key] then
| |
− | memoized [key] = { func (...) }
| |
− | end
| |
− | return unpack (memoized [key])
| |
− | end
| |
− | end
| |
− |
| |
| -- Локаль: | | -- Локаль: |
| local function convert_flags (flags) | | local function convert_flags (flags) |
Строка 81: |
Строка 70: |
| end | | end |
| local hidden = {} | | local hidden = {} |
| + | -- hide (): |
| return function (string, pattern, flags) | | return function (string, pattern, flags) |
| return preg_replace (string, pattern, flags, function (found) | | return preg_replace (string, pattern, flags, function (found) |
Строка 87: |
Строка 77: |
| return strip_marker (no) | | return strip_marker (no) |
| end) | | end) |
| + | -- restore (): |
| end, function (text) | | end, function (text) |
| for i = #hidden, 1, -1 do | | for i = #hidden, 1, -1 do |
− | text = gsub (text, strip_marker (i), hidden [i]) | + | if type (hidded [i]) == 'string' then |
| + | text = gsub (text, strip_marker (i), hidden [i]) |
| + | end |
| end | | end |
| hidden = {} | | hidden = {} |
| return text; | | return text; |
| + | end |
| + | end) () |
| + | |
| + | -- Converting external links to internal: |
| + | local collect_link, resolve_links, internalise_link = (function () |
| + | local property = 'URL источника' |
| + | local urls = {} |
| + | -- collect_link (): |
| + | return function (url, alias) |
| + | urls [url] = true |
| + | -- return as is: |
| + | return '[' .. url .. ' ' .. (alias or '') .. ']' |
| + | -- resolve_links (): |
| + | end, function (text) |
| + | local list = {} |
| + | for url, _ in pairs (urls) do |
| + | list [#list + 1] = url |
| + | end |
| + | local pages = ask { |
| + | '[[' .. property .. '::' .. concat (list, '||') ..']]', |
| + | '?#-', |
| + | '?' .. property .. '#-', |
| + | limit = #list |
| + | } |
| + | if pages then |
| + | for _, row in ipairs (pages) do |
| + | local page, url = row [1], row [property] |
| + | urls [url] = page |
| + | end |
| + | end |
| + | return text -- as is |
| + | -- internalise_link: |
| + | end, function (url, alias) |
| + | return '[[' .. urls [url] .. (alias and '|' .. alias) .. ']]' |
| end | | end |
| end) () | | end) () |
Строка 109: |
Строка 136: |
| return '[[' .. decode (page) .. '|' .. alias .. ']]'; | | return '[[' .. decode (page) .. '|' .. alias .. ']]'; |
| end, | | end, |
− | internalise = memoize (function (url, alias) | + | collect_link = collect_link, |
− | local property = 'URL источника'
| + | resolve_links = resolve_links, |
− | local pages = ask { '[[' .. property .. '::' .. url ..']]', '?#-', limit = 1 }
| + | internalise_link = internalise_link, |
− | if pages then
| |
− | local page = pages [1] [1]
| |
− | if not (context and page == context) then
| |
− | return '[[' .. pages [1] [1] .. '|' .. alias .. ']]'
| |
− | end
| |
− | end
| |
− | return '[' .. url .. ' ' .. alias .. ']'
| |
− | end),
| |
| char = function (_, s) | | char = function (_, s) |
| return char (tonumber (sub (s, -4), 16)) | | return char (tonumber (sub (s, -4), 16)) |