r40616 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r40615‎ | r40616 | r40617 >
Date:20:56, 8 September 2008
Author:jdpond
Status:old
Tags:
Comment:
added automatic text indent and made compatible with MW versions prior to 1.11.0
* added js based indent using :
* If MW Ver less than <1.11.0, use old internationalisation approach
* Updated to Ver 1.3
* Updated readme file to correspond
Modified paths:
  • /trunk/extensions/DiscussionThreading/DiscussionThreading.php (modified) (history)
  • /trunk/extensions/DiscussionThreading/README (modified) (history)

Diff [purge]

Index: trunk/extensions/DiscussionThreading/DiscussionThreading.php
@@ -5,6 +5,7 @@
66 * @author Jack D. Pond <jack.pond@psitex.com>
77 * @addtogroup Extensions
88 * @copyright 2007 Jack D. pond
 9+ * @url http://www.mediawiki.org/wiki/Manual:Extensions
910 * @licence GNU General Public Licence 2.0 or later
1011 */
1112
@@ -16,8 +17,8 @@
1718 $wgExtensionFunctions[] = 'efDiscussionThreadSetup';
1819 $wgExtensionCredits['other'][] = array(
1920 'name' => 'DiscussionThreading',
20 - 'author' => 'Jack D. Pond',
21 - 'version' => '1.2',
 21+ 'author' => 'Jack D. Pond, Daniel Brice',
 22+ 'version' => '1.3',
2223 'url' => 'http://www.mediawiki.org/wiki/Extension:DiscussionThreading',
2324 'description' => 'Add Threading to discussion (talk) pages',
2425 'descriptionmsg' => 'discussionthreading-desc',
@@ -39,10 +40,16 @@
4041 $wgHooks['AlternateEdit'][] = 'efDiscussionThreadEdit';
4142
4243 /**
43 - * Initial setup, add .i18n. messages from $IP/extensions/DiscussionThreading.i18n.php
 44+ * Initial setup, add .i18n. messages from $IP/extensions/DiscussionThreading/DiscussionThreading.i18n.php
4445 */
4546 function efDiscussionThreadSetup() {
46 - wfLoadExtensionMessages( 'DiscussionThreading' );
 47+ global $wgVersion;
 48+ $xversion = explode(".",$wgVersion);
 49+ if ($xversion[0] <= "1" && $xversion[1] <= "11") {
 50+ global $wgMessageCache, $messages;
 51+ foreach( $messages as $lang => $LangMsg )
 52+ $wgMessageCache->addMessages( $LangMsg, $lang );
 53+ } else wfLoadExtensionMessages( 'DiscussionThreading' );
4754 }
4855
4956 /**
@@ -140,6 +147,29 @@
141148 } else {
142149 $text = $text." -- ~~~~<br>\n\n";
143150 }
 151+ // Add an appropriate number of colons (:) to indent the body.
 152+ // Include replace me text, so the user knows where to reply
 153+ $replaceMeText = " Replace this text with your reply";
 154+ $text .= "\n\n".str_repeat(":",strlen($matches[1])-1).$replaceMeText;
 155+ // Insert javascript hook that will select the replace me text
 156+ global $wgOut;
 157+ $wgOut->addScript("<script type=\"text/javascript\">
 158+ function efDiscussionThread(){
 159+ var ctrl = document.editform.wpTextbox1;
 160+ if (ctrl.setSelectionRange) {
 161+ ctrl.focus();
 162+ var end = ctrl.value.length;
 163+ ctrl.setSelectionRange(end-".strlen($replaceMeText).",end-1);
 164+ ctrl.scrollTop = ctrl.scrollHeight;
 165+ } else if (ctrl.createTextRange) {
 166+ var range = ctrl.createTextRange();
 167+ range.collapse(false);
 168+ range.moveStart('character', -".strlen($replaceMeText).");
 169+ range.select();
 170+ }
 171+ }
 172+ addOnloadHook(efDiscussionThread);
 173+ </script>");
144174 $efform->replyadded = true;
145175 $efform->textbox1 = $text;
146176 }
Index: trunk/extensions/DiscussionThreading/README
@@ -1,355 +1,76 @@
2 -'''Title: ''' Modify Discussion Functionality to be more threadlike
 2+'[[Extension:DiscussionThreading|See formal extension description]]
 3+== Release Notes ==
 4+* 1.3 - Added Dan Brice's code that will automatically insert indentation (so comment body is appropriately indented) and patches for compatibility with MW Versions Prior to 1.11
 5+* 1.2 - [[User:siebrand|siebrand]] updated to use current extension standards (THANKS!)
 6+* 1.1 - Updated to be forward compatible with release 1.11, bug fix
 7+** Rob Church made mods that simplifies, beautifies, etc. the hook which is included in the next release, needed to change extension to make consistent
 8+** Fixed bug where I forgot to declare $wgSectionThreadingOn as a global in one subroutine - caused a php error to display
 9+** Need to download both the patches and the extension - they must be updated as a set.
 10+* 1.0
 11+** greatly reduces patching - completely dependent on hooks, although needs 2 hooks in linker.php to execute
 12+** Added [new] link in section header that starts a new thread at the bottom
 13+** Defaults to add new comment when discussion page first entered
 14+** If previous patches applied, EditPage.php can be reverted to appropriate release version - patches no longer required
 15+* Between Version 0.0 and 0.1, changed to use the name 'DiscussionThreading' instead of the 'AddCommentSection'. The comment was vestigial and not fully descriptive.
316
4 -'''Description:'''
 17+== What can this extension do? ==
518
6 -[[Extension:DiscussionThreading|See formal extension description]]
 19+MediaWiki supports a discussion model called talk pages. These are regular wiki pages whose only distinction is that they are associated with a content page. That is, these two types of pages are always linked to each other, a content page and a talk page. Since talk pages are regular wiki pages, they suffer many usability shortcomings. This extension addresses some of these shortcomings by customizing talk pages including:
720
8 -The thread-like nature of discussions is highly valuable. This extension is a quasi threading adaption for the discussion feature that does the following:
 21+* '''Minimal threading''' - Subject headings are used to identify what discussion a particular comment belongs to. These headings are not dated and cannot be sorted.
 22+* '''Users explicitly sign their comments''' - signatures are automatically added to the discussions.
 23+* '''Transparent response mechanism''' - users can reply to existing comments or create new ones using the [new][edit][reply]
 24+* '''Conversation tracking''' - the [reply] allows users to specify existing objects (sections) in the system, and effectively track comments one has left, responses received (regardless of the location), and so on.
925
10 -# Adds a <nowiki>[new]</nowiki> link onto the header that creates a new comment on the page when used.
11 -# Adds a <nowiki>[reply]</nowiki> link onto the header that creates a reply to that section.
12 -# Automatically adds a signature in at the top of the section - preferably in the header bar to show up in TOC
13 -# Enters the discussion page in the add comment mode (and automatic signature) when new discussion page made
 26+For a more complete analysis, check Erik M�ller's [http://www.wikieducator.org/WikiEducator_roadmap/Improve_discussion_functionality article], from which the above was liberally plagiarized.
1427
15 -This requires adding 2 new hooks to Linker.php - which requires manual patching. The extension itself includes multiple hooks and the initial setup.
 28+When a new post is created, the extension automatically tags with user information and posting date. Much like a threaded discussion listserv, it allows response to individual posts and organizes. Still allows user standard user editing. Tags do not appear on article or other pages, limited to discussion and 're:' is automatically added to replies.
1629
17 -== Installation Instructions ==
18 -
19 -Will absolutely not work below 1.6.0, requires features added with that release.
20 -
21 -The "reply" feature requires a new parameter passed to the EditPage. This parameter is "replyto=yes" when the user is replying to a previous post.
22 -
23 -You can apply this extension either by downloading and copying the files into your wiki, or by manual processes below. The referenced packages have the files necessary to implement without editing patches, but only for the following versions. :
24 -
25 -* REL1_10
26 -* REL1_9_3
27 -
28 -If you do not have one of these versions, you must [[Extension:DiscussionThread_Article#Manual_Patching_and_Installation | manually patch]].
29 -
30 -=== Download and Install Instructions ===
31 -
32 -You can download the extension and already patched files from:
33 -
34 -* [http://wiki.montcopa.org/PublicDownloads/DiscussionThreading.zip Windows Zip Package]
35 -* [http://wiki.montcopa.org/PublicDownloads/DiscussionThreading.tar TAR Package]
36 -
37 -# Create a new directory extensions/DiscussionThreading
38 -# Copy the files DiscussionThreading.php and DiscussionThreading.i18n.php into extensions/DiscussionThreading
39 -# Select the appropriate Release Directory ('''NOTE: DO NOT USE THESE UNLESS YOU HAVE THE EXACT RELEASE''') and perform ONLY ONE of the following two steps:
40 -## Apply the patch file to your existing includes/linker.php file
41 -## Copy the included linker.php file into your includes directory, overwriting the existing version (Note: If you have applied other patches to this file they will be overwritten).
42 -# Patch localsettings.php by adding the following near other require_once or at the end before the close statement:
43 -<pre>require_once("$IP/extensions/DiscussionThreading/DiscussionThreading.php");</pre>
44 -
45 -If you have executed this properly, you will have the following:
46 -
47 -* DiscussionThreading.php and DiscussionThreading.i18n.php moved into $IP/extensions/DiscussionThreading/DiscussionThreading.php
48 -* Either patched Linker.php or the loaded Linker.php from the EXACT distribution downloaded release in $IP/includes/
49 -* extensions/DiscussionThreading/DiscussionThreading.php executed from localsettings.php
50 -
51 -=== Manual Patching and Installation ===
52 -Details are below, but these are required steps:
53 -
54 -# Create a new directory extensions/DiscussionThreading
55 -# Create a new file extensions/DiscussionThreading/DiscussionThreading.php and copy and paste the below code
56 -# Create a new file extensions/DiscussionThreading/DiscussionThreading.i18n.php and copy and paste the below code
57 -# Patch Linker.php according to below instructions
58 -# Patch localsettings.php by adding the following near other require_once or at the end before the close statement:
59 -<pre>require_once("$IP/extensions/DiscussionThreading/DiscussionThreading.php");</pre>
60 -
61 -There is something very funky about flushing the PHP compiled cache. I was only able to get the changes made in the Linker.php file to take effect by going to a discussion page while I was logged on as an administrator on the patched server and using a browser local to that machine (press the + tab). Somehow, this caused the .php files to recompile and activate for everyone.
62 -
63 -== Patches Required ==
64 -
65 -To do this, have to patch the following (instructions are for 1.10.0, future or past releases will, of course vary with line numbers and locations):
66 -
67 -===Patches to Linker.php===
68 -
69 -====Modified linker.php editSectionLinkForOther (line 985 in REL1_10) ====
 30+Once installed it can be enabled or disabled using the global variable below the inclusion (Enabled by default with the inclusion):
7031 <pre>
71 - public function editSectionLinkForOther( $title, $section ) {
72 - global $wgContLang;
73 -
74 - $title = Title::newFromText( $title );
75 - $editurl = '&section='.$section;
76 - $url = $this->makeKnownLinkObj( $title, wfMsg('editsection'), 'action=edit'.$editurl );
77 -### Modifications Here
78 -### return "<span class=\"editsection\">[".$url."]</span>";
79 - $result = null;
80 - wfRunHooks( 'editSectionLinkForOther', array( &$this, $title, $section , $url, &$result) );
81 - if ( $result == null ) {
82 - return "<span class=\"editsection\">[".$url."]</span>";
83 - } else {
84 - return ($result);
85 - }
86 -###
87 - }
 32+$wgSectionThreadingOn = True; /* Enabled */
8833 </pre>
89 -====Modified linker.php editSectionLink (line 1004 in REL1_10) ====
90 -<pre>
91 - public function editSectionLink( $nt, $section, $hint='' ) {
92 - global $wgContLang;
9334
94 - $editurl = '&section='.$section;
95 - $hint = ( $hint=='' ) ? '' : ' title="' . wfMsgHtml( 'editsectionhint', htmlspecialchars( $hint ) ) . '"';
96 - $url = $this->makeKnownLinkObj( $nt, wfMsg('editsection'), 'action=edit'.$editurl, '', '', '', $hint );
97 -### Modifications Here
98 -### return "<span class=\"editsection\">[".$url."]</span>";
99 - $result = null;
100 - wfRunHooks( 'editSectionLink', array( &$this, $nt, $section, $hint='', $url , &$result) );
101 - if ( $result == null ) {
102 - return "<span class=\"editsection\">[".$url."]</span>";
103 - } else {
104 - return ($result);
105 - }
106 -###
107 - }
108 -</pre>
 35+== Announcements ==
 36+* Will be incorporating [[User:Danbrice|Danbrice's]] [[Extension_talk:DiscussionThreading#Re:_CSS_tip_to_make_reply_body_match_title.3F_--Danbrice_05:02.2C_29_July_2008_.28UTC.29|automatic indent revisions]] in as soon as I upgrade a server to 1.13 and can test it.
 37+* Finally got around to putting into SVN and updated instructions
 38+* '''GREAT NEWS!''' The enhancement request [http://bugzilla.wikimedia.org/show_bug.cgi?id=10139 Allow Developers to add links to edit sections via hooks] has been made. This means no patches are required to install this extension if you are using REL1_11 or greater.
10939
110 -== DiscussionThreading Extension ==
 40+== Usage ==
11141
112 -extensions/DiscussionThreading.php
 42+Using Wikis for project management and collaboration. Many of the older users were much more comfortable with the listserv approach. This is a transitional path for them.
11343
114 -This extension implements a discussion threading process. This threading will only be seen on the talk pages, unless explicity invoked in the command line.
 44+== Installation ==
11545
116 -It adds a <nowiki>[reply]</nowiki> link on the header line. Each time a new posting is entered or a posting is replied to, the comment will automatically be tagged (and appear in the TOC too). Of course direct editing can occur, but this really makes it a lot easier to organize discussions in a threading view that most are familiar with.
 46+Installation is straightforward for REL1_11 and greater because hooks were added in Linker.php that eliminated the need for patching. However, if you are using a version below REL1_11, you will have to patch as described in the [[Extension:DiscussionThreading/doc#Installation_Instructions|installation instructions]].
11747
118 -To do:
119 -# get someone who knows regex to clean up the parsing of the subject line
120 -# Assess to see if there's an easier way to do this
 48+See [http://www.mediawiki.org/wiki/Extension:DiscussionThreading/doc#DiscussionThreading_Extension_Download_and_Installation Installation Instructions]
12149
122 -<pre>
123 -<?php
 50+== Parameters ==
12451
125 -/**
126 - * Extension to provide discussion threading similar to a listserv archive
127 - *
128 - * @author Jack D. Pond <jack.pond@psitex.com>
129 - * @addtogroup Extensions
130 - * @copyright � 2007 Jack D. pond
131 - * @licence GNU General Public Licence 2.0 or later
132 - */
 52+== Changes to LocalSettings.php ==
13353
134 -if( defined( 'MEDIAWIKI' ) ) {
 54+<source lang="php">require_once("$IP/extensions/DiscussionThreading/DiscussionThreading.php");</source>
13555
 56+=== Code ===
13657
137 -# Internationalisation file
138 - require_once( "$IP/extensions/DiscussionThreading/DiscussionThreading.i18n.php" );
 58+Has been fairly comprehensively tested.
 59+Has the following hooks:
13960
140 - $wgExtensionFunctions[] = 'efDiscussionThreadSetup';
141 - $wgExtensionCredits['other'][] = array(
142 - 'name' => 'DiscussionThreading',
143 - 'author' => 'Jack D. Pond',
144 - 'url' => 'http://www.mediawiki.org/wiki/Extension:DiscussionThreading',
145 - 'description' => 'Add Threading to discussion (talk) pages' );
 61+<pre>
14662
147 - /**
148 - * Set up hooks for discussion threading
149 - *
150 - * @param $wgSectionThreadingOn global logical variable to activate threading
151 - */
152 -
153 -
154 - global $wgSectionThreadingOn;
155 - $wgSectionThreadingOn = True;
156 -
15763 $wgHooks['EditPage::showEditForm:initial'][] = 'efDiscussionThread';
15864 $wgHooks['EditPage::attemptSave'][] = 'efStampReply';
15965 $wgHooks['EditPage::showEditForm:initial'][] = 'efDiscussionThreadEdit';
 66+### custom created hooks in linker.php - no longer custom in release >1.11
16067 $wgHooks['editSectionLinkForOther'][] = 'efDiscussionLink4other';
16168 $wgHooks['editSectionLink'][] = 'efDiscussionLink';
 69+###
16270 $wgHooks['AlternateEdit'][] = 'efDiscussionThreadEdit';
163 -
164 -
165 -
166 -
167 - /**
168 - * Initial setup, add .i18n. messages from $IP/extensions/DiscussionThreading.i18n.php
169 - */
170 - function efDiscussionThreadSetup() {
171 - global $wgMessageCache, $wgDiscussionThreadMessages;
172 -
173 - foreach( $wgDiscussionThreadMessages as $lang => $messages )
174 - $wgMessageCache->addMessages( $messages, $lang );
175 - }
176 - /**
177 - * This function creates a linkobject for the editSectionLinkForOther function in linker
178 - *
179 - * @param $callobj Article object.
180 - * @param $title Title object.
181 - * @param $section Integer: section number.
182 - * @param $hint Link String: title, or default if omitted or empty
183 - * @param $url Link String: for edit url
184 - * @param $result String: Returns the section [new][edit][reply] html if in a talk page - otherwise whatever came in with
185 - * @return true
186 - */
187 -
188 - function efDiscussionLink4other ($callobj, $title, $section , $url , &$result)
189 - {
190 - if($wgSectionThreadingOn && $title->isTalkPage() ) {
191 - $commenturl = '&section='.$section.'&replyto=yes';
192 - $curl = $callobj->makeKnownLinkObj( $title, wfMsg('replysection'), 'action=edit'.$commenturl );
193 - $newthreadurl = '&section=new';
194 - $nurl = $callobj->makeKnownLinkObj( $nt, wfMsg('threadnewsection'), 'action=edit'.$newthreadurl );
195 - $result = "<span class=\"editsection\">[".$nurl."][".$url."][".$curl."]</span>";
196 - }
197 - return (true);
198 - }
199 -
200 - /**
201 - * This function creates a linkobject for the editSectionLink function in linker
202 - *
203 - * @param $callobj Article object.
204 - * @param $nt Title object.
205 - * @param $section Integer: section number.
206 - * @param $hint Link String: title, or default if omitted or empty
207 - * @param $url Link String: for edit url
208 - * @param $result String: Returns the section [new][edit][reply] html if in a talk page - otherwise whatever came in with
209 - * @return true
210 - */
211 -
212 - function efDiscussionLink ($callobj, $nt, $section, $hint='', $url , &$result)
213 - {
214 - global $wgSectionThreadingOn;
215 - if($wgSectionThreadingOn && $nt->isTalkPage() ) {
216 - $commenturl = '&section='.$section.'&replyto=yes';
217 - $hint = ( $hint=='' ) ? '' : ' title="' . wfMsgHtml( 'replysectionhint', htmlspecialchars( $hint ) ) . '"';
218 - $curl = $callobj->makeKnownLinkObj( $nt, wfMsg('replysection'), 'action=edit'.$commenturl, '', '', '', $hint );
219 - $newthreadurl = '&section=new';
220 - $hint = ( $hint=='' ) ? '' : ' title="' . wfMsgHtml( 'threadnewsectionhint', htmlspecialchars( $hint ) ) . '"';
221 - $nurl = $callobj->makeKnownLinkObj( $nt, wfMsg('threadnewsection'), 'action=edit'.$newthreadurl, '', '', '', $hint );
222 - $result = "<span class=\"editsection\">[".$nurl."][".$url."][".$curl."]</span>";
223 - }
224 - return (true);
225 - }
226 -
227 - /**
228 - * This function is a hook used to test to see if empty, if so, start a comment
229 - *
230 - * @param $efform form object.
231 - * @return true
232 - */
233 -
234 -
235 - function efDiscussionThreadEdit ($efform) {
236 - global $wgRequest;
237 - $efform->replytosection = '';
238 - $efform->replyadded = false;
239 - $efform->replytosection = $wgRequest->getVal( 'replyto' );
240 - if( !$efform->mTitle->exists() ) {
241 - if($wgSectionThreadingOn && $efform->mTitle->isTalkPage() ) {
242 - $efform->section = 'new';
243 - }
244 - }
245 - return (true);
246 - }
247 -
248 - /**
249 - * Create a new header, one level below the 'replyto' header, add re: to front and tag it with user information
250 - *
251 - * @param $efform Form Object before display
252 - * @return true
253 - */
254 -
255 - function efDiscussionThread($efform){
256 - global $wgSectionThreadingOn;
257 - $wgSectionThreadingOn = isset($wgSectionThreadingOn) ? $wgSectionThreadingOn : false;
258 - if ( $efform->replytosection != '' && $wgSectionThreadingOn && !$efform->replyadded) {
259 - if ($efform->replytosection != '') {
260 - $text = $efform->textbox1;
261 - $matches = array();
262 - preg_match( "/^(=+)(.+)\\1/mi",
263 - $efform->textbox1,
264 - $matches );
265 - if( !empty( $matches[2] ) ) {
266 - preg_match( "/.*(-+)\\1/mi",$matches[2],$matchsign);
267 - if (!empty($matchsign[0]) ){
268 - $text = $text."\n\n".$matches[1]."=Re: ".trim($matchsign[0])." ~~~~".$matches[1]."=";
269 - } else {
270 - $text = $text."\n\n".$matches[1]."=Re: ".trim($matches[2])." -- ~~~~".$matches[1]."=";
271 - }
272 - } else {
273 - $text = $text." -- ~~~~<br>\n\n";
274 - }
275 - $efform->replyadded = true;
276 - $efform->textbox1 = $text;
277 - }
278 - return (true);
279 - }
280 - return (true);
281 - }
282 - /**
283 - * When the new header is created from summary in new (+) add comment, just stamp the header as created
284 - *
285 - * @param $efform Form Object before display
286 - * @return true
287 - */
288 -
289 - function efStampReply($efform){
290 - global $wgSectionThreadingOn;
291 - $wgSectionThreadingOn = isset($wgSectionThreadingOn) ? $wgSectionThreadingOn : false;
292 - if ( $efform->section == "new" && $wgSectionThreadingOn && !$efform->replyadded) {
293 - $efform->summary = $efform->summary." -- ~~~~";
294 - }
295 - return(true);
296 - }
297 -}
298 -?>
29971 </pre>
30072
301 -== Internationalisation file DiscussionThreading.i18n.php ==
 73+Patches required to Linker.php in all versions up to 1.11 - after that version, no patching required
30274
303 -I was only completely comfortable with the english translations - looking to others to help me put the correct language translations in.
304 -
305 -I would deeply appreciate your help here.
306 -
307 -Load into file (in extension DiscussionThreading.i18n.php)
308 -
309 -<pre>
310 -
311 -<?php
312 -/**
313 - * Internationalisation file for DiscussionThreading extension.
314 - *
315 - * @addtogroup Extensions
316 -*/
317 -
318 -$wgDiscussionThreadMessages = array();
319 -
320 -$wgDiscussionThreadMessages['en'] = array(
321 - 'replysection' => 'reply',
322 - 'replysectionhint' => "Reply to this Posting",
323 - 'threadnewsection' => 'new',
324 - 'threadnewsectionhint' => "Start a new thread"
325 -);
326 -
327 -/* Need to add
328 - af,br,bs,ca,cs,cy,de,et,eu,fi,fr,ga,gl,he,hr,hsb,id,is,it,ja,kk-kz,kk-tr,kk-cn,kk,lv,nl,
329 - no,nn,oc,pt,pt-br,ro,ru,sk,sl,sq,uk,wa,zh-cn,zh-tw,zh-yue,zh-hk,zh-sg
330 -
331 - Would do this by adding a new $wgDiscussionThreadMessages array example:
332 -
333 -$wgDiscussionThreadMessages['lang1'] = array(
334 - 'replysection' => 'lang1 - tag',
335 - 'replysectionhint' => "lang1 - hint",
336 - 'threadnewsection' => 'lang1 - new',
337 - 'threadnewsectionhint' => "'lang1 - Start a new thread"
338 -);
339 -*/
340 -?>
341 -</pre>
342 -
343 -Would add new languages with a new array per, using this array schema for each language:
344 -
345 -<pre>
346 -$wgDiscussionThreadMessages['lang1'] = array(
347 - 'replysection' => 'lang1 - tag',
348 - 'replysectionhint' => "lang1 - hint",
349 - 'threadnewsection' => 'lang1 - new',
350 - 'threadnewsectionhint' => "'lang1 - Start a new thread"
351 -);
352 -</pre>
353 -
35475 == Indenting Headers ==
35576
35677 If you are really serious about threading, you can indent headers by modifying the corresponding CSS file (eg. skins/monobook/main.css). To modify all headers (talk or regular article), you can add a 'padding-left: <small>''x''</small>em;' into each of the headers 3-6. Eg.:
@@ -362,7 +83,3 @@
36384 h5 .editsection { font-weight: normal; }<br>
36485 h6 { font-size: 80%; padding-left: <span style="color: red">4em</span>; }<br>
36586 h6 .editsection { font-size: 125%; font-weight: normal; }<br>
366 -
367 -
368 -<noinclude>[[Category:Extensions]]</noinclude>
369 -[[category:Uncategorized extension]]