/[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 - (hide 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 wakaba 1.3 window.addEventListener ('load', function () {
2 wakaba 1.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 wakaba 1.4 applyJaUpdates (eval ('(' + req.responseText + ')'));
10 wakaba 1.2 }
11     }
12     }; // onreadystatechange
13     req.send (null);
14 wakaba 1.3 }, false); // window.onload
15 wakaba 1.2
16 wakaba 1.1 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 wakaba 1.2 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 wakaba 1.1 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 wakaba 1.2 var form = document.createElement ('div');
61     form.className = 'ja-edit-form';
62 wakaba 1.1
63 wakaba 1.2 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 wakaba 1.6 <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 wakaba 1.1
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 wakaba 1.2 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 wakaba 1.1
86 wakaba 1.2 form.getElementsByTagName ('button')[1].disabled = true; // Submit
87 wakaba 1.1 form.getElementsByTagName ('button')[1].onclick = function () {
88 wakaba 1.2 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 wakaba 1.6 form.getElementsByTagName ('output')[0].firstChild.data
107     = 'Saving...';
108    
109 wakaba 1.2 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 wakaba 1.6 form.style.display = 'none';
118     setTimeout (function () {
119     form.parentNode.removeChild (form);
120     applyJaUpdates (eval ('(' + req.responseText + ')'));
121     }, 100);
122 wakaba 1.2 }
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 wakaba 1.1 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 wakaba 1.2 insertInterfaceElement (form, targetNode);
140 wakaba 1.1
141     var hash = targetNode.getAttribute ('data-ja-hash');
142 wakaba 1.2 loadTextByHash (form, hash);
143     } // insertJaForm
144    
145     function loadTextByHash (form, hash) {
146 wakaba 1.1 var req = new XMLHttpRequest ();
147     req.open ('GET', 'edit2/' + hash + '.json', true);
148     req.onreadystatechange = function () {
149     if (req.readyState == 4) {
150 wakaba 1.2 form.getElementsByTagName ('output')[0].firstChild.data
151     = 'Load: ' + req.status + ' ' + req.statusText;
152 wakaba 1.1 if (req.status >= 200 && req.status < 400) {
153     var entry = eval ("(" + req.responseText + ")");
154    
155 wakaba 1.2 form.getElementsByTagName ('button')[1].disabled = false; // Submit
156 wakaba 1.1
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 wakaba 1.2 form.jaFormChanged = false;
163 wakaba 1.1 }
164     }
165     }; // onreadystatechange
166     req.send (null);
167 wakaba 1.2 } // loadTextByHash
168 wakaba 1.1
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 wakaba 1.7 if (ln == 'tr' /*|| ln == 'tbody' || ln == 'thead' || ln == 'tfoot' ||
176     ln == 'table'*/ || ln == 'pre') {
177 wakaba 1.1 prev = parent;
178     parent = parent.parentNode;
179     } else {
180     break;
181     }
182     }
183     parent.insertBefore (insertedElement, prev.nextSibling);
184 wakaba 1.2 } // insertInterfaceElement
185 wakaba 1.4
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 wakaba 1.2
201     function applyJaEntry (targetNode, entry) {
202 wakaba 1.6 if (entry.isPattern || targetNode.nodeName == 'TR' /* find.cgi */) {
203 wakaba 1.2 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 wakaba 1.3 n.innerHTML = formatJaText (entry.ja);
215 wakaba 1.2 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 wakaba 1.3 span.innerHTML = formatJaText (entry.ja);
230 wakaba 1.2 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 wakaba 1.3
238     function formatJaText (s) {
239     return s.replace
240 wakaba 1.6 (/\[\[([A-Z ]+):([^\]]+)\]\]/g,
241 wakaba 1.3 function (a, b, c) {
242     return "<em class=rfc2119 title=\"" + b + "\">" + c + "</em>";
243     });
244     } // formatJaText
245 wakaba 1.6
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 wakaba 1.7 $Date: 2008/10/27 04:52:39 $
251 wakaba 1.6 */

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24