Siirry sisältöön

Moduuli:Tekstipohja

Wikikirjastosta

korvaaMuuttujat(text, vars)

[muokkaa wikitekstiä]
  • param text: merkkijono, joka sisältää {{{}}}-merkittyjä muuttujia
  • param vars: dict, jossa on em. muuttujat ja niitä vastaavat arvot
  • return: muutettu teksti

Korvaa teksin sisältämät muuttujat annetuilla arvoilla sisentäen korvaavan tekstin rivit sopivasti. Jos muuttujamerkintä sisältää rivinvaihdon, muutetaan korvaavan merkkijonon kaikki rivinvaihdot rivinvaihdon ja }}}-merkkien sisään jäävällä tekstillä.

Esim. jos merkintä on

local pohja = [=[
\relative c' { 
  {{{SOINNUT
  }}}
}
]=]

local tulos = tekstipohja.korvaaMuuttujat(pohja, { ["SOINNUT"] = "<a c e>\n<g d e>\n<a c e>") })

on tulos-muuttujan arvo

\relative c' { 
  <a c e>
  <g d e>
  <a c e>
}

require "mw.ustring"

-- Työkalu placeholder-merkkien korvaamiseen sisällöllä tekstistä.
local p = {}

--- Tarkistaa sisältääkö nimi regex-erikoismerkkejä.
-- Heittää virheen jos nimi sisältää jonkun merkeistä [, ], %, {, }, |, ^ tai $.
local function check_var_name(var_name)
   local pos = var_name:find('[%[%]%%{}|^$]')
   if pos ~= nil then
      error("Epäkelpo muuttujanimi: " .. var_name .. ", merkki " .. var_name:sub(pos, pos))
   end
end

local function escape_replacement_string(s)
   -- Korvataan kaikki %-merkit kahdella (%%)
   return s:gsub("%%", "%%%%")
end

--- Korvaa teksin sisältämät muuttujat annetuilla arvoilla.
-- Jos muuttujamerkintä sisältää rivinvaihdon, muutetaan korvaavan merkkijonon
-- kaikki rivinvaihdot rivinvaihdon ja }}}-merkkien sisään jäävällä tekstillä.
-- Esim. jos merkintä on: """
--   Luettelo:
--   {{{Korvattava
--   # }}}
-- """ ja korvaava merkkijono on """
--   a
--   b 
--   c
-- """ on lopputulos """
--   Luettelo:
--   # a
--   # b
--   # c
-- """
--
-- param text: merkkijono, joka sisältää {{{}}}-merkittyjä muuttujia
-- param vars: dict, jossa on em. muuttujat ja niitä vastaavat arvot
-- return:     text, jossa muuttujat on korvattu
function p.korvaaMuuttujat(text, vars)

   for var_name, var_val in pairs(vars) do
      check_var_name(var_name)
      local var_val_escaped = escape_replacement_string(var_val)

      -- Yksinkertainen muuttujaviittaus.
      local var_str = "{{{" .. var_name .. "}}}"
      text = mw.ustring.gsub(text, var_str, var_val)

      -- Rivinvaihdon sisältävä muuttujaviittaus.
      local var_re = "{{{" .. var_name .. "(\n[^\n]*)}}}"
      text = mw.ustring.gsub(text, var_re,
			     function (m)
				local m_escaped = escape_replacement_string(m)
				return var_val_escaped:gsub("\n", m_escaped)
			     end
      )
   end

   return text
end

return p