r98500 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r98499‎ | r98500 | r98501 >
Date:02:51, 30 September 2011
Author:johnduhart
Status:ok (Comments)
Tags:
Comment:
Basic ResourceLoader conversion, jQuery conversion and API use will come soon
Modified paths:
  • /trunk/extensions/CategoryTree/CategoryTree.css (deleted) (history)
  • /trunk/extensions/CategoryTree/CategoryTree.js (deleted) (history)
  • /trunk/extensions/CategoryTree/CategoryTree.php (modified) (history)
  • /trunk/extensions/CategoryTree/CategoryTree.rtl.css (deleted) (history)
  • /trunk/extensions/CategoryTree/CategoryTreeFunctions.php (modified) (history)
  • /trunk/extensions/CategoryTree/CategoryTreeIE.css (deleted) (history)
  • /trunk/extensions/CategoryTree/modules (added) (history)
  • /trunk/extensions/CategoryTree/modules/ext.categoryTree.css (added) (history)
  • /trunk/extensions/CategoryTree/modules/ext.categoryTree.js (added) (history)

Diff [purge]

Index: trunk/extensions/CategoryTree/CategoryTreeIE.css
@@ -1,4 +0,0 @@
2 -/* Hack for using inline-block with MSIE */
3 -html .CategoryTreePretendInlineMSIE {
4 - display: inline;
5 -}
Index: trunk/extensions/CategoryTree/CategoryTree.css
@@ -1,75 +0,0 @@
2 -/*
3 - * Stylesheet for the CategoryTree extension, an AJAX based gadget
4 - * to display the category structure of a wiki
5 - *
6 - * @file
7 - * @ingroup Extensions
8 - * @author Daniel Kinzler, brightbyte.de
9 - * @copyright © 2006 Daniel Kinzler
10 - * @licence GNU General Public Licence 2.0 or later
11 - *
12 - * NOTE: if you change this, increment $wgCategoryTreeVersion
13 - * in CategoryTree.php to avoid users getting stale copies from cache.
14 -*/
15 -
16 -.CategoryTreeChildren {
17 - margin-left: 1.5ex;
18 -}
19 -
20 -
21 -.CategoryTreeBullet {
22 - cursor: pointer;
23 - cursor: hand; /* hack for MSIE 5.0 and 5.5 */
24 -}
25 -.CategoryTreeEmptyBullet {
26 - cursor: default;
27 -}
28 -
29 -.CategoryTreeBullet a,
30 -.CategoryTreeBullet a:link,
31 -.CategoryTreeBullet a:active,
32 -.CategoryTreeBullet a:visited {
33 - text-decoration: none;
34 - color: inherit;
35 - speak: none;
36 -}
37 -
38 -.CategoryTreeLabelPage {
39 - font-style: italic;
40 -}
41 -
42 -.CategoryTreeParents {
43 - margin-top: 1.5ex;
44 - font-style: italic;
45 -}
46 -
47 -.CategoryTreeResult {
48 - margin-top: 1.5ex;
49 -}
50 -
51 -.CategoryTreeTag {
52 - margin-top: 0.5ex;
53 - margin-bottom: 0.5ex;
54 -}
55 -
56 -.CategoryTreeNotice {
57 - font-style: italic;
58 -}
59 -
60 -/*
61 -div.CategoryTreeInlineNode,
62 -div.CategoryTreeInlineNode div {
63 - display: table-cell;
64 -}
65 -*/
66 -
67 -.CategoryTreeCategoryBarItem {
68 - display:-moz-inline-box; display:inline-block; /* yes, specify display twice! quirk for FF2 */
69 - margin:-0.5ex 0 0 1ex; /* why is the -0.5ex needed? */
70 - padding:0;
71 - vertical-align: top;
72 -}
73 -
74 -.CategoryTreeSection {
75 - direction: ltr;
76 -}
\ No newline at end of file
Index: trunk/extensions/CategoryTree/CategoryTree.rtl.css
@@ -1,12 +0,0 @@
2 -/*
3 - * Stylesheet to fix the RTL view of the category tree.
4 - */
5 -
6 -.CategoryTreeChildren {
7 - margin-left: 0px;
8 - margin-right: 1.5ex;
9 -}
10 -
11 -.CategoryTreeSection {
12 - direction: rtl;
13 -}
\ No newline at end of file
Index: trunk/extensions/CategoryTree/CategoryTree.js
@@ -1,162 +0,0 @@
2 -/*
3 - * JavaScript functions for the CategoryTree extension, an AJAX based gadget
4 - * to display the category structure of a wiki
5 - *
6 - * @file
7 - * @ingroup Extensions
8 - * @author Daniel Kinzler, brightbyte.de
9 - * @copyright © 2006 Daniel Kinzler
10 - * @licence GNU General Public Licence 2.0 or later
11 - *
12 - * NOTE: if you change this, increment $wgCategoryTreeVersion
13 - * in CategoryTree.php to avoid users getting stale copies from cache.
14 - */
15 -
16 -// Default messages if new code loaded with old cached page
17 -var categoryTreeErrorMsg = "Problem loading data.";
18 -var categoryTreeRetryMsg = "Please wait a moment and try again.";
19 -
20 -function categoryTreeNextDiv(e) {
21 - var n= e.nextSibling;
22 - while ( n && ( n.nodeType != 1 || n.nodeName != 'DIV') ) {
23 - //alert('nodeType: ' + n.nodeType + '; nodeName: ' + n.nodeName);
24 - n= n.nextSibling;
25 - }
26 -
27 - return n;
28 -}
29 -
30 -function categoryTreeExpandNode(cat, options, lnk) {
31 - var div= categoryTreeNextDiv( lnk.parentNode.parentNode );
32 -
33 - div.style.display= 'block';
34 - lnk.innerHTML= categoryTreeCollapseBulletMsg;
35 - lnk.title= categoryTreeCollapseMsg;
36 - lnk.onclick= function() { categoryTreeCollapseNode(cat, options, lnk) };
37 -
38 - if (!lnk.className.match(/(^| )CategoryTreeLoaded($| )/)) {
39 - categoryTreeLoadNode(cat, options, lnk, div);
40 - }
41 -}
42 -
43 -function categoryTreeCollapseNode(cat, options, lnk) {
44 - var div= categoryTreeNextDiv( lnk.parentNode.parentNode );
45 -
46 - div.style.display= 'none';
47 - lnk.innerHTML= categoryTreeExpandBulletMsg;
48 - lnk.title= categoryTreeExpandMsg;
49 - lnk.onclick= function() { categoryTreeExpandNode(cat, options, lnk) }
50 -}
51 -
52 -function categoryTreeLoadNode(cat, options, lnk, div) {
53 - div.style.display= 'block';
54 - lnk.className= 'CategoryTreeLoaded';
55 - lnk.innerHTML= categoryTreeCollapseBulletMsg;
56 - lnk.title= categoryTreeCollapseMsg;
57 - lnk.onclick= function() { categoryTreeCollapseNode(cat, options, lnk) };
58 -
59 - categoryTreeLoadChildren(cat, options, div)
60 -}
61 -
62 -// FIXME Why can't this just use uneval()?
63 -function categoryTreeEncodeValue(value) {
64 - switch (typeof value) {
65 - case 'function':
66 - throw new Error("categoryTreeEncodeValue encountered a function");
67 - break;
68 - case 'string':
69 - s = '"' + value.replace(/([\\"'])/g, "\\$1") + '"';
70 - break;
71 - case 'number':
72 - case 'boolean':
73 - case 'null':
74 - s = String(value);
75 - break;
76 - case 'object':
77 - if ( !value ) {
78 - s = 'null';
79 - } else if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length'))) {
80 - s = '';
81 - for (i = 0; i<value.length; i++) {
82 - v = value[i];
83 - if ( s!='' ) s += ', ';
84 - s += categoryTreeEncodeValue( v );
85 - }
86 - s = '[' + s + ']';
87 - } else {
88 - s = '';
89 - for (k in value) {
90 - v = value[k];
91 - if ( s!='' ) s += ', ';
92 - s += categoryTreeEncodeValue( k );
93 - s += ': ';
94 - s += categoryTreeEncodeValue( v );
95 - }
96 - s = '{' + s + '}';
97 - }
98 - break;
99 - default:
100 - throw new Error("categoryTreeEncodeValue encountered strange variable type " + (typeof value));
101 - }
102 -
103 - return s;
104 -}
105 -
106 -function categoryTreeLoadChildren(cat, options, div) {
107 - div.innerHTML= '<i class="CategoryTreeNotice">' + categoryTreeLoadingMsg + '</i>';
108 -
109 - if ( typeof options == "string" ) { //hack for backward compatibility
110 - options = { mode : options };
111 - }
112 -
113 - function f( request ) {
114 - if (request.status != 200) {
115 - div.innerHTML = '<i class="CategoryTreeNotice">' + categoryTreeErrorMsg + ' </i>';
116 - var retryLink = document.createElement('a');
117 - retryLink.innerHTML = categoryTreeRetryMsg;
118 - retryLink.onclick = function() {
119 - categoryTreeLoadChildren(cat, options, div, enc);
120 - };
121 - div.appendChild(retryLink);
122 - return;
123 - }
124 -
125 - result= request.responseText;
126 - result= result.replace(/^\s+|\s+$/, '');
127 -
128 - if ( result == '' ) {
129 - result= '<i class="CategoryTreeNotice">';
130 -
131 - if ( options.mode == 0 ) {
132 - result= categoryTreeNoSubcategoriesMsg;
133 - } else if ( options.mode == 10 ) {
134 - result= categoryTreeNoPagesMsg;
135 - } else if ( options.mode == 100 ) {
136 - result= categoryTreeNoParentCategoriesMsg;
137 - } else {
138 - result= categoryTreeNothingFoundMsg;
139 - }
140 -
141 - result+= '</i>';
142 - }
143 -
144 - result = result.replace(/##LOAD##/g, categoryTreeExpandMsg);
145 - div.innerHTML= result;
146 -
147 - categoryTreeShowToggles();
148 - }
149 -
150 - var opt = categoryTreeEncodeValue(options);
151 - sajax_do_call( "efCategoryTreeAjaxWrapper", [cat, opt, 'json'] , f );
152 -}
153 -
154 -function categoryTreeShowToggles() {
155 - var toggles = getElementsByClassName( document, 'span', 'CategoryTreeToggle' );
156 -
157 - for( var i = 0; i<toggles.length; ++i ) {
158 - toggles[i].style.display = 'inline';
159 - }
160 -}
161 -
162 -// Re-show the CategoryTreeToggles
163 -addOnloadHook(categoryTreeShowToggles);
Index: trunk/extensions/CategoryTree/CategoryTree.php
@@ -64,9 +64,6 @@
6565 $wgCategoryTreeForceHeaders = false;
6666 $wgCategoryTreeSidebarRoot = null;
6767 $wgCategoryTreeHijackPageCategories = false; # EXPERIMENTAL! NOT YET FOR PRODUCTION USE! Main problem is general HTML/CSS layout cruftiness.
68 -
69 -$wgCategoryTreeExtPath = '/extensions/CategoryTree';
70 -$wgCategoryTreeVersion = '6'; # NOTE: bump this when you change the CSS or JS files!
7168 $wgCategoryTreeUseCategoryTable = true;
7269
7370 $wgCategoryTreeOmitNamespace = CT_HIDEPREFIX_CATEGORIES;
@@ -140,6 +137,16 @@
141138 $wgAjaxExportList[] = 'efCategoryTreeAjaxWrapper';
142139
143140 /**
 141+ * Register ResourceLoader modules
 142+ */
 143+$wgResourceModules['ext.categoryTree'] = array(
 144+ 'localBasePath' => dirname( __FILE__ ) . '/modules',
 145+ 'remoteExtPath' => 'CategoryTree/modules',
 146+ 'styles' => 'ext.categoryTree.css',
 147+ 'scripts' => 'ext.categoryTree.js',
 148+);
 149+
 150+/**
144151 * Hook it up
145152 */
146153 function efCategoryTree() {
Index: trunk/extensions/CategoryTree/modules/ext.categoryTree.css
@@ -0,0 +1,78 @@
 2+/*
 3+ * Stylesheet for the CategoryTree extension, an AJAX based gadget
 4+ * to display the category structure of a wiki
 5+ *
 6+ * @file
 7+ * @ingroup Extensions
 8+ * @author Daniel Kinzler, brightbyte.de
 9+ * @copyright © 2006 Daniel Kinzler
 10+ * @licence GNU General Public Licence 2.0 or later
 11+ *
 12+ * NOTE: if you change this, increment $wgCategoryTreeVersion
 13+ * in CategoryTree.php to avoid users getting stale copies from cache.
 14+*/
 15+
 16+.CategoryTreeChildren {
 17+ margin-left: 1.5ex;
 18+}
 19+
 20+
 21+.CategoryTreeBullet {
 22+ cursor: pointer;
 23+ cursor: hand; /* hack for MSIE 5.0 and 5.5 */
 24+}
 25+.CategoryTreeEmptyBullet {
 26+ cursor: default;
 27+}
 28+
 29+.CategoryTreeBullet a,
 30+.CategoryTreeBullet a:link,
 31+.CategoryTreeBullet a:active,
 32+.CategoryTreeBullet a:visited {
 33+ text-decoration: none;
 34+ color: inherit;
 35+ speak: none;
 36+}
 37+
 38+.CategoryTreeLabelPage {
 39+ font-style: italic;
 40+}
 41+
 42+.CategoryTreeParents {
 43+ margin-top: 1.5ex;
 44+ font-style: italic;
 45+}
 46+
 47+.CategoryTreeResult {
 48+ margin-top: 1.5ex;
 49+}
 50+
 51+.CategoryTreeTag {
 52+ margin-top: 0.5ex;
 53+ margin-bottom: 0.5ex;
 54+}
 55+
 56+.CategoryTreeNotice {
 57+ font-style: italic;
 58+}
 59+
 60+/*
 61+div.CategoryTreeInlineNode,
 62+div.CategoryTreeInlineNode div {
 63+ display: table-cell;
 64+}
 65+*/
 66+
 67+.CategoryTreeCategoryBarItem {
 68+ display:-moz-inline-box; display:inline-block; /* yes, specify display twice! quirk for FF2 */
 69+ margin:-0.5ex 0 0 1ex; /* why is the -0.5ex needed? */
 70+ padding:0;
 71+ vertical-align: top;
 72+ /* IE6-7 Hack for display: inline-block */
 73+ zoom: 1;
 74+ *display: inline;
 75+}
 76+
 77+.CategoryTreeSection {
 78+ direction: ltr;
 79+}
\ No newline at end of file
Property changes on: trunk/extensions/CategoryTree/modules/ext.categoryTree.css
___________________________________________________________________
Added: svn:eol-style
180 + native
Index: trunk/extensions/CategoryTree/modules/ext.categoryTree.js
@@ -0,0 +1,162 @@
 2+/*
 3+ * JavaScript functions for the CategoryTree extension, an AJAX based gadget
 4+ * to display the category structure of a wiki
 5+ *
 6+ * @file
 7+ * @ingroup Extensions
 8+ * @author Daniel Kinzler, brightbyte.de
 9+ * @copyright © 2006 Daniel Kinzler
 10+ * @licence GNU General Public Licence 2.0 or later
 11+ *
 12+ * NOTE: if you change this, increment $wgCategoryTreeVersion
 13+ * in CategoryTree.php to avoid users getting stale copies from cache.
 14+ */
 15+
 16+// Default messages if new code loaded with old cached page
 17+var categoryTreeErrorMsg = "Problem loading data.";
 18+var categoryTreeRetryMsg = "Please wait a moment and try again.";
 19+
 20+function categoryTreeNextDiv(e) {
 21+ var n= e.nextSibling;
 22+ while ( n && ( n.nodeType != 1 || n.nodeName != 'DIV') ) {
 23+ //alert('nodeType: ' + n.nodeType + '; nodeName: ' + n.nodeName);
 24+ n= n.nextSibling;
 25+ }
 26+
 27+ return n;
 28+}
 29+
 30+function categoryTreeExpandNode(cat, options, lnk) {
 31+ var div= categoryTreeNextDiv( lnk.parentNode.parentNode );
 32+
 33+ div.style.display= 'block';
 34+ lnk.innerHTML= categoryTreeCollapseBulletMsg;
 35+ lnk.title= categoryTreeCollapseMsg;
 36+ lnk.onclick= function() { categoryTreeCollapseNode(cat, options, lnk) };
 37+
 38+ if (!lnk.className.match(/(^| )CategoryTreeLoaded($| )/)) {
 39+ categoryTreeLoadNode(cat, options, lnk, div);
 40+ }
 41+}
 42+
 43+function categoryTreeCollapseNode(cat, options, lnk) {
 44+ var div= categoryTreeNextDiv( lnk.parentNode.parentNode );
 45+
 46+ div.style.display= 'none';
 47+ lnk.innerHTML= categoryTreeExpandBulletMsg;
 48+ lnk.title= categoryTreeExpandMsg;
 49+ lnk.onclick= function() { categoryTreeExpandNode(cat, options, lnk) }
 50+}
 51+
 52+function categoryTreeLoadNode(cat, options, lnk, div) {
 53+ div.style.display= 'block';
 54+ lnk.className= 'CategoryTreeLoaded';
 55+ lnk.innerHTML= categoryTreeCollapseBulletMsg;
 56+ lnk.title= categoryTreeCollapseMsg;
 57+ lnk.onclick= function() { categoryTreeCollapseNode(cat, options, lnk) };
 58+
 59+ categoryTreeLoadChildren(cat, options, div)
 60+}
 61+
 62+// FIXME Why can't this just use uneval()?
 63+function categoryTreeEncodeValue(value) {
 64+ switch (typeof value) {
 65+ case 'function':
 66+ throw new Error("categoryTreeEncodeValue encountered a function");
 67+ break;
 68+ case 'string':
 69+ s = '"' + value.replace(/([\\"'])/g, "\\$1") + '"';
 70+ break;
 71+ case 'number':
 72+ case 'boolean':
 73+ case 'null':
 74+ s = String(value);
 75+ break;
 76+ case 'object':
 77+ if ( !value ) {
 78+ s = 'null';
 79+ } else if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length'))) {
 80+ s = '';
 81+ for (i = 0; i<value.length; i++) {
 82+ v = value[i];
 83+ if ( s!='' ) s += ', ';
 84+ s += categoryTreeEncodeValue( v );
 85+ }
 86+ s = '[' + s + ']';
 87+ } else {
 88+ s = '';
 89+ for (k in value) {
 90+ v = value[k];
 91+ if ( s!='' ) s += ', ';
 92+ s += categoryTreeEncodeValue( k );
 93+ s += ': ';
 94+ s += categoryTreeEncodeValue( v );
 95+ }
 96+ s = '{' + s + '}';
 97+ }
 98+ break;
 99+ default:
 100+ throw new Error("categoryTreeEncodeValue encountered strange variable type " + (typeof value));
 101+ }
 102+
 103+ return s;
 104+}
 105+
 106+function categoryTreeLoadChildren(cat, options, div) {
 107+ div.innerHTML= '<i class="CategoryTreeNotice">' + categoryTreeLoadingMsg + '</i>';
 108+
 109+ if ( typeof options == "string" ) { //hack for backward compatibility
 110+ options = { mode : options };
 111+ }
 112+
 113+ function f( request ) {
 114+ if (request.status != 200) {
 115+ div.innerHTML = '<i class="CategoryTreeNotice">' + categoryTreeErrorMsg + ' </i>';
 116+ var retryLink = document.createElement('a');
 117+ retryLink.innerHTML = categoryTreeRetryMsg;
 118+ retryLink.onclick = function() {
 119+ categoryTreeLoadChildren(cat, options, div, enc);
 120+ };
 121+ div.appendChild(retryLink);
 122+ return;
 123+ }
 124+
 125+ result= request.responseText;
 126+ result= result.replace(/^\s+|\s+$/, '');
 127+
 128+ if ( result == '' ) {
 129+ result= '<i class="CategoryTreeNotice">';
 130+
 131+ if ( options.mode == 0 ) {
 132+ result= categoryTreeNoSubcategoriesMsg;
 133+ } else if ( options.mode == 10 ) {
 134+ result= categoryTreeNoPagesMsg;
 135+ } else if ( options.mode == 100 ) {
 136+ result= categoryTreeNoParentCategoriesMsg;
 137+ } else {
 138+ result= categoryTreeNothingFoundMsg;
 139+ }
 140+
 141+ result+= '</i>';
 142+ }
 143+
 144+ result = result.replace(/##LOAD##/g, categoryTreeExpandMsg);
 145+ div.innerHTML= result;
 146+
 147+ categoryTreeShowToggles();
 148+ }
 149+
 150+ var opt = categoryTreeEncodeValue(options);
 151+ sajax_do_call( "efCategoryTreeAjaxWrapper", [cat, opt, 'json'] , f );
 152+}
 153+
 154+function categoryTreeShowToggles() {
 155+ var toggles = getElementsByClassName( document, 'span', 'CategoryTreeToggle' );
 156+
 157+ for( var i = 0; i<toggles.length; ++i ) {
 158+ toggles[i].style.display = 'inline';
 159+ }
 160+}
 161+
 162+// Re-show the CategoryTreeToggles
 163+jQuery( categoryTreeShowToggles );
Property changes on: trunk/extensions/CategoryTree/modules/ext.categoryTree.js
___________________________________________________________________
Added: svn:eol-style
1164 + native
Index: trunk/extensions/CategoryTree/CategoryTreeFunctions.php
@@ -164,40 +164,9 @@
165165 global $wgJsMimeType, $wgScriptPath, $wgContLang;
166166 global $wgCategoryTreeHijackPageCategories, $wgCategoryTreeExtPath, $wgCategoryTreeVersion;
167167
168 - # Register css file for CategoryTree
169 - $outputPage->addLink(
170 - array(
171 - 'rel' => 'stylesheet',
172 - 'type' => 'text/css',
173 - 'href' => "$wgScriptPath$wgCategoryTreeExtPath/CategoryTree.css?$wgCategoryTreeVersion",
174 - )
175 - );
 168+ # Add the module
 169+ $outputPage->addModules( 'ext.categoryTree' );
176170
177 - if ( $wgCategoryTreeHijackPageCategories ) {
178 - # Register MSIE quirks
179 - $outputPage->addScript(
180 - "<!--[if IE]><link rel=\"stylesheet\" type=\"text/css\" src=\"{$wgScriptPath}{$wgCategoryTreeExtPath}/CategoryTreeIE.css?{$wgCategoryTreeVersion}\"/><![endif]-->
181 - \n"
182 - );
183 - }
184 -
185 - # Register css RTL file for CategoryTree
186 - if ( $wgContLang->isRTL() ) {
187 - $outputPage->addLink(
188 - array(
189 - 'rel' => 'stylesheet',
190 - 'type' => 'text/css',
191 - 'href' => "$wgScriptPath$wgCategoryTreeExtPath/CategoryTree.rtl.css?$wgCategoryTreeVersion"
192 - )
193 - );
194 - }
195 -
196 - # Register main js file for CategoryTree
197 - $outputPage->addScript(
198 - "<script type=\"{$wgJsMimeType}\" src=\"{$wgScriptPath}{$wgCategoryTreeExtPath}/CategoryTree.js?{$wgCategoryTreeVersion}\">" .
199 - "</script>\n"
200 - );
201 -
202171 # Add messages
203172 $outputPage->addScript(
204173 " <script type=\"{$wgJsMimeType}\">

Follow-up revisions

RevisionCommit summaryAuthorDate
r98563Followup r98500, conversion of the Javascript to use jQuery fully. It also ma...johnduhart21:08, 30 September 2011
r110933Followup r98500, fixes flash of unstyled contentjohnduhart14:07, 8 February 2012

Comments

#Comment by Johnduhart (talk | contribs)   02:53, 30 September 2011
#Comment by Krinkle (talk | contribs)   16:34, 2 October 2011

css and js files were also changed a little bit, linking to diff:

#Comment by Krinkle (talk | contribs)   16:35, 2 October 2011

css and js files were also changed a little bit, linking to diff:

#Comment by Krinkle (talk | contribs)   16:37, 2 October 2011

css and js files were also changed a little bit, linking to diff:

#Comment by Catrope (talk | contribs)   18:02, 9 January 2012
+		$outputPage->addModules( 'ext.categoryTree' );

This will add a flash of unstyled content, unless the getTag() function also calls $parser->addModuleStyles()

OK otherwise.

#Comment by Reedy (talk | contribs)   22:10, 13 January 2012

Can you elabourate when the blood stops rushing to your head from you being upside down?

addModuleStyles is part of OutputPage, not Parser...

Use $wgOut->addModuleStyles feels just a bit icky there

#Comment by Catrope (talk | contribs)   10:21, 5 February 2012

Oh, sorry, I meant $parser->getOutput()->addModuleStyles()

#Comment by Johnduhart (talk | contribs)   23:19, 24 January 2012

Ping.

#Comment by Reedy (talk | contribs)   23:22, 2 February 2012

Sent him an email

#Comment by Brion VIBBER (talk | contribs)   19:01, 14 February 2012

Seems ok these days...

Status & tagging log