[Wikipedia-l] Numbered section headings within an article

Lars Aronsson lars at aronsson.se
Tue Jul 16 03:45:09 UTC 2002


The other day, I implemented numbered section headlines in my wiki, which
I think is very useful.  I suggest that they should be added to the
Wikipedia software as well.  I'm not very familiar with the PHP source
code, so I hope someone else can write the program from my description:

Here is the problem: You have a long and well written article, e.g.
http://fr.wikipedia.com/wiki.cgi?Pharaon
All it needs is some structure from sections and headings.  There is no
need really to break it into smaller articles.  It's a fine article.

And the solution: In the wiki text, lines that begin with "!" are
headings in different levels, like this:

    !hahaha           <h1>1. hahaha</h1>
    !hehehe           <h1>2. hehehe</h1>
    !!hoho            <h2>2.1 hoho</h2>
    !!hihi            <h2>2.2 hihi</h2>
    !huhuhu           <h1>3. huhuhu</h1>
    !!!hy             <h3>3.0.1 hy</h3>

The number of "!"s indicate the level of heading and numbers are
assigned in sequence.  Since 3.1 is missing, the level 3 heading that
comes immediately after 3. is called 3.0.1.

At the top of the generated HTML code, a short table of content is placed
that links to the right section.


Here is some Perl code for UseModWiki that implements this:

my $ToC;
my @HeaderStack;
sub StoreHeader {
  my ($bangs, $header) = @_;
  my $level = length $bangs;
  while ($#HeaderStack +1 > $level) {
      pop @HeaderStack;
  }
  while ($#HeaderStack +1 < $level) {
      push @HeaderStack, 0;
  }
  $HeaderStack[$level - 1]++;
  my $num = join ".", @HeaderStack;
  my $dot = "";
  $dot = "." if $level == 1;
  $ToC .= " - <a href=\"#$num\" >$num$dot $header</a>\n" if $level <= 3;
  return StoreRaw("<a name=\"$num\"></a><h$level>") . "$num$dot $header" .
Store
Raw("</h$level>");
}

# in sub WikiLinesToHTML:
  @HeaderStack = ();
  $ToC = "";
      ... # foreach line in the article...
      } else {
        $depth = 0;
        s/^(!+)(.*)$/&StoreHeader($1, $2)/eo;
      }
      ...
  return $pageHtml if $ToC eq '';
  return '<b>' . T('Table of Contents') . '</b> ' . $ToC . '<p>' . $pageHtml;


You should get the idea.  It's really simple.  Two examples of the use are
http://susning.nu/Hello_world
http://susning.nu/Schack


-- 
  Lars Aronsson (lars at aronsson.se)
  tel +46-70-7891609
  http://aronsson.se/  http://elektrosmog.nu/  http://susning.nu/




More information about the Wikipedia-l mailing list