/[suikacvs]/markup/html/html5/spec-ja/ja-script.js
Suika

Contents of /markup/html/html5/spec-ja/ja-script.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (show annotations) (download) (as text)
Mon Oct 27 04:52:39 2008 UTC (17 years, 8 months ago) by wakaba
Branch: MAIN
Changes since 1.5: +20 -7 lines
File MIME type: application/javascript
Find script revised for new data format

1 window.addEventListener ('load', function () {
2 createJaHashIndex ();
3
4 var req = new XMLHttpRequest ();
5 req.open ('GET', 'edit2/updates.json', true);
6 req.onreadystatechange = function () {
7 if (req.readyState == 4) {
8 if (req.status >= 200 && req.status < 400) {
9 applyJaUpdates (eval ('(' + req.responseText + ')'));
10 }
11 }
12 }; // onreadystatechange
13 req.send (null);
14 }, false); // window.onload
15
16 document.documentElement.ondblclick = function (event) {
17 var container = getEJContainer (event.target);
18 if (container && !container.jaForm) {
19 insertJaForm (container);
20 return false;
21 }
22
23 return true;
24 }; // document.documentElement.ondblclick
25
26 function createJaHashIndex () {
27 var hash = [];
28 var realHash = [];
29
30 var all = document.getElementsByTagName ('*');
31 var allL = all.length;
32 for (var i = 0; i < allL; i++) {
33 var el = all[i];
34 var hashValue = el.getAttribute ('data-ja-hash');
35 if (hashValue) {
36 if (!hash[hashValue]) hash[hashValue] = [];
37 hash[hashValue].push (el);
38
39 hashValue = el.getAttribute ('data-ja-real-hash');
40 if (!realHash[hashValue]) realHash[hashValue] = [];
41 realHash[hashValue].push (el);
42 }
43 }
44
45 document.jaHashes = hash;
46 document.jaRealHashes = realHash;
47 } // createJaHashIndex
48
49 function getEJContainer (n) {
50 while (n) {
51 if (n.hasAttribute && n.hasAttribute ('data-ja-hash')) {
52 return n;
53 }
54 n = n.parentNode;
55 }
56 return null;
57 } // getEJContainer
58
59 function insertJaForm (targetNode) {
60 var form = document.createElement ('div');
61 form.className = 'ja-edit-form';
62
63 form.innerHTML = "<p><label>Original text:<br><textarea name=en></textarea></label><br>\
64 (<label><input name=pattern type=checkbox> Pattern</label><span> <button type=button>Load original text</button></span>)\
65 <p><label>Translated text:<br><textarea name=ja></textarea></label><p><label>Tags:<br><textarea name=tags></textarea></label><p><button type=button class=ja-save-button>Save and close</button> <button type=button class=ja-close-button>Close</button> (<output>Text not loaded yet</output>; see also <a href='edit/#license'>license</a>)";
66
67 form.onchange = function () {
68 form.jaFormChanged = true;
69 }; // form.onchange
70
71 form.onsubmit = function () {
72 form.jaFormChanged = false;
73 }; // form.onsubmit
74
75 if (!targetNode.hasAttribute ('data-ja-real-hash')) {
76 form.getElementsByTagName ('span')[0].setAttribute ('hidden', '');
77 }
78
79 form.getElementsByTagName ('button')[0].onclick = function () {
80 if (!form.jaFormChanged ||
81 confirm ('Changes are discarded.')) {
82 loadTextByHash (form, targetNode.getAttribute ('data-ja-real-hash'));
83 }
84 }; // "Load real text".onclick
85
86 form.getElementsByTagName ('button')[1].disabled = true; // Submit
87 form.getElementsByTagName ('button')[1].onclick = function () {
88 if (!form.jaFormChanged) {
89 form.getElementsByTagName ('output')[0].firstChild.data
90 = 'Text not modified.';
91 return;
92 }
93
94 var v = '';
95
96 var ta = form.getElementsByTagName ('textarea');
97 v += 'en=' + encodeURIComponent (ta[0].value);
98 v += '&ja=' + encodeURIComponent (ta[1].value);
99 v += '&tags=' + encodeURIComponent (ta[2].value);
100
101 var isPattern = form.getElementsByTagName ('input')[0].checked;
102 if (isPattern) {
103 v += '&pattern=on';
104 }
105
106 form.getElementsByTagName ('output')[0].firstChild.data
107 = 'Saving...';
108
109 var req = new XMLHttpRequest ();
110 req.open ('POST', 'edit2/', true);
111 req.onreadystatechange = function () {
112 if (req.readyState == 4) {
113 form.getElementsByTagName ('output')[0].firstChild.data
114 = 'Save: ' + req.status + ' ' + req.statusText;
115 if (req.status >= 200 && req.status < 400) {
116 targetNode.jaForm = null;
117 form.style.display = 'none';
118 setTimeout (function () {
119 form.parentNode.removeChild (form);
120 applyJaUpdates (eval ('(' + req.responseText + ')'));
121 }, 100);
122 }
123 }
124 }; // onreadystatechange
125 req.setRequestHeader
126 ('Content-Type', 'application/x-www-form-urlencoded');
127 req.send (v);
128 }; // "Save and close".onclick
129
130 form.getElementsByTagName ('button')[2].onclick = function () {
131 if (!form.jaFormChanged ||
132 confirm ('Changes are discarded.')) {
133 targetNode.jaForm = null;
134 form.parentNode.removeChild (form);
135 }
136 }; // "Close".onclick
137
138 targetNode.jaForm = form;
139 insertInterfaceElement (form, targetNode);
140
141 var hash = targetNode.getAttribute ('data-ja-hash');
142 loadTextByHash (form, hash);
143 } // insertJaForm
144
145 function loadTextByHash (form, hash) {
146 var req = new XMLHttpRequest ();
147 req.open ('GET', 'edit2/' + hash + '.json', true);
148 req.onreadystatechange = function () {
149 if (req.readyState == 4) {
150 form.getElementsByTagName ('output')[0].firstChild.data
151 = 'Load: ' + req.status + ' ' + req.statusText;
152 if (req.status >= 200 && req.status < 400) {
153 var entry = eval ("(" + req.responseText + ")");
154
155 form.getElementsByTagName ('button')[1].disabled = false; // Submit
156
157 form.getElementsByTagName ('textarea')[0].value = entry.en;
158 form.getElementsByTagName ('textarea')[1].value = entry.ja || '';
159 form.getElementsByTagName ('textarea')[2].value = entry.tags.join ("\n");
160 form.getElementsByTagName ('input')[0].checked = entry.isPattern;
161
162 form.jaFormChanged = false;
163 }
164 }
165 }; // onreadystatechange
166 req.send (null);
167 } // loadTextByHash
168
169 function insertInterfaceElement (insertedElement, contextElement) {
170 var parent = contextElement.parentNode;
171 var prev = contextElement;
172 /*
173 while (true) {
174 if (!parent.parentNode) break;
175 var ln = parent.nodeName.toLowerCase ();
176 if (ln == 'tr' || ln == 'tbody' || ln == 'thead' || ln == 'tfoot' ||
177 ln == 'table' || ln == 'pre') {
178 prev = parent;
179 parent = parent.parentNode;
180 } else {
181 break;
182 }
183 }
184 */
185 parent.insertBefore (insertedElement, prev.nextSibling);
186 } // insertInterfaceElement
187
188 function applyJaUpdates (updates) {
189 for (var hash in updates) {
190 if (document.jaHashes[hash]) {
191 for (var i in document.jaHashes[hash]) {
192 applyJaEntry (document.jaHashes[hash][i], updates[hash]);
193 }
194 }
195 if (document.jaRealHashes[hash]) {
196 for (var i in document.jaRealHashes[hash]) {
197 applyJaEntry (document.jaRealHashes[hash][i], updates[hash]);
198 }
199 }
200 }
201 } // applyJaUpdates
202
203 function applyJaEntry (targetNode, entry) {
204 if (entry.isPattern || targetNode.nodeName == 'TR' /* find.cgi */) {
205 targetNode.className += ' ja-not-patched';
206 } else {
207 var en;
208 var cn = targetNode.childNodes;
209 for (var i = 0; i < cn.length; i++) {
210 var n = cn[i];
211 if (n.className && n.className.match (/\bja-translation\b/)) {
212 var prefix;
213 if (n.firstChild && n.firstChild.className == 'secno') {
214 prefix = n.firstChild;
215 }
216 n.innerHTML = formatJaText (entry.ja);
217 if (prefix) n.insertBefore (prefix, n.firstChild);
218 targetNode.className += ' ja-patched';
219 return;
220 } else if (n.className && n.className.match (/\ben-original\b/)) {
221 en = n;
222 }
223 }
224
225 var span = document.createElement ('span');
226 span.className = 'ja-translation';
227 var prefix;
228 if (en.firstChild && en.firstChild.className == 'secno') {
229 prefix = en.firstChild.cloneNode (true);
230 }
231 span.innerHTML = formatJaText (entry.ja);
232 if (prefix) span.insertBefore (prefix, span.firstChild);
233 targetNode.appendChild (span);
234 targetNode.className
235 = targetNode.className.replace
236 (/\bno-ja-translation\b/, 'has-ja-translation ja-patched');
237 }
238 } // applyJaEntry
239
240 function formatJaText (s) {
241 return s.replace
242 (/\[\[([A-Z ]+):([^\]]+)\]\]/g,
243 function (a, b, c) {
244 return "<em class=rfc2119 title=\"" + b + "\">" + c + "</em>";
245 });
246 } // formatJaText
247
248 /*
249 Author: Wakaba <[email protected]>.
250 License: Copyright 2008 Wakaba. You are granted a license to use,
251 reproduce and create derivative works of this script.
252 $Date:$
253 */

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24