45,693
edits
(Created page with "local export = {} --[=[ Unsupported titles and pages with high memory usage are listed at Module:links/data. Other modules used: Module:script utilities...") |
No edit summary |
||
Line 4: | Line 4: | ||
[[Unsupported titles]] and pages with high | [[Unsupported titles]] and pages with high | ||
memory usage are listed at [[Module:links/data]]. | memory usage are listed at [[Module:links/data]]. | ||
Other modules used: | Other modules used: | ||
[[Module:script utilities]] | [[Module:script utilities]] | ||
Line 49: | Line 49: | ||
return "Unsupported titles/" .. unsupported_titles[target] | return "Unsupported titles/" .. unsupported_titles[target] | ||
end | end | ||
-- If the link contains unexpanded template parameters, then don't create a link. | -- If the link contains unexpanded template parameters, then don't create a link. | ||
if target:find("{{{") then | if target:find("{{{") then | ||
return nil | return nil | ||
end | end | ||
if target:sub(1, 1) == ":" or target:sub(1, 2) == "w:" or target:sub(1, 10) == "wikipedia:" then | if target:sub(1, 1) == ":" or target:sub(1, 2) == "w:" or target:sub(1, 10) == "wikipedia:" then | ||
return target | return target | ||
end | end | ||
-- Remove diacritics from the page name | -- Remove diacritics from the page name | ||
target = lang:makeEntryName(target) | target = lang:makeEntryName(target) | ||
if target:sub(1, 1) == "/" then | if target:sub(1, 1) == "/" then | ||
return ":" .. target | return ":" .. target | ||
-- Link to appendix for reconstructed terms and terms in appendix-only languages | -- Link to appendix for reconstructed terms and terms in appendix-only languages | ||
elseif target:sub(1, 1) == "*" and #target > 1 then | elseif target:sub(1, 1) == "*" and #target > 1 then | ||
Line 70: | Line 70: | ||
return nil | return nil | ||
end | end | ||
target = "Reconstruction:" .. lang:getCanonicalName() .. "/" .. usub(target, 2) | target = "Reconstruction:" .. lang:getCanonicalName() .. "/" .. usub(target, 2) | ||
elseif lang:getType() == "reconstructed" then | elseif lang:getType() == "reconstructed" then | ||
Line 78: | Line 78: | ||
target = "Appendix:" .. lang:getCanonicalName() .. "/" .. target | target = "Appendix:" .. lang:getCanonicalName() .. "/" .. target | ||
end | end | ||
return target | return target | ||
end | end | ||
-- Make a language-specific link from given link's parts | -- Make a language-specific link from given link's parts | ||
local function makeLangLink(link, lang, id, | local function makeLangLink(link, lang, id, allow_self_link) | ||
-- Temporary tracking code | -- Temporary tracking code | ||
local langCode = lang:getCode() | local langCode = lang:getCode() | ||
Line 94: | Line 94: | ||
end | end | ||
end | end | ||
-- Find fragments (when link didn't come from parseLink). | -- Find fragments (when link didn't come from parseLink). | ||
-- Prevents {{l|en|word#Etymology 2|word}} from linking to [[word#Etymology 2#English]]. | -- Prevents {{l|en|word#Etymology 2|word}} from linking to [[word#Etymology 2#English]]. | ||
Line 108: | Line 108: | ||
end | end | ||
end | end | ||
-- If there is no display form, then create a default one | -- If there is no display form, then create a default one | ||
if not link.display then | if not link.display then | ||
link.display = link.target | link.display = link.target | ||
-- Strip the prefix from the displayed form | -- Strip the prefix from the displayed form | ||
-- TODO: other interwiki links? | -- TODO: other interwiki links? | ||
Line 123: | Line 123: | ||
wikipedia = true, | wikipedia = true, | ||
} | } | ||
if prefixes[prefix] then | if prefixes[prefix] then | ||
link.display = link.display:sub(#prefix + 2) -- remove prefix plus colon | link.display = link.display:sub(#prefix + 2) -- remove prefix plus colon | ||
Line 129: | Line 129: | ||
end | end | ||
end | end | ||
-- Process the target | -- Process the target | ||
link.target = export.getLinkPage(link.target, lang) | link.target = export.getLinkPage(link.target, lang) | ||
if not link.target then | if not link.target then | ||
return link.display | return link.display | ||
end | end | ||
-- If the target is the same as the current page and there is no sense id | -- If the target is the same as the current page and there is no sense id | ||
-- and linking to the same page hasn't been turned on, then return a "self-link" | -- and linking to the same page hasn't been turned on, then return a "self-link" | ||
-- like the software does. | -- like the software does. | ||
if not ( | if not (allow_self_link or id) and link.target:gsub("^:", "") == mw.title.getCurrentTitle().prefixedText then | ||
return "<strong class=\"selflink\">" .. link.display .. "</strong>" | return "<strong class=\"selflink\">" .. link.display .. "</strong>" | ||
end | end | ||
--[[ | --[[ | ||
Add fragment | Add fragment | ||
Line 157: | Line 157: | ||
Category = true, | Category = true, | ||
} | } | ||
if not prefixes[prefix] then | if not prefixes[prefix] then | ||
if link.fragment or link.target:find("#$") then | if link.fragment or link.target:find("#$") then | ||
Line 165: | Line 165: | ||
} | } | ||
end | end | ||
if not link.fragment and lang:getCode() ~= "und" then | if not link.fragment and lang:getCode() ~= "und" then | ||
if id then | if id then | ||
Line 174: | Line 174: | ||
end | end | ||
end | end | ||
-- This allows linking to pages like [[sms:a]] without it being treated weirdly. | -- This allows linking to pages like [[sms:a]] without it being treated weirdly. | ||
link.target = link.target:gsub(":", ":") | link.target = link.target:gsub(":", ":") | ||
end | end | ||
return "[[" .. link.target .. (link.fragment and "#" .. link.fragment or "") .. "|" .. link.display .. "]]" | return "[[" .. link.target .. (link.fragment and "#" .. link.fragment or "") .. "|" .. link.display .. "]]" | ||
end | end | ||
Line 187: | Line 187: | ||
local link = { target = linktext } | local link = { target = linktext } | ||
local first, second = link.target:match("^([^|]+)|(.+)$") | local first, second = link.target:match("^([^|]+)|(.+)$") | ||
if first then | if first then | ||
link.target = first | link.target = first | ||
Line 194: | Line 194: | ||
link.display = link.target | link.display = link.target | ||
end | end | ||
first, second = link.target:match("^(.+)#(.+)$") | first, second = link.target:match("^(.+)#(.+)$") | ||
if first then | if first then | ||
link.target = first | link.target = first | ||
Line 204: | Line 204: | ||
link.fragment = false | link.fragment = false | ||
end | end | ||
return link | return link | ||
end | end | ||
Line 211: | Line 211: | ||
-- Creates a basic wikilink to the given term. If the text already contains | -- Creates a basic wikilink to the given term. If the text already contains | ||
-- links, these are replaced with links to the correct section. | -- links, these are replaced with links to the correct section. | ||
function export.language_link(data, | function export.language_link(data, allow_self_link) | ||
if type(data) ~= "table" then | if type(data) ~= "table" then | ||
error("The first argument to the function language_link must be a table. See Module:links/documentation for more information.") | error("The first argument to the function language_link must be a table. See Module:links/documentation for more information.") | ||
end | end | ||
local text = data.term | local text = data.term | ||
if ignore_cap[data.lang:getCode()] and text then | if ignore_cap[data.lang:getCode()] and text then | ||
text = text:gsub("%^", "") | text = text:gsub("%^", "") | ||
end | end | ||
-- If the text begins with * and another character, | -- If the text begins with * and another character, | ||
-- then act as if each link begins with * | -- then act as if each link begins with * | ||
local allReconstructed = false | local allReconstructed = false | ||
if text:find("^*.") then | if text:find("^*.") then | ||
allReconstructed = true | allReconstructed = true | ||
end | end | ||
-- Do we have embedded wikilinks? | -- Do we have embedded wikilinks? | ||
if text:find("[[", nil, true) then | if text:find("[[", nil, true) then | ||
Line 236: | Line 236: | ||
[[Special:WhatLinksHere/Template:tracking/links/id-ignored]] | [[Special:WhatLinksHere/Template:tracking/links/id-ignored]] | ||
]=] | ]=] | ||
if data.alt then | if data.alt then | ||
require("Module:debug").track("links/alt-ignored") | require("Module:debug").track("links/alt-ignored") | ||
Line 242: | Line 242: | ||
"ignored alt:", data.alt, "lang:", data.lang:getCode()) | "ignored alt:", data.alt, "lang:", data.lang:getCode()) | ||
end | end | ||
if data.id then | if data.id then | ||
require("Module:debug").track("links/id-ignored") | require("Module:debug").track("links/id-ignored") | ||
Line 248: | Line 248: | ||
"ignored id:", data.id, "lang:", data.lang:getCode()) | "ignored id:", data.id, "lang:", data.lang:getCode()) | ||
end | end | ||
-- Begins and ends with a wikilink tag | -- Begins and ends with a wikilink tag | ||
if text:find("^%[%[(.+)%]%]$") then | if text:find("^%[%[(.+)%]%]$") then | ||
Line 258: | Line 258: | ||
local temp = text:gsub("^%[%[(.+)%]%]$", "%1") | local temp = text:gsub("^%[%[(.+)%]%]$", "%1") | ||
temp = temp:gsub("%]%], %[%[", "|") | temp = temp:gsub("%]%], %[%[", "|") | ||
if not temp:find("[%[%]]") then | if not temp:find("[%[%]]") then | ||
require("Module:debug").track("links/list") | require("Module:debug").track("links/list") | ||
Line 264: | Line 264: | ||
end | end | ||
end | end | ||
text = text:gsub("%[%[([^%]]+)%]%]", | text = text:gsub("%[%[([^%]]+)%]%]", | ||
function(linktext) | function(linktext) | ||
local link = parseLink(linktext) | local link = parseLink(linktext) | ||
if allReconstructed then | if allReconstructed then | ||
link.target = "*" .. link.target | link.target = "*" .. link.target | ||
end | end | ||
return makeLangLink(link, data.lang, data.id, | return makeLangLink(link, data.lang, data.id, allow_self_link) | ||
end) | end) | ||
-- Remove the extra * at the beginning if it's immediately followed | -- Remove the extra * at the beginning if it's immediately followed | ||
-- by a link whose display begins with * too | -- by a link whose display begins with * too | ||
Line 283: | Line 283: | ||
else | else | ||
-- There is no embedded wikilink, make a link using the parameters. | -- There is no embedded wikilink, make a link using the parameters. | ||
text = makeLangLink({ target = text, display = data.alt }, data.lang, data.id, | text = makeLangLink({ target = text, display = data.alt }, data.lang, data.id, allow_self_link) | ||
end | end | ||
return text | return text | ||
end | end | ||
Line 291: | Line 291: | ||
function export.mark(text, itemType, face, lang) | function export.mark(text, itemType, face, lang) | ||
local tag = { "", "" } | local tag = { "", "" } | ||
if itemType == "gloss" then | if itemType == "gloss" then | ||
tag = { '<span class="mention-gloss-double-quote">“</span><span class="mention-gloss">', | tag = { '<span class="mention-gloss-double-quote">“</span><span class="mention-gloss">', | ||
Line 310: | Line 310: | ||
'<span class="mention-gloss-paren annotation-paren">)</span>' } | '<span class="mention-gloss-paren annotation-paren">)</span>' } | ||
end | end | ||
if type(text) == "string" then | if type(text) == "string" then | ||
return tag[1] .. text .. tag[2] | return tag[1] .. text .. tag[2] | ||
Line 321: | Line 321: | ||
function export.format_link_annotations(data, face) | function export.format_link_annotations(data, face) | ||
local output = {} | local output = {} | ||
-- Interwiki link | -- Interwiki link | ||
if data.interwiki then | if data.interwiki then | ||
table_insert(output, data.interwiki) | table_insert(output, data.interwiki) | ||
end | end | ||
-- Genders | -- Genders | ||
if type(data.genders) ~= "table" then | if type(data.genders) ~= "table" then | ||
data.genders = { data.genders } | data.genders = { data.genders } | ||
end | end | ||
if data.genders and #data.genders > 0 then | if data.genders and #data.genders > 0 then | ||
local m_gen = require("Module:gender and number") | local m_gen = require("Module:gender and number") | ||
table_insert(output, " " .. m_gen.format_list(data.genders, data.lang)) | table_insert(output, " " .. m_gen.format_list(data.genders, data.lang)) | ||
end | end | ||
local annotations = {} | local annotations = {} | ||
-- Transliteration and transcription | -- Transliteration and transcription | ||
if data.tr or data.ts then | if data.tr or data.ts then | ||
Line 347: | Line 347: | ||
kind = "default" | kind = "default" | ||
end | end | ||
if data.tr and data.ts then | if data.tr and data.ts then | ||
table_insert(annotations, | table_insert(annotations, | ||
Line 359: | Line 359: | ||
end | end | ||
end | end | ||
-- Gloss/translation | -- Gloss/translation | ||
if data.gloss then | if data.gloss then | ||
table_insert(annotations, export.mark(data.gloss, "gloss")) | table_insert(annotations, export.mark(data.gloss, "gloss")) | ||
end | end | ||
-- Part of speech | -- Part of speech | ||
if data.pos then | if data.pos then | ||
Line 374: | Line 374: | ||
table_insert(annotations, export.mark(pos_tags[data.pos] or data.pos, "pos")) | table_insert(annotations, export.mark(pos_tags[data.pos] or data.pos, "pos")) | ||
end | end | ||
-- Literal/sum-of-parts meaning | -- Literal/sum-of-parts meaning | ||
if data.lit then | if data.lit then | ||
table_insert(annotations, "literally " .. export.mark(data.lit, "gloss")) | table_insert(annotations, "literally " .. export.mark(data.lit, "gloss")) | ||
end | end | ||
if #annotations > 0 then | if #annotations > 0 then | ||
table_insert(output, " " .. export.mark(table_concat(annotations, ", "), "annotations")) | table_insert(output, " " .. export.mark(table_concat(annotations, ", "), "annotations")) | ||
end | end | ||
return table_concat(output) | return table_concat(output) | ||
end | end | ||
-- A version of {{l}} or {{m}} that can be called from other modules too | -- A version of {{l}} or {{m}} that can be called from other modules too | ||
function export.full_link(data, face, | function export.full_link(data, face, allow_self_link, no_check_redundant_translit) | ||
if type(data) ~= "table" then | if type(data) ~= "table" then | ||
error("The first argument to the function full_link must be a table. " | error("The first argument to the function full_link must be a table. " | ||
.. "See Module:links/documentation for more information.") | .. "See Module:links/documentation for more information.") | ||
end | end | ||
-- Create the link | -- Create the link | ||
local output = {} | local output = {} | ||
Line 399: | Line 399: | ||
local link = "" | local link = "" | ||
local annotations | local annotations | ||
--local m_utilities = require("Module:utilities") | --local m_utilities = require("Module:utilities") | ||
-- Is there any text to show? | -- Is there any text to show? | ||
if (data.term or data.alt) then | if (data.term or data.alt) then | ||
Line 411: | Line 411: | ||
local best = require("Module:scripts").findBestScript(data.alt or data.term, data.lang) | local best = require("Module:scripts").findBestScript(data.alt or data.term, data.lang) | ||
require("Module:debug").track("links/sc") | require("Module:debug").track("links/sc") | ||
if data.sc:getCode() == best:getCode() then | if data.sc:getCode() == best:getCode() then | ||
require("Module:debug").track("links/sc/redundant") | require("Module:debug").track("links/sc/redundant") | ||
Line 420: | Line 420: | ||
end | end | ||
end | end | ||
local class = "" | local class = "" | ||
local function encode_accel_param(prefix, param) | |||
-- This is decoded again by [[WT:ACCEL]]. | |||
return param and prefix .. param:gsub("%%", "."):gsub(" ", "_") or "" | |||
end | |||
if data.accel then | if data.accel then | ||
local form = data.accel.form and data.accel.form .. "-form-of" or "" | local form = data.accel.form and data.accel.form .. "-form-of" or "" | ||
local gender = | local gender = encode_accel_param("gender-", data.accel.gender) | ||
local | local pos = encode_accel_param("pos-", data.accel.pos) | ||
local translit = encode_accel_param("transliteration-", data.accel.translit) | |||
local lemma = | local lemma = encode_accel_param("origin-", data.accel.lemma) | ||
local lemma_translit = | local lemma_translit = encode_accel_param("origin_transliteration-", data.accel.lemma_translit) | ||
local no_store = data.accel.no_store and "form-of-nostore" or "" | local no_store = data.accel.no_store and "form-of-nostore" or "" | ||
local accel = | local accel = | ||
form .. " " .. | form .. " " .. | ||
gender .. " " .. | gender .. " " .. | ||
pos .. " " .. | |||
translit .. " " .. | translit .. " " .. | ||
lemma .. " " .. | lemma .. " " .. | ||
lemma_translit .. " " .. | lemma_translit .. " " .. | ||
no_store .. " " | no_store .. " " | ||
class = "form-of lang-" .. data.lang:getCode() .. " " .. accel | class = "form-of lang-" .. data.lang:getCode() .. " " .. accel | ||
end | end | ||
-- Only make a link if the term has been given, otherwise just show the alt text without a link | -- Only make a link if the term has been given, otherwise just show the alt text without a link | ||
link = require("Module:script utilities").tag_text( | link = require("Module:script utilities").tag_text( | ||
data.term and export.language_link(data, | data.term and export.language_link(data, allow_self_link) | ||
or data.alt, data.lang, data.sc, face, class) | or data.alt, data.lang, data.sc, face, class) | ||
else | else | ||
Line 451: | Line 457: | ||
Is there at least a transliteration we can work from? ]] | Is there at least a transliteration we can work from? ]] | ||
link = require("Module:script utilities").request_script(data.lang, data.sc) | link = require("Module:script utilities").request_script(data.lang, data.sc) | ||
if link == "" or not data.tr or data.tr == "-" then | if link == "" or not data.tr or data.tr == "-" then | ||
-- No link to show, and no transliteration either. Show a term request. | -- No link to show, and no transliteration either. Show a term request. | ||
local category = "" | local category = "" | ||
if mw.title.getCurrentTitle().nsText ~= "Template" then | if mw.title.getCurrentTitle().nsText ~= "Template" then | ||
table_insert(categories, "[[Category:" .. data.lang:getCanonicalName() .. " term requests]]") | table_insert(categories, "[[Category:" .. data.lang:getCanonicalName() .. " term requests]]") | ||
end | end | ||
link = "<small>[Term?]</small>" | link = "<small>[Term?]</small>" | ||
end | end | ||
end | end | ||
table_insert(output, link) | table_insert(output, link) | ||
if data.tr == "" or data.tr == "-" then | if data.tr == "" or data.tr == "-" then | ||
data.tr = nil | data.tr = nil | ||
elseif phonetic_extraction[data.lang:getCode()] then | elseif phonetic_extraction[data.lang:getCode()] then | ||
local m_phonetic = require(phonetic_extraction[data.lang:getCode()]) | local m_phonetic = require(phonetic_extraction[data.lang:getCode()]) | ||
data.tr = data.tr or m_phonetic.getTranslit(export.remove_links(data.term)) | data.tr = data.tr or m_phonetic.getTranslit(export.remove_links(data.term)) | ||
elseif (data.term or data.alt) and not data.sc:getCode():find("Lati?n") then | elseif (data.term or data.alt) and not data.sc:getCode():find("Lati?n") then | ||
-- Try to generate a transliteration, unless transliteration has been | -- Try to generate a transliteration, unless transliteration has been supplied and either | ||
-- | -- no_check_redundant_translit is given or we are in a high-memory entry. (Checking for redundant | ||
if not (data.tr and mw.loadData("Module:links/data").high_memory_entries[mw.title.getCurrentTitle().text]) then | -- transliteration can use up significant amounts of memory so we don't want to do it if memory | ||
-- is tight. `no_check_redundant_translit` is currently set when called ultimately from | |||
-- {{multitrans|...|no-check-redundant-translit=1}}.) | |||
if not (data.tr and ( | |||
no_check_redundant_translit or | |||
mw.loadData("Module:links/data").high_memory_entries[mw.title.getCurrentTitle().text] | |||
)) then | |||
local automated_tr = data.lang:transliterate(export.remove_links(data.alt or data.term), data.sc) | local automated_tr = data.lang:transliterate(export.remove_links(data.alt or data.term), data.sc) | ||
if automated_tr then | if automated_tr then | ||
local manual_tr = data.tr | local manual_tr = data.tr | ||
if manual_tr then | if manual_tr then | ||
if manual_tr == automated_tr then | if manual_tr == automated_tr then | ||
Line 497: | Line 509: | ||
end | end | ||
end | end | ||
if (not manual_tr) or data.lang:overrideManualTranslit() then | if (not manual_tr) or data.lang:overrideManualTranslit() then | ||
data.tr = automated_tr | data.tr = automated_tr | ||
Line 504: | Line 516: | ||
end | end | ||
end | end | ||
-- Link to the transliteration entry for languages that require this | -- Link to the transliteration entry for languages that require this | ||
if data.tr and data.lang:link_tr() then | if data.tr and data.lang:link_tr() then | ||
data.tr = export.language_link { lang = data.lang, term = data.tr } | data.tr = export.language_link { lang = data.lang, term = data.tr } | ||
end | end | ||
table_insert(output, export.format_link_annotations(data, face)) | table_insert(output, export.format_link_annotations(data, face)) | ||
return table_concat(output) .. table_concat(categories) | return table_concat(output) .. table_concat(categories) | ||
end | end | ||
Line 523: | Line 535: | ||
text = text.args[1] | text = text.args[1] | ||
end | end | ||
if not text or text == "" then | if not text or text == "" then | ||
return "" | return "" | ||
end | end | ||
text = mw.ustring.gsub(text, "%[%[Category:[^|%]]-|?[^|%]]-%]%]", "") | text = mw.ustring.gsub(text, "%[%[Category:[^|%]]-|?[^|%]]-%]%]", "") | ||
text = text:gsub("%[%[[^|%]]-|", "") | text = text:gsub("%[%[[^|%]]-|", "") | ||
text = text:gsub("%[%[", "") | text = text:gsub("%[%[", "") | ||
text = text:gsub("%]%]", "") | text = text:gsub("%]%]", "") | ||
return text | return text | ||
end | end | ||
Line 538: | Line 550: | ||
function export.english_links(text) | function export.english_links(text) | ||
local lang = require("Module:languages").getByCode("en") | local lang = require("Module:languages").getByCode("en") | ||
-- Parentheses around function call to remove second return value, the | -- Parentheses around function call to remove second return value, the | ||
-- number of replacements. | -- number of replacements. | ||
Line 551: | Line 563: | ||
local language_names = mw.loadData("Module:languages/code to canonical name") | local language_names = mw.loadData("Module:languages/code to canonical name") | ||
local script_codes = mw.loadData("Module:scripts/codes") | local script_codes = mw.loadData("Module:scripts/codes") | ||
if data.langCode then | if data.langCode then | ||
data.langName = language_names[data.langCode] or error('The language code "' .. data.langCode .. '" is not recognized.') | data.langName = language_names[data.langCode] or error('The language code "' .. data.langCode .. '" is not recognized.') | ||
Line 557: | Line 569: | ||
error('Language code is required.') | error('Language code is required.') | ||
end | end | ||
if not data.term then | if not data.term then | ||
error('Term to link to is required.') | error('Term to link to is required.') | ||
end | end | ||
if data.scCode then | if data.scCode then | ||
if not script_codes[data.scCode] then | if not script_codes[data.scCode] then | ||
Line 569: | Line 581: | ||
error("The function light_link requires a script code.") | error("The function light_link requires a script code.") | ||
end | end | ||
local fragment | local fragment | ||
if data.id then | if data.id then | ||
Line 576: | Line 588: | ||
fragment = data.langName | fragment = data.langName | ||
end | end | ||
return table_concat { | return table_concat { | ||
'<span class="', data.scCode, '" lang="', data.langCode, | '<span class="', data.scCode, '" lang="', data.langCode, | ||
Line 588: | Line 600: | ||
å in the UTF-8 encoding: | å in the UTF-8 encoding: | ||
11000011 10100101 | 11000011 10100101 | ||
Note that the bytes used to represent a character are actually different from | Note that the bytes used to represent a character are actually different from | ||
the Unicode codepoint. For å, the codepoint is 0xE5. The bits (digits) that | the Unicode codepoint. For å, the codepoint is 0xE5. The bits (digits) that | ||
Line 610: | Line 622: | ||
error("The first argument to section_link was a " .. type(link) .. ", but it should be a string.") | error("The first argument to section_link was a " .. type(link) .. ", but it should be a string.") | ||
end | end | ||
link = link:gsub("_", " ") | link = link:gsub("_", " ") | ||
local numberSigns = require("Module:string").count(link, "#") | local numberSigns = require("Module:string").count(link, "#") | ||
if numberSigns > 1 then | if numberSigns > 1 then | ||
error("The section link should only contain one number sign (#).") | error("The section link should only contain one number sign (#).") | ||
end | end | ||
link = mw.uri.decode(link, "WIKI") | link = mw.uri.decode(link, "WIKI") | ||
local page, section = link:match("^([^#] | local page, section = link:match("^([^#]*)#(.+)$") | ||
if page == "" then | |||
if | page = nil | ||
end | |||
if section then | |||
section = decodeAnchor(section) | section = decodeAnchor(section) | ||
-- URI-encode (percent-encode) section to allow square brackets and | -- URI-encode (percent-encode) section to allow square brackets and | ||
-- other dodgy characters in section name. | -- other dodgy characters in section name. | ||
-- If not percent-encoded, they prevent the parser from creating a link. | -- If not percent-encoded, they prevent the parser from creating a link. | ||
-- Decode percent-encoding in the displayed text | -- Decode percent-encoding in the displayed text | ||
return "[[" .. page .. "#" .. mw.uri.encode(section, "WIKI") | if page then | ||
return "[[" .. page .. "#" .. mw.uri.encode(section, "WIKI") | |||
.. "|" .. page .. " § " .. section .. "]]" | |||
else | |||
return "[[#" .. mw.uri.encode(section, "WIKI") | |||
.. "|§ " .. section .. "]]" | |||
end | |||
else | else | ||
error( | error("The function “section_link” could not find a number sign marking a section name.") | ||
end | end | ||
end | end | ||
return export | return export |