/[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.7 - (show annotations) (download) (as text)
Wed Oct 29 06:26:42 2008 UTC (17 years, 8 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +3 -5 lines
File MIME type: application/javascript
make

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 while (true) {
173 if (!parent.parentNode) break;
174 var ln = parent.nodeName.toLowerCase ();
175 if (ln == 'tr' /*|| ln == 'tbody' || ln == 'thead' || ln == 'tfoot' ||
176 ln == 'table'*/ || ln == 'pre') {
177 prev = parent;
178 parent = parent.parentNode;
179 } else {
180 break;
181 }
182 }
183 parent.insertBefore (insertedElement, prev.nextSibling);
184 } // insertInterfaceElement
185
186 function applyJaUpdates (updates) {
187 for (var hash in updates) {
188 if (document.jaHashes[hash]) {
189 for (var i in document.jaHashes[hash]) {
190 applyJaEntry (document.jaHashes[hash][i], updates[hash]);
191 }
192 }
193 if (document.jaRealHashes[hash]) {
194 for (var i in document.jaRealHashes[hash]) {
195 applyJaEntry (document.jaRealHashes[hash][i], updates[hash]);
196 }
197 }
198 }
199 } // applyJaUpdates
200
201 function applyJaEntry (targetNode, entry) {
202 if (entry.isPattern || targetNode.nodeName == 'TR' /* find.cgi */) {
203 targetNode.className += ' ja-not-patched';
204 } else {
205 var en;
206 var cn = targetNode.childNodes;
207 for (var i = 0; i < cn.length; i++) {
208 var n = cn[i];
209 if (n.className && n.className.match (/\bja-translation\b/)) {
210 var prefix;
211 if (n.firstChild && n.firstChild.className == 'secno') {
212 prefix = n.firstChild;
213 }
214 n.innerHTML = formatJaText (entry.ja);
215 if (prefix) n.insertBefore (prefix, n.firstChild);
216 targetNode.className += ' ja-patched';
217 return;
218 } else if (n.className && n.className.match (/\ben-original\b/)) {
219 en = n;
220 }
221 }
222
223 var span = document.createElement ('span');
224 span.className = 'ja-translation';
225 var prefix;
226 if (en.firstChild && en.firstChild.className == 'secno') {
227 prefix = en.firstChild.cloneNode (true);
228 }
229 span.innerHTML = formatJaText (entry.ja);
230 if (prefix) span.insertBefore (prefix, span.firstChild);
231 targetNode.appendChild (span);
232 targetNode.className
233 = targetNode.className.replace
234 (/\bno-ja-translation\b/, 'has-ja-translation ja-patched');
235 }
236 } // applyJaEntry
237
238 function formatJaText (s) {
239 return s.replace
240 (/\[\[([A-Z ]+):([^\]]+)\]\]/g,
241 function (a, b, c) {
242 return "<em class=rfc2119 title=\"" + b + "\">" + c + "</em>";
243 });
244 } // formatJaText
245
246 /*
247 Author: Wakaba <[email protected]>.
248 License: Copyright 2008 Wakaba. You are granted a license to use,
249 reproduce and create derivative works of this script.
250 $Date: 2008/10/27 04:52:39 $
251 */

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24