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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by wakaba, Sun Oct 26 06:50:10 2008 UTC revision 1.7 by wakaba, Wed Oct 29 06:26:42 2008 UTC
# Line 1  Line 1 
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) {  document.documentElement.ondblclick = function (event) {
17    var container = getEJContainer (event.target);    var container = getEJContainer (event.target);
18    if (container && !container.jaForm) {    if (container && !container.jaForm) {
# Line 8  document.documentElement.ondblclick = fu Line 23  document.documentElement.ondblclick = fu
23    return true;    return true;
24  }; // document.documentElement.ondblclick  }; // 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) {  function getEJContainer (n) {
50    while (n) {    while (n) {
51      if (n.hasAttribute && n.hasAttribute ('data-ja-hash')) {      if (n.hasAttribute && n.hasAttribute ('data-ja-hash')) {
# Line 19  function getEJContainer (n) { Line 57  function getEJContainer (n) {
57  } // getEJContainer  } // getEJContainer
58    
59  function insertJaForm (targetNode) {  function insertJaForm (targetNode) {
60    var form = document.createElement ('form');    var form = document.createElement ('div');
61    form.action = 'javascript:void (0)';    form.className = 'ja-edit-form';
62    
63    form.innerHTML = "<p><label>Original text:<br><textarea name=en></textarea></label><br>(<label><input name=pattern type=checkbox> Pattern</label>)<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</button> <button type=button class=ja-close-button>Close</button>";    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 () {    form.onchange = function () {
68      form.jaFormChanged = true;      form.jaFormChanged = true;
# Line 32  function insertJaForm (targetNode) { Line 72  function insertJaForm (targetNode) {
72      form.jaFormChanged = false;      form.jaFormChanged = false;
73    }; // form.onsubmit    }; // form.onsubmit
74    
75    form.getElementsByTagName ('button')[0].disabled = true; // Submit    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 () {    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 ||      if (!form.jaFormChanged ||
132          confirm ('Changes are discarded.')) {          confirm ('Changes are discarded.')) {
133        targetNode.jaForm = null;        targetNode.jaForm = null;
# Line 43  function insertJaForm (targetNode) { Line 136  function insertJaForm (targetNode) {
136    }; // "Close".onclick    }; // "Close".onclick
137    
138    targetNode.jaForm = form;    targetNode.jaForm = form;
139      insertInterfaceElement (form, targetNode);
140    
141    var hash = targetNode.getAttribute ('data-ja-hash');    var hash = targetNode.getAttribute ('data-ja-hash');
142      loadTextByHash (form, hash);
143    } // insertJaForm
144    
145    function loadTextByHash (form, hash) {
146    var req = new XMLHttpRequest ();    var req = new XMLHttpRequest ();
147    req.open ('GET', 'edit2/' + hash + '.json', true);    req.open ('GET', 'edit2/' + hash + '.json', true);
148    req.onreadystatechange = function () {    req.onreadystatechange = function () {
149      if (req.readyState == 4) {      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) {        if (req.status >= 200 && req.status < 400) {
153          var entry = eval ("(" + req.responseText + ")");          var entry = eval ("(" + req.responseText + ")");
154    
155          form.action = 'edit2/';          form.getElementsByTagName ('button')[1].disabled = false; // Submit
         form.method = 'post';  
         form.acceptCharset = 'utf-8';  
   
         form.getElementsByTagName ('button')[0].disabled = false;  
156    
157          form.getElementsByTagName ('textarea')[0].value = entry.en;          form.getElementsByTagName ('textarea')[0].value = entry.en;
158          form.getElementsByTagName ('textarea')[1].value = entry.ja || '';          form.getElementsByTagName ('textarea')[1].value = entry.ja || '';
159          form.getElementsByTagName ('textarea')[2].value = entry.tags.join ("\n");          form.getElementsByTagName ('textarea')[2].value = entry.tags.join ("\n");
160          form.getElementsByTagName ('input')[0].checked = entry.isPattern;          form.getElementsByTagName ('input')[0].checked = entry.isPattern;
161    
162          insertInterfaceElement (form, targetNode);          form.jaFormChanged = false;
163        }        }
164      }      }
165    }; // onreadystatechange    }; // onreadystatechange
166    req.send (null);    req.send (null);
167  } // insertJaForm  } // loadTextByHash
168    
169  function insertInterfaceElement (insertedElement, contextElement) {  function insertInterfaceElement (insertedElement, contextElement) {
170    var parent = contextElement.parentNode;    var parent = contextElement.parentNode;
# Line 76  function insertInterfaceElement (inserte Line 172  function insertInterfaceElement (inserte
172    while (true) {    while (true) {
173      if (!parent.parentNode) break;      if (!parent.parentNode) break;
174      var ln = parent.nodeName.toLowerCase ();      var ln = parent.nodeName.toLowerCase ();
175      if (ln == 'tr' || ln == 'tbody' || ln == 'thead' || ln == 'tfoot' ||      if (ln == 'tr' /*|| ln == 'tbody' || ln == 'thead' || ln == 'tfoot' ||
176          ln == 'table' || ln == 'pre') {          ln == 'table'*/ || ln == 'pre') {
177        prev = parent;        prev = parent;
178        parent = parent.parentNode;        parent = parent.parentNode;
179      } else {      } else {
180        break;        break;
181      }      }
182    }    }
   
183    parent.insertBefore (insertedElement, prev.nextSibling);    parent.insertBefore (insertedElement, prev.nextSibling);
 } // insertInterfaceElement  
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$
251    */

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.7

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24