使用說明:Pukiwiki-Mediawiki轉換教學

出自 Komica wiki
於 2017年9月12日 (二) 23:15 由 Wbxshiori (對話 | 貢獻) 所做的修訂 (註解(非顯示文字))
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
前往: 導覽搜尋
Pukiwiki-Mediawiki轉換教學
因為原wiki使用pukiwiki格式,在此列出pukiwiki-mediawiki轉換器與手動轉換解說,以幫助有心搬移資料的島民。
以下將使用 表示PukiWiki專用碼、 表MediaWiki專用碼,兩者通用的、來自HTML/CSS的碼和Regex算式不加註顏色

自動轉換(附下載連結)

此處列出別人已經寫好的轉換程式。

注意事項:
  • 部份語法不被支援,故使用後請手動檢查。
  • 若原本的puki碼已有錯誤,自動轉換或手動Regex取代的結果可能會出現異常。
  • 因為PukiWiki頁面內容不存在相當於「分類」的語法,故無法自動追加「MediaWiki分類」,需要手動完成

Notepad++

  • komica-puki_to_mediawiki.zip
    • 最終更新日為2017年7月19日,版本0.5.5
    • 為KomicaWiki量身打造,基於舊wiki約定成俗的條目寫作習慣轉換(如行首*大標題{{h0|大標題}}
      • 有針對參照/註腳語法的巢狀構造與當中的文字格式語法進行處理,未成對的雙括號((()))不會被轉換
      • 會按照表格的列後綴詞(|h行尾|f行尾)重新排列表格,並將設定整欄格式的列(|c行尾)當中樣式完整填入下方所有儲存格
    • 會自動附加<references />於底部
    • 需按照裡面說明,安裝Notepad++(32位元版)Python Script,並照步驟操作
    • 部份Puki碼無法直接轉換,必須手動修正
      • 同一行內的巢狀&color(){};(可能只會轉換其中一對)
      • 不常用的puki函式,如#ref()
      • Puki表格賦予h列(|h行尾)和f列(|f行尾)的預設CSS樣式不會出現,因為MediaWiki不支援<thead><tfoot>功能

瀏覽器(JavaScript/jQuery)

  • komica-puki_to_mediawiki_html.zip
    • 最終更新日為2017年7月19日,版本0.5.5
    • 上面Notepad++用轉換器的離線HTML網頁版本,轉換方式也幾乎相同,除了Python轉JavaScript時必要的變化
    • 免安裝,解壓縮即可使用,只要瀏覽器支援
    • 部份Puki碼無法直接轉換,狀況與Notepad++用轉換器一樣

GoLang

  • p2mfmt
    • 這支程式被用在機器人
    • 目前此程式的問題
      1. 此程式並未針對 Komica Wiki 的模板進行調整,所以自動生成完後需要手動處理模板問題
      2. 此程式在處理表格時,表格標頭可能會沒法轉換成功
      3. 尚未具備處理編號列表行首+、底線%%%_%%%和底線加刪除線%%%%%_%%%%%的能力
      4. 可能會將非行首的 // 文字 錯誤當成註解語法(PukiWiki的註解只能放在行首)
      5. 參照/註腳語法的雙小括號((()))即使沒有成對也會被轉換成<ref>標籤
      6. 如果參照/註腳語法被刪除線包夾,雙括號當中的刪除線語法會錯誤轉換成</s>在前、<s>在後,引發參照列表錯誤
    • 編譯後的可執行檔(p2m-auto-convert)於 2017/06/16 發布

手動轉換

這邊列出手動轉換的要點。

  • 為求正確轉換,需使用正規表達式(Regular Expression,簡稱Regex)[1]
    • 與一般程式寫作不同,空格字元會被當作一般字元檢查,因此Regex中不可有任何多餘空格
    • 為對應PukiWiki碼構造,數量標記諸如任何次數標記(.*[\s\S]*尾端的*)和任何正整數次標記(.+[\s\S]+尾端的+)的後面,大部份時候需要追加一個問號(如:.*?[\s\S]+?)以搜尋「最少字數的符合項目」
      • 對於字串他出於%%無奈%%好奇開了門%%,然後他就囧掉了%%,自此學到教訓,搜尋%%.+%%時會得到%%無奈%%好奇開了門%%,然後他就囧掉了%%,單次搜尋%%.+?%%時會得到%%無奈%%,搜尋下一個時會得到%%,然後他就囧掉了%%
      • 在搜尋包夾型Puki碼時,如果不使用起始碼(.*?)終止碼而用起始碼(.*)終止碼,當同一行有多個搜尋項目時,會被錯誤地當成只有一個項目。
  • 若所使用的文字/程式語言編輯器不支援Regex的語法檢查,可使用網頁https://regex101.com/協助除錯
  • 前述的Notepad++的轉換用Python script即應用了以下絕大部份的轉換方法[2]

PukiWiki 和 MediaWiki 的語法資料

若對 PukiWiki 或 MediaWiki 語法有疑問,可參考下面網頁:

目錄與標題

  • MediaWiki目錄為自動產生,因此Puki的目錄語法#contents可以直接刪除
  • MediaWiki目錄會自動抓取頁面中的所有大小標題,並以樹狀列表排整齊
  • 在Komica形成的文化中,位於頁首的第一層標題(行首*標題)通常做為整篇文章的「真‧條目名稱」使用,因此該標題不應轉換為MediaWiki的標題語法,必須改用Template:H0包夾,以防其出現於目錄裡
  • 因上述的理由,之後的標題通常是從第2層(行首**標題)開始(有少數例外,如夢日記在舊KWiki上的內容)
  • 除了做為「真‧條目名稱」使用的標題,剩下的標題可依以下規則轉換:
    • 行首**大章節行首==大章節==
    • 行首***小章節行首===小章節===
  • MediaWiki的標題總共有5層(從雙等號包夾行首==標題==到六等號包夾行首======標題======),需要追加細分時可以使用
  • 注意:請勿在任何一般條目裡使用單等號包夾(行首=非標題=。雖然MediaWiki存在單等號包夾的語法,但它是給頁面內容之外、在頂部的頁面名稱使用。

條目內回應區或Comments頁面

  • 移動之前,請先比照一般條目的語法轉換方式處理(如項目符號轉換),可用自動轉換
    • Pukiwiki留言的時間戳記語法&new{};在MediaWiki不能用,應整個去掉
      • Regex: &new\{(.*?)\};$1
      • 雖然也有轉成<time>標籤的方式,但該標籤沒有實質作用,且MediaWiki並不會給簽名/時間戳記語法(~~~~~~~~~)自動追加該標籤
  • Comments頁面的內容,應複製貼上到條目本身的「討論」頁面,點頁面左上方的「討論」以進入
  • 條目內的回應區可選擇原地保留或移動至「討論」頁,但請勿直接捨棄
    • 如果需要移動,應比照Comments頁面的處理法,將所有內容剪下貼進「討論」頁面
    • 若要在內文追加討論頁連結,可使用「[[{{TALKPAGENAME}}]]」。此連結適合於所有條目,因為{{TALKPAGENAME}}即為內建模板「討論頁名稱」。
  • 移動完畢後,請在整塊留言上方給予一個雙等號包夾的行首==標題==,例如行首==無主題之留言==行首==雜談==……等

粗體/斜體

  • Puki和MediaWiki兩者是相反的,也就是原本的雙單引號要改成三單引號,三單引號要改成雙單引號。
    • 須注意尚有五單引號(粗斜體)的狀況。雖然五單引號可直接用於MediaWiki,但為了避免在雙單引號與三單引號的轉換過程中被動到,必須先轉成html標籤再轉回去
    • 轉換步驟如下(步驟1~3不可替換順序):
      1. 將成對五單引號'''''_'''''轉為粗斜體標籤<b><i>_</i></b>
        regex:'''''(.+?)'''''<b><i>$1<\/i><\/b>
      2. 將成對三單引號'''_'''轉為斜體標籤<i>_</i>
        regex:'''(.+?)'''<i>$1<\/i>
      3. 將成對雙單引號''_''轉為粗體標籤<b>_</b>
        regex:''(.+?)''<b>$1<\/b>
      4. <b></b>都取代為'''
      5. <i></i>都取代為''
    • 轉回多重單引號的步驟可省略,因為MediaWiki可正常使用HTML標籤

刪除線/底線

  • Puki有自家的刪除線/底線語法,分別是%%刪除線%%%%%底線%%%;MediaWiki只有HTML標籤,最短的寫法為<s>刪除線</s><u>底線</u>
    • 變化形為%%%%%刪除線加底線%%%%%,為了避免被當做「僅有刪除線」或「僅有底線」轉換,必須優先處理
    • 轉換順序如下:
      1. %%%%%刪除線加底線%%%%%轉為<s><u>刪除線加底線</u></s>
        regex:%%%%%(.+?)%%%%%<s><u>$1<\/u><\/s>
      2. %%%底線%%%轉為<u>底線</u>
        regex:%%%(.+?)%%%<u>$1<\/u>
      3. %%刪除線%%轉為<s>刪除線</s>
        regex:%%(.+?)%%<s>$1<\/s>

參照(註腳)

  • 轉換方式:(({{ref|))}}
  • 參照語法應避免使用巢狀構造(註腳中再塞其他註腳),盡可能改寫其說明,使之可以在單一參照之內完成
  • 如果在參照內容中有半形等號=且無法使用<nowiki>包夾,請在參照內容前面加上一個1=,保障後面等號不會被錯誤使用
    例:{{ref| 1= 翻譯轉自[https://forum.gamer.com.tw/C.php?bsn=26742&snA=13244 巴哈姆特]}}
  • 相同的參照內容可以做整合,方法為加入第2參數做為組別名稱({{ref|參照內容|組別名稱}}),之後出現的就只需輸入組別名稱({{ref||組別名稱}})即可
    • 同時具有參照內容和組別名稱的ref,如果參照中使用了1=,需在組別前面加上一個2=name=,否則會導致參數不正常
      例:{{ref| 1= 翻譯轉自[https://forum.gamer.com.tw/C.php?bsn=26742&snA=13244 巴哈姆特]| 2= fgo-translate-baha}}
      • 同組中只有具內容文字的才需要加2=name=,其他的都可以不用
        照上例:{{ref||fgo-translate-baha}}

外部連結

格式種類 對應語法 備註
Pukiwiki [[URL]] [[連結文字>URL]] 與內部連結構造相同
以前置的http://或https://判斷
Mediawiki [URL URL] [URL 連結文字] 中間必空一格
  • 必須根據URL部份是否從http://或https://起始,來斷定一個連結是否為外部連結
  • 使用正規表達式處理,需要照順序執行兩個步驟,不可對調[3]
    1. 處理有文字的連結:\[\[(.+?)>(https?:\/\/.*?)\]\]換成[$2 $1]
    2. 處理無文字的連結:\[\[(https?:\/\/.*?)\]\]換成[$1 $1]
  • 注意:外部連結中如果有空白字元 ,請取代為%20,以免URL被錯誤分段
    • 例如Puki的[[舊留言頁>https://wiki.komica.org/wiki5/?Comments/FrontPage 2006]]→MediaWiki的[https://wiki.komica.org/wiki5/?Comments/FrontPage%202006 舊留言頁]

內部連結

  • 一般的內部連結不用改動,但是頁面名稱和連結文字不同者需要。
    • Pukiwiki格式:[[連結文字>頁面名稱]]
    • Mediawiki格式:[[頁面名稱|連結文字]]
  • 使用正規表達式處理,有兩種狀況:
    • 未預先完成外部連結轉換時:\[\[(.+?)>((?!https?:\/\/).*?)\]\]換成[[$2|$1]]
      • (?!https?:\/\/)為否定條件的判斷式,用於剔除連結名稱以http://或https://起始的狀況
    • 已預先完成外部連結轉換時:\[\[(.+?)>(.+?)\]\]換成[[$2|$1]]

頁面標題連結

  • 頁內連結格式:[[#標題名稱]][[#標題名稱|連結文字]]
  • 跨頁連結格式:[[頁面名稱#標題名稱]][[頁面名稱#標題名稱|連結文字]]
  • PukiWiki的錨點設定語法(anchor,格式為[#錨點名稱]),在MediaWiki並沒有相對應的語法
    • 折衷方法是,在標題的前面使用<span id="錨點名稱"></span>。此方法於標題較長的時候適用,此後把以上的「標題名稱」以「錨點名稱」代替即可。
    • 上述的方法在KomicaWiki已經製作成模板Template:Anchor,可以簡化為{{anchor|<錨點名稱>}}
  • 連結中的「標題名稱」必須手動修改,無法以任何形式的自動取代達成

引用區塊(縮排)

  • Puki語法為區塊內每行行首1~3個>、減少層級或結束時為行首的1~3個<
  • 轉換時必須先觀察整個區塊的上一行是否為列表項目,才能決定如何轉換
    • 當該行為空行,或非列表項目時,可以直接將區塊裡的行首>換成:
    • 當該行為列表項目時,則必須在區塊內每一行插入該行的項目符號於行首,再把之後的>換成:
  • 區塊尾端的<直接連同換行一起清除即可

範例

原本 pukiwiki 內容 改成 Mediawiki 預覽
無項目符號時
上一行
> 引用區塊開始
>> 引用區塊第二層
>>> 引用區塊第三層
>> 引用區塊第二層
> 引用區塊結束
<
下一行
上一行
: 引用區塊開始
:: 引用區塊第二層
::: 引用區塊第三層
:: 引用區塊第二層
: 引用區塊結束
下一行
上一行
引用區塊開始
引用區塊第二層
引用區塊第三層
引用區塊第二層
引用區塊結束

下一行

有項目符號時
-上兩行
-+上一行
> 引用區塊開始
>> 引用區塊第二層
>>> 引用區塊第三層
>> 引用區塊第二層
> 引用區塊結束
<
-+下一行
*上兩行
*#上一行
*#: 引用區塊開始
*#:: 引用區塊第二層
*#::: 引用區塊第三層
*#:: 引用區塊第二層
*#: 引用區塊結束
*#下一行
  • 上兩行
    1. 上一行
      引用區塊開始
      引用區塊第二層
      引用區塊第三層
      引用區塊第二層
      引用區塊結束
    2. 下一行

項目符號

  • 基礎代換方式:行首的- 換成 *+ 換成 #,PukiWiki裡一行最多3個
    • 注意----是分隔線、不是項目符號,不需轉換
  • 每兩項之間不可有空行,必須緊貼上一行,否則項目符號會顯示異常
    • 因為當初在PukiWiki時的排版需求,許多項目中間存在著空行或換行符號;來到MediaWiki後,空行不再具有排版作用,所以需要編輯者手動清理
  • 如果有需求必須與上一層項目斷開多行,則改成 行首:* 這種加入縮排的格式,上一個項目每多一層就在左端多一加個冒號,之後的項目就照原來的方式追加
    • 使用縮排前請先嘗試以換行標籤<br>解決,真的有需要時再使用
    • 只有在項目符號全部為圖案(*)時才適用,否則編號會無法正確計算[4]

範例

狀況 說明 原本 pukiwiki 內容 改成 Mediawiki 預覽
無空行無編號 照一般方式轉換即可
- 第一層
-- 第二層
--- 第三層
- 又回到第一層
* 第一層
** 第二層
*** 第三層
* 又回到第一層
  • 第一層
    • 第二層
      • 第三層
  • 又回到第一層
無空行有編號 照一般方式轉換即可
- 第一層
-+ 第二層
-+- 第三層
-+ 第二層
-+ 第二層
-+- 第三層
* 第一層
*# 第二層
*#* 第三層
*# 第二層
*# 第二層
*#* 第三層
  • 第一層
    1. 第二層
      • 第三層
    2. 第二層
    3. 第二層
      • 第三層
有間隔行,可清除時 必須手動清理多餘空行,否則
項目符號或編號會異常,如下:
  • 第一層
    • 第二層
    • 第二層
- 第一層
-- 第二層
--- 第三層
- 又回到第一層

-- 第二層
* 第一層
** 第二層
*** 第三層
* 又回到第一層
** 第二層
  • 第一層
    • 第二層
      • 第三層
  • 又回到第一層
    • 第二層
有間隔行,但不可清除時 如果因為中間有圖片或表格,非得與上一項目空多行不可時,需改用:*形式:
- 第一層
-- 第二層
--- 第三層
-- 回到第二層
|~我是表格|礙事的表格|
-- 第二層的處理方式
--- 之後的部份
* 第一層
** 第二層
*** 第三層
** 回到第二層
{|class="wikitable"
!我是表格
|礙事的表格
|}
:* 第二層的處理方式
:** 之後的部份
  • 第一層
    • 第二層
      • 第三層
    • 回到第二層
我是表格 礙事的表格
  • 第二層的處理方式
    • 之後的部份

表格

  • MediaWiki語法中,表格以行首{|起始,以行首|}結束
    • 表格起點{|前面可加入任意數量的縮排符號:,但項目符號*與編號#皆不可使用
    • 首行的{|後面可以加入class和style屬性
      • 通常表格都建議加入class="wikitable" style="margin:auto;",以套用MediaWiki預設的表格樣式,並使表格如PukiWiki預設一般置中
  • 每一個新列以行首|-為開頭,首列的可以省略
    • 行首|-後方可以加入style屬性,給予整列自訂格式
  • 標題儲存格(th)語法在Puki為|~內容|,對應MediaWiki語法為行首!內容
    • 須注意後方無空格的、直接連著||~|~|)並非標題儲存格,而是儲存格的多列合併語法,這個狀況無法利用單純的regex取代轉換
  • 一般儲存格(td)在MediaWiki語法為行首|內容,因此直接換行即可
    • 注意,如果Puki碼的儲存格內容是以「-」或「}」為開頭,請務必在前面空一格(行首| -行首| }),以免被當作換列或表格結束指令
  • 在PukiWiki,儲存格欄合併語法為|>|(併至右方欄)、列合併語法為|~|(併至上方列);在MediaWiki,需要根據合併後總數在儲存格最左上的位置內加入colspan或/和rowspan屬性
  • PukiWiki的格式標記(LEFT:CENTER:RIGHT:COLOR(顏色碼):BGCOLOR(顏色碼):SIZE(字型大小):),需要改為儲存格的style屬性值(text-align:color:顏色碼background-color:顏色碼font-size:字型大小px

範例

類型 原本 pukiwiki 內容 改成 Mediawiki 預覽
儲存格樣式代換
|~COLOR(red):紅色標題|~標題|
|CENTER:內容|COLOR(blue):藍色內容|
{| class="wikitable" style="margin:auto;"
|-
! style="color: red;" | 紅色標題
! 標題
|-
| style="text-align: center;"|內容
| style="color: blue;" | 藍色內容
|}
紅色標題 標題
內容 藍色內容
儲存格合併
|-|~th|~th|~th|~th|~th|~th|
|共佔2列|td|td|td|td|td|td|
|~|>|>|>|>|>|共佔6欄|
{| class="wikitable" style="margin:auto;"
|-
| -
! th
! th
! th
! th
! th
! th
|-
| rowspan = "2" | 共佔2列
| td
| td
| td
| td
| td
| td
|-
| colspan="6" |共佔6欄 
|}
- th th th th th th
共佔2列 td td td td td td
共佔6欄

插入圖片

  • PukiWiki的語法為
    #imgr(圖片路徑與名稱,尺寸或縮放百分比,對齊方向left/center/right,文繞圖nowrap/wrap,外框around,圖片說明文字)
    &imgr(格式同#imgr);
    例如:#imgr(../pix/img17859.png,65%,right,wrap,around,這是一張圖)
    • 當中僅有圖片路徑名稱是必要項目,其餘都是選擇性;選擇性項目內容未符合任一參數格式(如56%、left、around)時,會被當成圖片說明文字處理
  • 圖片路徑與名稱部份,僅取最後一個「/」之後的檔名保留,其餘URL或資料夾部份需捨去
    • 例:#imgr(../pix/img21658.jpg,300x200,right,around)[[File:img21658.jpg|300x200px|right]]
  • 要轉換成MediaWiki,必須了解這些PukiWiki的參數項目與MediaWiki的有何對應關係,可以參考下方表格
    • 由於對應方式複雜,此狀況不適合用單純的Regex取代處理
imgr參數 對應File:參數 備註
left around none MediaWiki只允許靠左時取消文繞圖設定
left+around left KomicaWiki環境下為罕用設定,因為使用時圖片會遮住項目符號
left center right
center
center+around
center 不論PukiWiki還是MediaWiki,都不支援置中兼文繞圖
right
right+around
right MediaWiki靠右時不可取消文繞圖,有需要時請在圖片後插入{{clr}}
widthxheight widthxheightpx width和height為整數
可只指定其中一項:widthpx / xheightpx
nnn.n%(nnn.n為數字) MediaWiki不支援縮放比例,除非利用原圖計算出圖片寬度,否則此項必須捨棄
nowrap 不加參數
frameless
wrap thumb MediaWiki需在thumb模式下才會顯示圖片說明文字,其他模式會變成只在滑鼠停駐時出現的浮動文字
nolink link= MediaWiki必須輸入link=並將其值留空,才能對應nolink

換行標記

  • 轉換方式:&br;#br~行尾<br>
    • 需注意,如果是~行尾的狀況,除非下一行是標頭、表格、列表或引用區塊,不然需把後面的換行(字元)也跟著清除

文字顏色、大小(&color(){};、&COLOR(){}、&size(){};)

  • MediaWiki原生語法並不存在對應的轉換方式,因此需使用額外設計的模板{{color}}{{censored}}{{size}}
  • &color(文字色,背景色){文字內容};&COLOR(文字色,背景色){文字內容}{{color|文字色|背景色|文字內容}}
    • Puki碼的背景色,開頭必有一個逗點;沒有逗點時,該顏色值必定是文字色
    • 轉換成{{color}}時,Puki碼缺少的項目可以留空,但不可省略|符號
      • 例如:&color(,pink){文字};{{color||pink|文字}}
    • 如果文字色和背景色都是黑色(black#000#000000)時,可轉換為{{censored}}而不用加顏色值
      • 例如:&color(black,#000000){文字};{{censored|文字}}
  • &size(文字大小){文字內容};&SIZE(文字大小){文字內容}{{size|文字大小|文字內容}}
    • 不論是PukiWiki還是MediaWiki,文字大小都是以px為單位

註解(非顯示文字)

  • 只有在編輯模式下能看見的文字,不對顯示內容造成任何影響
  • PukiWiki的註解為行首// 註解文字只能放在行首
  • MediaWiki的註解只能使用HTML標籤<!-- -->,但不限於放在行首
  • 轉換方式:行首// 註解文字<!-- 註解文字 -->
    • regex:(^|\n)\/\/(.*)$1<!--$2-->

其他

連續波浪號

  • 在PukiWiki中,非行尾的連續「~」並不具備任何意義;但在MediaWiki中,3個以上會被視為插入簽名/時間戳記。為避免錯誤轉換,需要使用<nowiki></nowiki>標籤包夾才行
    • regex:(~{3,})<nowiki>$1<\/nowiki>

備註

  1. 部份編輯器不使用$1、$2表示被()抓取的文字,而是使用\1、\2。關於此點,請參考您使用的編輯器說明書
  2. Notepad用的運算式搜尋取代,其Regex語法與Python原生的Regex不同,具有許多自訂的關鍵字,能做更多變化。(例如:Notepad++專用Regex裡,取代字串可用(?{4}ab$5dc)代表「若$4存在則取代為ab$5dc」;在Python原生Regex裡,則要用迴圈逐個搜尋、判斷,再行取代)
  3. 例如[[http://abcd>http://google.com]]的狀況,如果先執行第2步驟「處理無文字的連結」,會被錯誤轉換成[http://abcd>http://google.com http://abcd>http://google.com]。
  4. 例如在行首*#下一行用行首*#*行首*##時,觀察原始碼時可以看到標準HTML列表具有的<ul><li>或<ol><li>巢狀結構;然而使用行首::*行首::#時,卻會看到縮排標籤<dl><dd>,與上一行沒有形成巢狀構造,不能成為完整的列表