/[suikacvs]/webroot/swe/scripts/sw.js
Suika

Contents of /webroot/swe/scripts/sw.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations) (download) (as text)
Tue Dec 16 04:50:54 2008 UTC (16 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.1: +57 -3 lines
File MIME type: application/javascript
++ swe/lib/suikawiki/ChangeLog	16 Dec 2008 04:49:26 -0000
2008-12-16  Wakaba  <wakaba@suika.fam.cx>

	* main.pl: Adds .tools class to the page navigation, to
	distinguish with same-name pages navigation.

++ swe/scripts/ChangeLog	16 Dec 2008 04:50:42 -0000
2008-12-16  Wakaba  <wakaba@suika.fam.cx>

	* sw.js: Added Hatena Star support.  Use method
	|button.setAttribute ('type')| instead of attribute |button.type|
	for WebKit/WinIE compatibility.

1 wakaba 1.1 window.onload = function () {
2     createToolbar ();
3 wakaba 1.2 initializeHatenaStar();
4 wakaba 1.1 }; // window.onload
5    
6     function getElementsByClassName (c) {
7     if (document.getElementsByClassName) {
8     return document.getElementsByClassName (c);
9     } else {
10 wakaba 1.2 return [];
11 wakaba 1.1 }
12     } // getElementsByClassName
13    
14     function getAncestorElement (n, t) {
15     while (n != null) {
16     if (n.nodeName == t) {
17     return n;
18     } else {
19     n = n.parentNode;
20     }
21     }
22     return null;
23     } // getAncestorElement
24    
25     function getNextAnchorNumber (s) {
26     var lastId = 0;
27     s.replace (/\[([0-9]+)\]/g, function (l, n) {
28     var v = parseInt (n);
29     if (v > lastId) {
30     lastId = v;
31     }
32     });
33     return lastId + 1;
34     } // getNextAnchorNumber
35    
36     function createToolbar () {
37     var containers = getElementsByClassName ('text-toolbar');
38     for (var i = 0; i < containers.length; i++) {
39     var container = containers[i];
40    
41     var button = document.createElement ('button');
42 wakaba 1.2 button.setAttribute ('type', 'button');
43 wakaba 1.1 button.innerHTML = '[#]';
44     button.onclick = function () {
45     var form = getAncestorElement (container, 'FORM');
46     var ta = form.elements.text;
47     var st = ta.scrollTop;
48     var ss = ta.selectionStart;
49     var se = (ss != ta.selectionEnd);
50     var added = '[' + getNextAnchorNumber (ta.value) + '] ';
51     /*
52     if (ss > 0 && ta.value.substring (ss - 1, ss) != "\n") {
53     added = "\n" + added;
54     }
55     */
56     ta.value = ta.value.substring (0, ta.selectionStart)
57     + added + ta.value.substring (ta.selectionEnd);
58     if (se) {
59     ta.setSelectionRange (ss, ss + added.length);
60     } else {
61     ta.setSelectionRange (ss + added.length, ss + added.length);
62     }
63     ta.scrollTop = st;
64     ta.focus ();
65     }; // button.onclick
66     container.appendChild (button);
67     }
68 wakaba 1.2 } // createToolbar
69    
70     function initializeHatenaStar () {
71     if (!window.Hatena) {
72     window.Hatena = {};
73     }
74     if (!Hatena.Star) {
75     Hatena.Star = {};
76     }
77     if (!Hatena.Star.onLoadFunctions) {
78     Hatena.Star.onLoadFunctions = [];
79     }
80    
81     Hatena.Star.onLoadFunctions.push (function () {
82     if (Ten.DOM.loaded) {
83     Ten.DOM.loaded = false;
84     Ten.DOM.addObserver ();
85     }
86    
87     Hatena.Star.SiteConfig = {
88     entryNodes: {
89     'body': {
90     uri: 'h1 a',
91     title: 'h1',
92     container: '.tools' /* .nav.tools */
93     }
94     }
95     };
96    
97     var realLoadNewEntries = Hatena.Star.EntryLoader.loadNewEntries;
98     Hatena.Star.EntryLoader.loadNewEntries = function (node) {
99     if (!node) {
100     node = document.documentElement;
101     }
102     realLoadNewEntries.apply (this, [node]);
103     };
104    
105     setTimeout (function () {
106     Ten.DOM.dispatchEvent ('onload');
107     }, 1);
108     }); // Hatena.Star.onLoadFunctions.push'ed function
109    
110     var hsScript = document.createElement ('script');
111     hsScript.defer = true;
112     hsScript.src = 'http://s.hatena.ne.jp/js/HatenaStar.js';
113     document.documentElement.lastChild.appendChild (hsScript);
114    
115     /*
116     In SuikaWiki, a WikiName can be associated with multiple WikiPages,
117     while a WikiPage can be associated with multiple WikiNames. It would
118     be desired to associate Hatena Stars with WikiPages in theory.
119     However, WikiPages do not have permalinks at the moment.
120     */
121     } // initializeHatenaStar

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24