/[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.2 - (hide annotations) (download) (as text)
Sun Oct 26 08:44:19 2008 UTC (17 years, 8 months ago) by wakaba
Branch: MAIN
Changes since 1.1: +151 -12 lines
File MIME type: application/javascript
Dynamic update implemented

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24