ماڈیول:ColorAlphabet

آزاد دائرۃ المعارف، ویکیپیڈیا سے

استعمال[ترمیم]

 ---- This module is supposed to apply Green-Armytage's standard for a "color alphabet" to letters in a string of input text.
 ---- {{#invoke:ColorAlphabet|blank|whatever}} for blank, 
 ---- {{#invoke:ColorAlphabet|letter|whatever}} for colored letters
 
local getArgs = require('Module:Arguments').getArgs
local p = {}

function p._main(text, lookupfile, nowiki, blank)
   local debuglog=""
   local lookup = {}
   lookup.file = lookupfile
   lookup.data = mw.loadData(lookup.file)
   debuglog = debuglog..tostring(lookup.data)..table.concat(lookup.data)..lookup.data[7] -- debug
   if not(lookup.data) then return "error: failed to open lookup file" .. tostring(lookup.file) end
   local x=0
   repeat
       x=x+1
       i=lookup.data[x*3-2]
       j=lookup.data[x*3-1]
       k=lookup.data[x*3]
       -- debuglog=debuglog..tostring(i)..tostring(j)..tostring(k)
       if not (i and j and k) then break end
      lookup[i]=j .. (blank or i) .. k -- create the lookup table of what letters are supposed to be transliterated to.  If blank == " " then spaces, not letters go in the middle
   until false
   lookup["["]="";lookup["]"]="" -- don't include these in output
   local wikistart={};wikiend={}
   local s=0;local e=0
   repeat
       s,e=mw.ustring.find(text,"%[%[[^%[%]]-%]%]",e)
       if (not(s) or not(e)) then break end
       wikistart[s]=mw.text.trim(mw.ustring.sub(text,s+2,e-2))
       wikiend[e]=true
   until false
   local prowl=mw.ustring.gmatch(text,"(.)")
   local output=""
   local wl=1
   position=0
   repeat
      local letter=prowl()
      if not(letter) then break end
      position=position+1
      if wikistart[position] then output=output..'<div style="position:relative;display:inline-block;"><div style="position:absolute;display:inline-block;top:-20px;left:0px;clip:rect(0px,'..3*mw.ustring.len(wikistart[position])..'px,20px,0px);overflow:hidden;">[[File:Transparent600.gif|link=http://ur.wikipedia.org/wiki/' ..wikistart[position].. ']]</div></div>' end
      if wikiend[position] then output=output.."" end
      output=output..(lookup[letter] or letter) -- unicode letters will never all be looked up, handle punctuation the same
   until false
   output='<div style="position:relative;display:inline-block;">'..output..'</div>'
   if nowiki then output='<nowiki>'..output..'</nowiki>'; output=output..debuglog end
   return output
end

 -- common code with all relevant args
function p.main(args, blank)
   local text = args[1] or ""
   local nowiki = args.nowiki or nil
   local lookupfile = args.lookup or "Module:ColorAlphabet/lookup"
   return p._main(text, lookupfile, nowiki, blank)
end
   
 -- entry for colorizing letters
function p.letter(frame)
    local args = getArgs(frame)
    return frame:preprocess(p.main(args, nil))
end

 -- entry for replacing letters with colored nonbreaking spaces
function p.blank(frame)
	local args = getArgs(frame)
    return frame:preprocess(p.main(args, "&nbsp;"))
end

return p