Hjálp:Lua skrifta

Úr Wikipediu, frjálsa alfræðiritinu
Jump to navigation Jump to search

Þessi hjálp er ætluð til að hjálpa þér að skrifa, eða umbreyta sniði svo það notist við Lua forritunarmálið. Stuðningur við Lua er í Scribunto viðbótinni í MediaWiki, sem var þróuð af Tim Starling og Victor Vasiliev. Þessi hjálp gefur yfirsýn yfir ferlið að skrifa Lua snið og bendir þér í rétta átt eftir frekari upplýsingum.

Lua snið koma í tveimur hlutum: sniðið sjálft og ein eða fleiri skriftur - í Module nafnrýminu - sem innihalda forrit sem eru keyrð á wiki vefþjónunum til að gefa frá sér wiki-texta sem sniðið þenst út í. Sniðið er vakið í falli innan skriftunnar með nýrri þáttunar aðgerð sem kallast {{#invoke:}}.

Hugmyndin á bak við að Lua-væða snið er að bæta afköst sniðsins. Lua snið hafa enga þörf fyrir þáttunar aðgerðir, eins og {{#if:}}, {{#ifeq:}}, {{#switch:}} og {{#eval:}}. Allt þetta er gert í skriftunni, í tungumáli sem var í raun og veru hannað til að vera forritunartungumál, frekar en kerfi fyrir snið sem var boltað niður með mismunandi viðbótum til þess að reyna að gera það að forritunartungumáli.[notes 1] Lua snið hafa heldur enga þörf fyrir ítengingar á milli sniða sem geta náð takmörkuninni "expansion depth limit". Snið sem er lua-vætt að fullu ætti aldrei að þurfa að ítengja í önnur snið.[notes 2]

Lua[breyta | breyta frumkóða]

Tungumálið sem skrifturnar eru skrifaðar í er Lua. Þeir möguleikar sem er hægt að nota eru skráðir í MW:Extension:Scribunto/Lua reference manual, en í henni hafa möguleikar úr opinberu handbókinni verið fjarlægðir og breytt af Tim Starling til þess að gera hana hentugri fyrir kóðun á Lua-sniðum. Ég ítreka þó, að þetta er handbók, en ekki leiðbeiningar.

Uppbygging sniða[breyta | breyta frumkóða]

Uppbygging sniða er einföld. Sniðið inniheldur {{#invoke:}}. Strax á eftir tvípunktinum kemur nafn skriftunnar, síðan pípumerki (|) og nafn falls innan skriftunnar. Hérna er til dæmis {{ref label}}:

<includeonly>{{#invoke:citation|reflabel}}</includeonly><noinclude>{{documentation}}</noinclude>

Ef þú finnur þörf fyrir því að nota önnur snið innan þess sniðs sem þú ert að skrifa, eða nota eitthvað annað en {{#invoke:}} og mögulega einhverjar breytur þá ertu að fara rangt að.

Grunnatriði skriftna[breyta | breyta frumkóða]

Keyrsla[breyta | breyta frumkóða]

Skrifta er keyrð af {{#invoke:}} á tvo vegu:

  1. Skriftunni er hlaðið niður og keyrð í heild sinni. Þetta hleður upp viðbótar skriftum sem þessi skrifta þarf (með því að nota fallið require()), byggir upp föll sem skriftan mun senda áfram til sniðsins og gefur upp töflu yfir þær.
  2. Fallið sem er nefnt í {{#invoke:}} er tekið út úr töflunni sem var byggð í fyrsta hluta og kallað á hana, með þeim gildum sem sniðið tekur við og þeim gildum sem eru tilgreind innan {{#invoke:}} (meira um það síðar).

Að taka við gildum frá sniðum[breyta | breyta frumkóða]

Venjulegt fall í Lua getur tekið við ótakmörkuðum fjölda af gildum. Sjáðu þetta fall í Module:Wikitext sem er hægt að kalla á með einu til þremur gildum:

function z.oxfordlist(args,separator,ampersand)

Föll sem er kallað á af {{#invoke:}} eru sérstök. Þau búast við því að vera gefið eitt gildi, töflu sem er kölluð frame (rammi) (og þessum stika er venjulega gefið nafnið frame í lista yfir stika fallsins). Það er kallað frame af því að, því miður, ákáðu forritarnir að nefna það eftir þeirra egin hentugleika. Það er skýrt eftir innri byggingu innan kóða MediaWiki, sem það stendur fyrir á vissan hátt.[notes 3]

Þessi rammi hefur (undir-)töflu innan þess, sem kallast args. Það hefur einnig möguleika til að nálgast parent frame (umflekkinn ramma) (nefnt aftur eftir hlut í MediaWiki). Umflekks ramminn, hefur einnig (undir-)töflu, sem heitir einnig args.

  • Gildin í (íflekkta rammanum, giska ég) rammanum — með öðrum orðum eigindargildi ramma (frame) stikans til fallsins — eru að gildin sem eru gefin til {{#invoke:}} innan wiki-texta sniðsins þíns. Svo, til dæmis, ef þú varst að skrifa {{#invoke:Population|India|a|b|class="popdata"}} í sniðinu þá myndu frumbreytur undir-töflunnar í íflekkta rammanum vera (eins og þær eru skrifaðar í Lua) { "a", "b", class="popdata" }.
  • Gildin í umflekk rammanum eru gildin sem er tekið við af sniðinu þegar það er ítengt. Svo, til dæmis, þegar notandi sniðsins skrifar {{Population of India|c|d|language=Hindi}} þá eru gildi undir-töflurnar af umflekk gildinu (eins og þær eru skrifaðar í Lua) { "c", "d", language="Hindi" }.

Hentugt samheiti forritara sem þú getur notað, til þess að gera þetta allt aðeins auðveldara, að hafa staðbundin gildi nefnd sem config og args í fallinu þínu, sem benda á þessar tvær töflur yfir gildin. Sjáðu þetta, frá Module:Citation:

-- This is used by template {{efn}}.
function z.efn(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that transcludes the template

Allt í config er þá gildi sem þú hefur tilgreint, í þínu sniði, sem þú getur vísað í með kóða eins og config[1] og config["class"]. Þessir eru þeir hlutir sem segja skriftunni þinni frá þessari stillingu.

Allt í args er því gildi sem notandi sniðsins hefur tilgreint, þar sem það var ítengt, að þú getur vísað í með kóða eins og args[1] og args["language"]. Þessi verða venjuleg gildi sniðsins, eins og þau eru tilgreind í notkunarupplýsingum sniðsins eða á /doc undirsíðunni.

Sjáðu {{reflist}}og {{notelist}}fyrir tvö snið sem geyma bæði kóðann {{#invoke:Citation|reflist|x}} en gera það með mismunandi gildum í staðinn fyrir x-ið, og þar af leiðandi gefa frá sér mismunandi niðurstöður frá sama Lua fallinu.

Fyrir báðar gerðirnar af gildum, er nafnið og eigindargildi gildanna nákvæmlega eins og í wiki-textanum, fyrir utan að auka bil fyrir framan og aftan er fjarlægt. Þetta getur haft áhrif á kóðann ef þú ákveður að styðja eða virkja ítengingar gildi sem eru ekki gildar Lua breytur. Í því tilfelli getur þú ekki notað "punkta" formið til að fletta upp töflunni frá málskipuninni, þú getur ekki vísað í |author-first= gildi, heldur vísað í |author= gildi og first eigindargildi með mínus virkinu í miðjunni. Til þess að hafa aðgang að slíku gildi, notaðu "hornklofa" tegundina til að fletta upp töflunni: args["author-first"].

Nefnd gildi eru skráð í args töflunni eftir strengjum þeirra, að sjálfsögðu. Ónefnd gildi (sama hvort þau séu gefin upp sem 1= eða ekki) eru skráð í args töflunni eftir tölunni, en ekki strengnum. args[1] er ekki það sama og args["1"], og þann síðari er ekki hægt að nota í wiki-texta.

Að lokum, taktu eftir því að Lua skriftur geta gert greinarmun á milli gildna sem hafa verið notuð í wikitexta og einfandlega gefa tóman streng, og gildum sem eru alls ekki í wikitextanum. Síðari gerðin er ekki til í args töflunni, og allar tilraunir til að skrá þær mun ákvarða gildið nil. Á meðan fyrri gerðin er til í töflunni og verður ákvörðuð sem tómur strengur, "".

Villumeldingar[breyta | breyta frumkóða]

Nefnum eitt strax frá byrjun: Villa í skriftu er tengill. Þú getur sett músina yfir og smellt á hann.

Við erum það vön okkar sniðum (sem hafa ekki verið lua-vædd) setja villumeldingar í rauðu að við höldum að meldingin "Script error" sé ekkert öðruvísi. Það er það ekki. Ef þú hefur JavaScript virkan í vafranum þínum, þá kemur upp sprettigluggi með upplýsingum um villuna, kall sem rekur aftur villuna og meiraðsegja tengill sem beinir þér í þá línu þar sem villan átti sér stað í viðeigandi skriftu.

Þú getur látið villu gerast með því að kalla á error() fallið.

Ábendingar og brellur[breyta | breyta frumkóða]

Vegna ástæðna sem eru fyrir utan umfangs þessarar hjálpar,[notes 4] er args undir-tafla rammans ekki alveg eins og hefðbundin tafla. Hún byrjar tóm, og það er safnað í hana með gildum þegar þú innir eftir kóða sem leitar eftir þeim.[notes 5] (Það er hægt að búa til töflur sem vinna svona í Lua forriti, með því að nota hluti sem kallast metatables. Það er líka fyrir utan umfang þessarar hjálpar.)

Óheppileg áhrif þessa er að hvorki pairs()ipairs() föllin virka í args töflu, nema þú hefur sent fyrirspurn á öll gildin eftir nöfnum þeirra nú þegar. Í því tilviki er lítill tilgangur í því að nota pairs() eða ipairs() til að ná í upplýsingar sem þú veist nú þegar.

Scribunto gefur frame:argumentPairs() fallið,[notes 6] sem er hægt að nota að miklu leyti í staðinn fyrir pairs(). Það er, hinsvegar, ekkert sambærilegt fall fyrir ipairs(). Þú þarft að búa til þína egin töluröð. Hérna er ein frá Module:Headnote sem færir öll númeruð gildi í newargs töflu (svo annað fall geti einfandlega notað ipairs()):

local newargs = {}
local index = 1
while args[index] ~= nil do
    local arg = args[index]
    newargs[index] = arg
    index = index + 1
end

Afrita innihaldi töflunnar í staðbundnar breytur.[breyta | breyta frumkóða]

Nafn í Lua er annaðhvort að sækja staðbunda breytu eða upplýsingar úr töflu.[1] math.floor sækir upplýsingar úr töflu (úr strengnum "floor") í (altæku) math töflunni, til dæmis. Það að sækja upplýsingar úr töflu tekur lengri tíma, þegar skriftan er keyrð, en að sækja staðbundna breytu. Þegar töflur á borð við args töfluna, með sínum sérstöku eiginleikum, eru sóttar þá eru þær mun hægari.

Fall í Lua getur haft allt að 250 staðbundnar breytur.[2] Þannig notið þann möguleika víðtækt:

  • Ef þú kallar oft á math.floor, afritaðu það sem staðbundna breytu og notaðu það í staðinn:[2]
    local floor = math.floor
    local a = floor((14 - date.mon) / 12)
    local y = date.year + 4800 - a
    local m = date.mon + 12 * a - 3
    return date.day + floor((153 * m + 2) / 5) + 365 * y + floor(y / 4) - floor(y / 100) + floor(y / 400) - 2432046
    
  • Ekki nota args.something aftur og aftur. Afritaðu það sem staðbundna breytu og notaðu hana:
    local Tab = args.tab
    
    (Jafnvel args breytan sjálf er leið til þess að forðast það að fletta upp "args" í frame töflunni aftur og aftur.)

Þegar gildi eru afrituð í staðbundnar breytur eru tvö atriði sem þú getur gert í leiðinni:

  • Brellan önnur heiti fyrir sama gildið. Ef gildi sniðs getur verið undir öðrum nöfnum, eins og í hástöfum og lágstöfum, eða er stafað öðruvísi; þá getur þú notað Lua or virkið til þess að velja það nafn sem hefur hæsta forgang:
    local Title = args.title or args.encyclopaedia or args.encyclopedia or args.dictionary
    local ISBN = args.isbn13 or args.isbn or args.ISBN
    
    Þetta virkar vegna tveggja ástæðna:
    • nil er það sama og false þegar það kemur að or.
    • Lua virkið or hefur það sem kallast "flýtivísa" merkingarfræði. Ef þolandinn til vinstri er ákvarðaður sem eitthvað sem er ekki false eða nil, þá reynir hún ekki einusinni að finna út gildi þolandans til hægri. (Svo, þótt fyrsta dæmið virðist við fyrstu sýn líta út eins og fjórar uppflettingar, þá er algengast, þar sem |title= er notaður með sniðinu, að eingöngu ein uppfletting sé gerð.)
  • Brellan sjálfgefinn tómur strengur. Stundum er sú staðreynd að gildi sem er sleppt í sniði sé nil hjálpsamt. Það kemur þó fyrir ekki, og að þú viljir þá hegðun sem eru hjá sniðum sem hafa ekki verið lua-vædd, að tóm gildi séu tómir strengir. Einfalt or "" í enda segðar er nóg:
    local ID = args.id or args.ID or args[1] or ""
    

Ekki þenja snið, þrátt fyrir að þú getir það[breyta | breyta frumkóða]

Ef staðbundin gildi reyna lítið á vefþjóninn og uppflettingar í töflu reyna mikið á vefþjóninn, þá er alveg yfirdrifið að þenja snið.

Forðastu frame:preprocess() eins og pláguna. Það að þenja snið með földun, sem notar forvinnslubúnað MediaWiki er það sem við erum að forðast, eftir allt saman. Flest sem þú myndir gera með það eru gerðir hraðar, einfaldar og á viðhaldsminni hátt með einföldum Lua föllum.

Á sama hátt, forðastu hluti eins og að nota w:Template:ISO 639 name aze til að geyma eitthvað sem er í raun færsla í gagnabanka. Það að lesa það myndi vera földunar þáttunar kall við samsvarandi gagnabanka fyrirspurnir, allt til þess að finna streng í streng. Búðu til einfalda gagnatöflu í skriftunni þinni, eins og þær sem eru í Module:Language.

Sjá einnig[breyta | breyta frumkóða]

Neðanmálsgreinar[breyta | breyta frumkóða]

  1. Fyrir hugmynd um hvað "boltað-niður" þýðir þegar kemur að hugbúnaðarþróun, sjáðu Flinstones teiknimyndirnar þar sem rifjasteikin frá sjoppunni er það þung að hún lætur bíl Flintstones fara á hliðina.
  2. Það gæti verið þörf á því, þangað til API fyrir Scribunto er aðgengileg fyrir skriftur að ítengja töfra orð. Sjá ábendinga og brellu hlutann. Töfra orð eru þó ekki snið.
  3. Í MediaWiki, eru fleiri en tveir rammar.
  4. Ef þú villt vita það, lestu um hvernig MediaWiki, að hluta til vegna álags sem er lagt á það með gamla sniðakerfinu sem sífellt heldur áfram að ítengja önnur snið, gerir letilega gildisákvörðun af gildum sniða.
  5. Ekki vera hissa, þess vegna, ef kall er rekið aftur til annarar skriftu, í einhverju sem þú hélst að væri venjuleg vísun í gildi sniðsins. Það mun gerast því þensla gildisins tekur þátt í að þenja út annað snið sem hefur verið Lua-vætt.
  6. Taktu eftir tvípunktinum, sem merkir að þetta fall tekur falið self gildi; og taktu eftir því að þetta fall bætir því við frame, en ekki args undir-töfluna.

Tilvísanir[breyta | breyta frumkóða]

  1. Ierusalimschy, Figueiredo, & Celes 2011 §EVAL AND ENVIRONMENTS
  2. 2,0 2,1 Ierusalimschy 2008, p. 17

Heimildir[breyta | breyta frumkóða]

  • test2wiki:Wikipedia:Guide to Scribbling
  • Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Celes, Waldemar (12 May 2011). Passing a Language through the Eye of a Needle. Queue. 9 (5) (Association for Computing Machinery). ACM 1542-7730/11/0500
  • Ierusalimschy, Roberto (2008). „Lua Performance Tips“ (PDF). Í de Figueiredo, Luiz Henrique; Celes, Waldemar; Ierusalimschy, Roberto. Lua Programming Gems (PDF). Lua.org. ISBN 978-85-903798-4-3.