模板討論:嵌入片段
能否讓這個模板更加數據庫化一點?
例如頁面A有以下的wiki代碼:
<!-- embed:Outer --> 第一行 <!-- embed:Inner1 --> *<!-- embed -->1<!-- embed-end --> *<!-- embed -->4<!-- embed-end --> *<!-- embed -->3<!-- embed-end --> <!-- embed-end:Inner --> 中间的某一行 <!-- embed:Inner2 --> *<!-- embed -->6<!-- embed-end --> *<!-- embed -->3<!-- embed-end --> *<!-- embed -->8<!-- embed-end --> <!-- embed-end:Inner --> 最后一行 <!-- embed-end:Outer -->
只需要調用
{{嵌入片段|page=A|Outer|Inner1|[2]}}
就能得到結果:4
甚至還可以用來做算術
{{#ifeq:{{#expr:{{#expr:{{嵌入片段|page=A|Outer|Inner1|[3]}} - {{嵌入片段|page=A|Outer|Inner1|[1]}}}} * {{嵌入片段|page=A|Outer|Inner1|[2]}}}}|{{嵌入片段|page=A|Outer|Inner2|[3]}}|正确|错误}} <!-- {{#ifeq:{{#expr:{{#expr:3 - 1}} * 4}}|8|正确|错误}}
得到結果:正確
雖然這個算法是可以實現的。
但我不清楚這樣做會不會有什麼嚴重的後果。--サンムル(討論) 2018年12月4日 (二) 21:13 (CST)
快住手,這已經不是嵌入片段了還是不要這麼改了吧,這和嵌入片段沒什麼關係,想實現類似效果直接在lua里寫數據不是更好,或者拿{{array}}和{{split}}也可以。這個模板主要的應用場景是幾個頁面有一個或多個重複的部分,利用這個模板達到簡化代碼,方便修改的目的,也就是類似大家族模板的作用。--東東君(討論) 2018年12月4日 (二) 21:45 (CST)- 那麼我所設想的使用情況就有所不同,我這邊維護的大家族有挺多重複的參數細節,比如說角色的日文名、拼寫、角色色卡等等等等。這些基本上都不是簡單的文本,而是可能包含wiki代碼的塊(比如說日文名會加上{{lj}}、{{ruby}}模板)。
- 如果說{{嵌入片段}}這個模板定位在便於重用大段的代碼,那我所設想的模板則定位在便於書寫上述零碎難以記憶但可以通過特定邏輯來檢索的小參數。而且,我設想的模板在使用時是強烈建議或者說必須添加上
subst:
展開模板的。因為這些小參數不需要隨時變動,是可以寫成硬代碼的。 - Lua模塊確實是一個可選的載體,但事實上,為了後期維護的方便,我更傾向於使用大部分編輯者也能輕鬆駕馭的wiki頁面來當作「數據庫」的載體。
- 例如大家族少女歌劇,則創建子頁面少女歌劇/datas,然後在這個子頁面書寫上面提到的格式的代碼。(由於此子頁面被視為特殊的頁面,因此出現這樣的「奇怪」的HTML注釋代碼就不會讓新手編輯不知所措,或者誤刪誤改。)--サンムル(討論) 2018年12月4日 (二) 22:46 (CST)
- @サンムル
快住手,這已經不是嵌入片段了看你的例子,如果只是為了獲取大量零碎的數據的話,感覺和重新發明XML/json沒什麼區別,而且還比XML/json丑,更別提現在XML/json已經有了完善的工具(雖然維基里不一定能用)。而如果用{{嵌入片段}},一旦embed和embed-end不匹配,天知道會發生什麼,而且還沒有工具可以檢查,這個工作應該交給其他模塊做。 - 其實Lua是可以解析維基文本的,見mw.html:wikitext和/或frame:callParserFunction、frame:expandTemplate等。
- @东东君其實最好可以支持embed的嵌套,比如某頁面因為某些原因介紹了兩張專輯某些原因是啥?這麼做好像是不合編輯規範的吧?,分有簡介和模板{{Album Infobox}}:
<!-- embed:专辑1 --> <!-- embed:简介 --> 这是专辑1的简介 <!-- embed-end:简介 --> <!-- embed:Album_Infobox --> {{Album Infobox|...}} <!-- embed-end:Album_Infobox --> <!-- embed-end:专辑1 --> <!-- embed:专辑2 --> <!-- embed:简介 --> 这是专辑2的简介 <!-- embed-end:简介 --> <!-- embed:Album_Infobox --> {{Album Infobox|...}} <!-- embed-end:Album_Infobox --> <!-- embed-end:专辑2 -->
- 現在我想調用專輯2的簡介,
{{嵌入片段|page=页面名称|id=简介}}
只能得到專輯1的簡介,希望修改成可以使用{{嵌入片段|page=页面名称|专辑2|简介}}
調用專輯2的簡介。 - 所以我為什麼不重命名為「embed:簡介2」或者拆成兩個頁面啊。--Nzh21(討論) 2018年12月4日 (二) 23:56 (CST)
- 答サンムル:
有幾點疑問和理由:
- 主要問題是需要使用參數嗎?參數可以在包裹的內容里寫,之後直接在調用模板時傳入參數
- 再稍微複雜一點的模板就應該單獨創建了,subst更應該創建一個模板,以管理其內部哪部分需要展開
- 這個模板就是為了省去再創建一個頁面作為模板而使用的,要是為了使用這個模板創建一個新的頁面豈不是南轅北轍了
- 拿wiki語法做結構化數據實在是個比較糟糕的主意,它需要額外的字符串處理,以及更多的語法代碼
- 答Nzh21:
這種情況完全可以寫到一起,加個參數還得多寫一個管道符。
最後,你們都沒發現這個模板是能向嵌入代碼傳參的嗎...占用匿名參數的位置會導致參數錯亂的--東東君(討論) 2018年12月5日 (三) 00:17 (CST)
- 的確是我沒想到這一點,被一開始那個寫成數組一樣的例子帶來了一些奇怪的想法,
雖然一開始就覺得這是個沒什麼用的功能,但沒想到的確會影響參數。--Nzh21(討論) 2018年12月5日 (三) 00:24 (CST) - @東東君我明白你的觀點了。我會另寫一個模塊嘗試實現,關於embed和embed-end不匹配的問題,或許今後此格式廣泛使用後可以添加過濾器,或者用javascript開發小工具來編輯時檢查,但目前為止它是一個不容忽視的問題。我的新模塊和新模板將會保留在我的用戶頁下,僅自己使用,不會轉正。--サンムル(討論) 2018年12月5日 (三) 00:33 (CST)
關於embed和embed-end不成對的一個解決方法
首先需要建立一個前提,一個共識——「若embed和embed-end不成對將可能會造成無法預料且難以排查的錯誤。每一位編輯者在使用embed和embed-end對頁面內容進行分割時,有義務確保其成對。」
建議把上面這句話寫入文檔中。
接下來提出解決方法:
- 我的思路是借鑑
#invoke
Lua模塊。
- 若Lua模塊正常運行,則輸出內容。
- 若Lua模塊產生錯誤,則在頁面上顯示一行紅色粗體文本,內容為產生的錯誤的信息,點擊鏈接能得到調用堆棧等更詳盡的錯誤信息。
- 借鑑後把模板的行為修改為:
- 若embed和embed-end成對,則輸出內容。
- 若embed和embed-end不成對,則顯示【警告】這個片段嵌入自{{{page|}}}(id={{{id|}}}),但由於某些原因丟失。有可能是頁面[[{{{page|}}}]]已被刪除或移動,或者是embed和embed-end不成對。,
- 【可選】若不想顯示這個警告信息,可以給模塊添加參數
ignoreWarning
:
那麼,當若embed和embed-end不成對,將會什麼內容也不輸出。
我昨天在討論:提問求助區試用的時候就因為embed和embed-end沒有成對而險些把我自己的整個用戶頁給嵌入上去了。因此,在這種情況下,拒絕輸出任何內容要比目前的「從embed開始,找不到embed-end就一直輸出到頁面結尾」要好,這樣可以排除不可預料的後果。--サンムル(討論) 2018年12月5日 (三) 10:41 (CST)
由此進階,借鑑分類Category:有腳本錯誤的頁面創建分類Category:含有錯誤嵌入片段的頁面。若embed和embed-end不成對,在顯示警告信息的同時,將頁面歸到這個分類下。以後定期巡查,方便維護。@東東君--サンムル(討論) 2018年12月5日 (三) 12:30 (CST)
一部分採納:
- 那句話感覺有點太小題大做了,這就是一個代碼語法,和模板花括號一樣,錯了就會出問題,「有義務...」什麼的,感覺好奇怪啊
- 完善了錯誤信息
- 發生標記匹配錯誤阻止輸出內容
- 沒有添加屏蔽錯誤信息的參數,因為即使是用來做if判斷也沒什麼意義,這可能導致更難發現錯誤
- 添加了分類(個人觀點:雖然添加能更便於找出發生問題的頁面,但就為了一個模板還是不至於)
--東東君(討論) 2018年12月5日 (三) 13:31 (CST)
若使用Lua的error來輸出錯誤信息,則前面的Lua錯誤 模塊:SectionEmbed的第xx行:這種無關文本是否會分散使用者的注意力?給人一種「這是模塊代碼出了問題,而不是我自己寫錯鏈接」的錯覺。--サンムル(討論) 2018年12月5日 (三) 15:06 (CST)
被嵌入片段中含有章節的「編輯」鏈接指向錯誤
如果被嵌入片段中含有章節,那麼這個章節的「編輯」鏈接指向的是模塊:SectionEmbed的同名章節。
如:
現場演示
- 正常的章節:
被嵌入的章節
章節內容
- 非正常的章節:
被嵌入的章節
章節內容
--サンムル(討論) 2018年12月8日 (六) 15:06 (CST)
多次使用嵌入片段產生的錯誤
我在《BanG_Dream!少女樂團派對!》頁面的「翻唱曲一節中加入了6組embed標記,然後試圖在BanG_Dream!/BanG_Dream!翻唱曲列表中使用時,遇到了問題。如果我只使用4次「嵌入片段」,則一切正常。如果使用超過四次,則會出現警告:包含模板大小過大。 一些模板將不會包含。第五次嵌入片段的地方變成了未解析的「Template:嵌入片段」,第六次的地方變成了「嵌入失敗,請確認在頁面【BanG_Dream!少女樂團派對!】是否存在id為「GBP-Cover-Others」的embed嵌入標記,並檢查書寫是否正確!」,而該頁面之後所有的Template也都失效了。
以上情況在預覽和沙盒正式保存中都會出現。是否是因為《BanG_Dream!少女樂團派對!》這個頁面的內容較大,而「嵌入片段」的原理是引用整個頁面再截取部分,每引用一次就要占用整個頁面的大小導致的?(我瞎推測的,我並沒有研究過「嵌入片段」的實現原理)--Krowbullet(討論) 2019年2月5日 (二) 00:14 (CST)
- 之前的做法的確是引入整個頁面再截取,這會導致整個頁面被載入。後來改成了在Lua里先取源碼再截取後解析輸出,這樣雖然解決了前面的問題,但只要是模板生成的內容,就會被算進「模板展開後大小」里,暫時還沒找到什麼好辦法能解決這個問題。--東東君(討論) 2019年2月5日 (二) 01:06 (CST)
新章節
修改後不能省略id,也不能傳參了。建議換回原來的載入方式。--遲昫123(討論) 2019年2月11日 (一) 22:14 (CST)