1//	DokuWikiのWikiスタイル書体補完スクリプト
2//		Wiki-Style Script
3//		hGcl_Wiki_Style.js
4//			version 2.1
5//			2019 / 01 / 11
6//
7//	2019 ひぃ(Hir)/ワタアメ
8//	Twitter : @Hir_gca
9//
10//	使用方法
11//	htmlファイルの<head>~</head>内に
12//	このスクリプトファイルを呼び出す構文を書いてください。
13//	下記の関数は読み込みが完了した時に実行されます。
14//	※補足(この行の文責:HokkaidoPerson[北海道ゆっくり放送]):このプラグインでは何もしなくてもスクリプトが自動的に読み込まれます。
15//
16//	\//と入力すると「//」と出力します。
17//	://は変換されません
18//
19//	**太字**、//斜体//、__下線付き__、''等幅''がご利用頂けます
20//
21//
22//	$[hdcolor $\HTMLの色コード$\$]~$[/hdcolor$]は<font color="HTMLの色コード">~</font>と同じ働きをします。
23//		(<textarea>~</textarea>間と<pre>~</pre>間には適用されません)
24// 		※補足(この行の文責:HokkaidoPerson[北海道ゆっくり放送]):上記に加え、クラス「wss-nowiki-section」「diff」、及び<form>~</form>間にも適用されません。
25//
26//
27//	利用規約
28//	・本条文は日本語のもと解釈されます。
29//	・著作者(ひぃ(Hir)/ワタアメ)は予告なく本条文を変更できるものとします。
30//	・本スクリプトを使用した際に起こった損害につきましては、当方では一切責任をとりかねます。
31//	・権利詐称、無断転載、無断販売については厳禁です。
32//	・改変しての二次配布につきましては、この文章を含めた上記の文すべてを説明書または本スクリプトファイルに
33//	 必ず記述してください。
34//
35//
36//	[Translated and supplemented by HokkaidoPerson]
37//	The script to complement DokuWiki syntax
38//		Wiki-Style Script
39//		hGcl_Wiki_Style.js
40//			version 2.1
41//			2019 / 01 / 11
42//
43//	2019 Hir/wataame
44//	Twitter : @Hir_gca
45//
46//	How to Use
47//	Call this script in <head>-</head> of html files.
48//	The following functions will be run when the browser completed loading pages.
49//	* In this plugin, the script will be loaded without doing anything special.
50//
51//	"\// " will be "//"
52//	"://" won't be converted.
53//
54//	**Bold**, //italic//, __underlined__, ''monospaced'' characters available.
55//
56//
57//	$[hdcolor $\HTML color code$\$]~$[/hdcolor$] equals to <font color="HTML color code">~</font>
58//		(Unavailable in <textarea>-</textarea>, <pre>-</pre>, <form>~</form>, and the class "wss-nowiki-section" and "diff")
59//
60//
61//	The license
62//	・This license is interpreted in Japanese above.
63//	・An author of this script, Hir/wataame, can change this license without notice.
64//	・The author won't foot the bill for your loss when you use this script.
65//	・Fabricating the rights of this script, and unauthorized copying and selling this script are strictly prohibited.
66//	・When you'll distribute forks of this script, you must write all these sentences including this license on manuals or the script files you'll distribute.
67//
68//
69
70//	自動実行用 / To run the functions automatically
71document.addEventListener("DOMContentLoaded", wikiStyle);
72
73
74//	変換用テーブル / Tables for converting
75var StyleArray = new Array(
76	'//',		//	斜体 / Italic
77	'**',		//	太字 / Bold
78	'__',		//	下線 / Underlined
79	'\'\''		//	等幅 / Monospaced
80);
81var ConvertArray = new Array(
82	'em',		//	斜体 / Italic
83	'strong',	//	太字 / Bold
84	'u',		//	下線 / Underlined
85	'code'		//	等幅 / Monospaced
86);
87
88function wikiStyle(){
89	var bodyInnerHTML	= document.body.innerHTML;
90	var HeaderSplit;
91	var result;
92	var k;
93
94	//	textareaタグのデータを保持する / Preserve datas in <textarea>
95	var TextareaBoxs	= document.getElementsByTagName('textarea');
96	var TextareaStrs	= new Array(TextareaBoxs.length);
97
98	for(k=0;k<TextareaBoxs.length;k++){
99		TextareaStrs[k] = TextareaBoxs[k].innerHTML;
100	}
101
102	//	preタグのデータを保持する / Preserve datas in <pre>
103	var PreBoxs	= document.getElementsByTagName('pre');
104	var PreStrs	= new Array(PreBoxs.length);
105
106	for(k=0;k<PreBoxs.length;k++){
107		PreStrs[k] = PreBoxs[k].innerHTML;
108	}
109
110	//	wss-nowiki-selectionクラスのデータを保持する  / Preserve datas in the class "wss-nowiki-section"
111	var WSSNoWikiBoxs	= document.getElementsByClassName('wss-nowiki-section');
112	var WSSNoWikiStrs	= new Array(WSSNoWikiBoxs.length);
113
114	for(k=0;k<WSSNoWikiBoxs.length;k++){
115		WSSNoWikiStrs[k] = WSSNoWikiBoxs[k].innerHTML;
116	}
117
118	//	diffクラスのデータを保持する / Preserve datas in the class "diff"
119	var DiffBoxs	= document.getElementsByClassName('diff');
120	var DiffStrs	= new Array(DiffBoxs.length);
121
122	for(k=0;k<DiffBoxs.length;k++){
123		DiffStrs[k] = DiffBoxs[k].innerHTML;
124	}
125
126	//	formタグのデータを保持する / Preserve datas in <form>
127	var FormBoxs	= document.getElementsByTagName('form');
128	var FormStrs	= new Array(FormBoxs.length);
129
130	for(k=0;k<FormBoxs.length;k++){
131		FormStrs[k] = FormBoxs[k].innerHTML;
132	}
133
134	//	とりあえずbody全体の$[、$]、$\を<、>、'に変換する / Well, let's convert $[, $], and $\ to <, >, and ' in the whole body tag
135	HeaderSplit = bodyInnerHTML.split('$\\');
136	bodyInnerHTML = HeaderSplit[0];
137	for(k=1;k<HeaderSplit.length;k++){
138		bodyInnerHTML += '\'' + HeaderSplit[k];
139	}
140	HeaderSplit = bodyInnerHTML.split('$[');
141	bodyInnerHTML = HeaderSplit[0];
142	for(k=1;k<HeaderSplit.length;k++){
143		bodyInnerHTML += '<' + HeaderSplit[k];
144	}
145	HeaderSplit = bodyInnerHTML.split('$]');
146	bodyInnerHTML = HeaderSplit[0];
147	for(k=1;k<HeaderSplit.length;k++){
148		bodyInnerHTML += '>' + HeaderSplit[k];
149	}
150
151	//変換して生成された<hdcolor>、</hdcolor>を更に変換 / Then convert <hdcolor> and </hdcolor> generated by the script above
152	HeaderSplit = bodyInnerHTML.split('<hdcolor');
153	bodyInnerHTML = HeaderSplit[0];
154	for(k=1;k<HeaderSplit.length;k++){
155		bodyInnerHTML += '<font color=' + HeaderSplit[k];
156	}
157	HeaderSplit = bodyInnerHTML.split('</hdcolor');
158	bodyInnerHTML = HeaderSplit[0];
159	for(k=1;k<HeaderSplit.length;k++){
160		bodyInnerHTML += '</font' + HeaderSplit[k];
161	}
162
163	HeaderSplit = bodyInnerHTML.split('://');
164	bodyInnerHTML = HeaderSplit[0];
165	for(k=1;k<HeaderSplit.length;k++){
166		bodyInnerHTML += ':\\//' + HeaderSplit[k];
167	}
168
169	bodyInnerHTML = bodyInnerHTML.replace("/\".+__.+\"/g","\0001\0001");
170	for(i=0;i<StyleArray.length;i++){
171		if(i == 2) continue;
172		HeaderSplit = bodyInnerHTML.split('\\' + StyleArray[i]);
173		bodyInnerHTML = HeaderSplit[0];
174		for(k=1;k<HeaderSplit.length;k++){
175			bodyInnerHTML += '&#x2065;&#x2065;' + HeaderSplit[k];
176		}
177
178		HeaderSplit = bodyInnerHTML.split(StyleArray[i]);
179		result = HeaderSplit[0];
180
181		for(k=1;k<HeaderSplit.length;k++){
182			result += '<' + (k%2==0?'/':'') + ConvertArray[i] + '>' + HeaderSplit[k];
183		}
184		bodyInnerHTML = result;
185
186		HeaderSplit = bodyInnerHTML.split('&#x2065;&#x2065;');
187		bodyInnerHTML = HeaderSplit[0];
188		for(k=1;k<HeaderSplit.length;k++){
189			bodyInnerHTML += StyleArray[i] + HeaderSplit[k];
190		}
191	}
192
193	document.body.innerHTML = bodyInnerHTML;
194
195	TagsUnder();
196
197	//	textareaタグのデータを戻す / Restore datas in <textarea>
198	for(k=0;k<TextareaBoxs.length;k++){
199		TextareaBoxs[k].innerHTML = TextareaStrs[k];
200	}
201
202	//	preタグのデータを戻す / Restore datas in <pre>
203	for(k=0;k<PreBoxs.length;k++){
204		PreBoxs[k].innerHTML = PreStrs[k];
205	}
206
207	//	wss-nowiki-selectionクラスのデータを戻す / Restore datas in the class "wss-nowiki-section"
208	for(k=0;k<WSSNoWikiBoxs.length;k++){
209		WSSNoWikiBoxs[k].innerHTML = WSSNoWikiStrs[k];
210	}
211
212	//	diffクラスのデータを戻す / Restore datas in the class "diff"
213	for(k=0;k<DiffBoxs.length;k++){
214		DiffBoxs[k].innerHTML = DiffStrs[k];
215	}
216
217	//	formタグのデータを戻す / Restore datas in <form>
218	for(k=0;k<FormBoxs.length;k++){
219		FormBoxs[k].innerHTML = FormStrs[k];
220	}
221}
222
223function TagsUnder(){
224	var bodyInnerHTML	= document.body.innerHTML;
225	var Headers;
226	var i;
227	var j;
228	var k;
229	var HeaderSplit;
230	var result;
231
232	for(i=1;i<=6;i++){
233		Headers = document.getElementsByTagName('h' + i);
234		for(j=0;j<Headers.length;j++){
235			result = Headers[j].innerHTML;
236
237			HeaderSplit = result.split(StyleArray[2]);
238			result = HeaderSplit[0];
239
240			for(k=1;k<HeaderSplit.length;k++){
241				result += '<' + (k%2==0?'/':'') + ConvertArray[2] + '>' + HeaderSplit[k];
242			}
243
244			Headers[j].innerHTML = result;
245		}
246		Headers = document.getElementsByClassName('level' + i);
247		for(j=0;j<Headers.length;j++){
248			result = Headers[j].innerHTML;
249
250			HeaderSplit = result.split(StyleArray[2]);
251			result = HeaderSplit[0];
252
253			for(k=1;k<HeaderSplit.length;k++){
254				result += '<' + (k%2==0?'/':'') + ConvertArray[2] + '>' + HeaderSplit[k];
255			}
256
257			Headers[j].innerHTML = result;
258		}
259	}
260	Headers = document.getElementsByTagName('p');
261	for(j=0;j<Headers.length;j++){
262		result = Headers[j].innerHTML;
263
264		HeaderSplit = result.split(StyleArray[2]);
265		result = HeaderSplit[0];
266
267		for(k=1;k<HeaderSplit.length;k++){
268			result += '<' + (k%2==0?'/':'') + ConvertArray[2] + '>' + HeaderSplit[k];
269		}
270
271		Headers[j].innerHTML = result;
272	}
273}
274