/[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.5 - (hide annotations) (download) (as text)
Sun Oct 26 12:38:48 2008 UTC (17 years, 8 months ago) by wakaba
Branch: MAIN
Changes since 1.4: +2 -2 lines
File MIME type: application/javascript
Remove old para edit tool

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.5 <p><label>Translated text:<br><textarea name=ja></textarea></label><p><label>Tags:<br><textarea name=tags></textarea></label><p><button type=submit 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     var req = new XMLHttpRequest ();
107     req.open ('POST', 'edit2/', true);
108     req.onreadystatechange = function () {
109     if (req.readyState == 4) {
110     form.getElementsByTagName ('output')[0].firstChild.data
111     = 'Save: ' + req.status + ' ' + req.statusText;
112     if (req.status >= 200 && req.status < 400) {
113     targetNode.jaForm = null;
114     form.parentNode.removeChild (form);
115 wakaba 1.4 applyJaUpdates (eval ('(' + req.responseText + ')'));
116 wakaba 1.2 }
117     }
118     }; // onreadystatechange
119     req.setRequestHeader
120     ('Content-Type', 'application/x-www-form-urlencoded');
121     req.send (v);
122     }; // "Save and close".onclick
123    
124     form.getElementsByTagName ('button')[2].onclick = function () {
125 wakaba 1.1 if (!form.jaFormChanged ||
126     confirm ('Changes are discarded.')) {
127     targetNode.jaForm = null;
128     form.parentNode.removeChild (form);
129     }
130     }; // "Close".onclick
131    
132     targetNode.jaForm = form;
133 wakaba 1.2 insertInterfaceElement (form, targetNode);
134 wakaba 1.1
135     var hash = targetNode.getAttribute ('data-ja-hash');
136 wakaba 1.2 loadTextByHash (form, hash);
137     } // insertJaForm
138    
139     function loadTextByHash (form, hash) {
140 wakaba 1.1 var req = new XMLHttpRequest ();
141     req.open ('GET', 'edit2/' + hash + '.json', true);
142     req.onreadystatechange = function () {
143     if (req.readyState == 4) {
144 wakaba 1.2 form.getElementsByTagName ('output')[0].firstChild.data
145     = 'Load: ' + req.status + ' ' + req.statusText;
146 wakaba 1.1 if (req.status >= 200 && req.status < 400) {
147     var entry = eval ("(" + req.responseText + ")");
148    
149 wakaba 1.2 form.getElementsByTagName ('button')[1].disabled = false; // Submit
150 wakaba 1.1
151     form.getElementsByTagName ('textarea')[0].value = entry.en;
152     form.getElementsByTagName ('textarea')[1].value = entry.ja || '';
153     form.getElementsByTagName ('textarea')[2].value = entry.tags.join ("\n");
154     form.getElementsByTagName ('input')[0].checked = entry.isPattern;
155    
156 wakaba 1.2 form.jaFormChanged = false;
157 wakaba 1.1 }
158     }
159     }; // onreadystatechange
160     req.send (null);
161 wakaba 1.2 } // loadTextByHash
162 wakaba 1.1
163     function insertInterfaceElement (insertedElement, contextElement) {
164     var parent = contextElement.parentNode;
165     var prev = contextElement;
166     while (true) {
167     if (!parent.parentNode) break;
168     var ln = parent.nodeName.toLowerCase ();
169     if (ln == 'tr' || ln == 'tbody' || ln == 'thead' || ln == 'tfoot' ||
170     ln == 'table' || ln == 'pre') {
171     prev = parent;
172     parent = parent.parentNode;
173     } else {
174     break;
175     }
176     }
177    
178     parent.insertBefore (insertedElement, prev.nextSibling);
179 wakaba 1.2 } // insertInterfaceElement
180 wakaba 1.4
181     function applyJaUpdates (updates) {
182     document.newEntries =updates;
183     for (var hash in updates) {
184     if (document.jaHashes[hash]) {
185     for (var i in document.jaHashes[hash]) {
186     applyJaEntry (document.jaHashes[hash][i], updates[hash]);
187     }
188     }
189     if (document.jaRealHashes[hash]) {
190     for (var i in document.jaRealHashes[hash]) {
191     applyJaEntry (document.jaRealHashes[hash][i], updates[hash]);
192     }
193     }
194     }
195     } // applyJaUpdates
196 wakaba 1.2
197     function applyJaEntry (targetNode, entry) {
198     if (entry.isPattern) {
199     targetNode.className += ' ja-not-patched';
200     } else {
201     var en;
202     var cn = targetNode.childNodes;
203     for (var i = 0; i < cn.length; i++) {
204     var n = cn[i];
205     if (n.className && n.className.match (/\bja-translation\b/)) {
206     var prefix;
207     if (n.firstChild && n.firstChild.className == 'secno') {
208     prefix = n.firstChild;
209     }
210 wakaba 1.3 n.innerHTML = formatJaText (entry.ja);
211 wakaba 1.2 if (prefix) n.insertBefore (prefix, n.firstChild);
212     targetNode.className += ' ja-patched';
213     return;
214     } else if (n.className && n.className.match (/\ben-original\b/)) {
215     en = n;
216     }
217     }
218    
219     var span = document.createElement ('span');
220     span.className = 'ja-translation';
221     var prefix;
222     if (en.firstChild && en.firstChild.className == 'secno') {
223     prefix = en.firstChild.cloneNode (true);
224     }
225 wakaba 1.3 span.innerHTML = formatJaText (entry.ja);
226 wakaba 1.2 if (prefix) span.insertBefore (prefix, span.firstChild);
227     targetNode.appendChild (span);
228     targetNode.className
229     = targetNode.className.replace
230     (/\bno-ja-translation\b/, 'has-ja-translation ja-patched');
231     }
232     } // applyJaEntry
233 wakaba 1.3
234     function formatJaText (s) {
235     return s.replace
236 wakaba 1.5 (/\[\[([A-Z ]+):([^]]+)\]\]/g,
237 wakaba 1.3 function (a, b, c) {
238     return "<em class=rfc2119 title=\"" + b + "\">" + c + "</em>";
239     });
240     } // formatJaText

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24