]> sipb.mit.edu Git - ikiwiki.git/blob - doc/todo/inline:_numerical_ordering_by_title.mdwn
f76f8ca4fc41f82a078cd62c7111ae520edd2fe0
[ikiwiki.git] / doc / todo / inline:_numerical_ordering_by_title.mdwn
1 Could you please add numerical ordering by title to [[inline|plugins/inline]]
2 plugin? Now I can do only alphabetical order by title, but sometime it's not enough.
3
4 BTW, it seems that ordering by title is rather ordering by filename of page.
5 For me "title" means title of page I can set using `title` parameter
6 of [[meta|plugins/meta]] plugin :)
7
8 Why do I need that feature? I've just been migrating an info site of our university
9 [mail system](http://poczta.uw.edu.pl/) to Ikiwiki from very static, console handling
10 Makefile+[WML](http://thewml.org/)+XML+XSL=HTML solution. I have many news files
11 (`1.mdwn`, `2.mdwn`, etc.) and unfortunately I did very stupid thing. I've commited
12 all of them in the same revision of our Subversion repo...
13
14 Now I have a problem with sorting these files using inline plugin. I can't do
15 sorting by age, because both old and young news files have the same age. I can't
16 sort by title too. For example, when I sort them by title, then `9.mdwn` page is
17 between `90.mdwn` and `89.mdwn` pages... It sucks, of course. Sorting by mtime
18 also is not a solution for me, because it means that I can't touch/fix old news
19 anymore.
20
21 Do you have any idea how to workaround that issue? --[[Paweł|ptecza]]
22
23 > Maybe you can rename `9.mdwn` to `09.mdwn`? See `rename(1)`, it renames multiple files
24 > in one go. --[[buo]]
25
26 >> Thanks for your suggestion! But what about if number of my news files grows to 100+?
27
28 >>     $ ls
29 >>     09.mdwn  100.mdwn  101.mdwn  102.mdwn  89.mdwn  90.mdwn
30
31 >> I don't want to rename all previous files to add `0` prefix. --[[Paweł|ptecza]]
32
33 >>> Rather than adding 0's or or a 'sorttype' parameter, I'd just fix the sort order.
34 >>> Both MacOS and Windows use a smarter sort order than just lexical in their
35 >>> file browsers (e.g. <http://support.microsoft.com/default.aspx?kbid=319827>,
36 >>> <http://docs.info.apple.com/article.html?artnum=300989>).
37 >>>
38 >>> The [Unicode Collation algorithm](http://en.wikipedia.org/wiki/Unicode_collation_algorithm)
39 >>> would seem to be a reasonable sort order.  (See also <http://www.unicode.org/unicode/reports/tr10/>.)
40 >>> Unfortunately the standard perl implementation, [Unicode::Collate](http://perldoc.perl.org/Unicode/Collate.html)
41 >>> doesn't handle the optional [numbers](http://www.unicode.org/unicode/reports/tr10/#Customization)
42 >>> extension which is what you want.  --[[Will]]
43
44 ---
45
46 Below is my simple patch. Feel free to use it or comment!
47
48 I have also 2 considerations for inline sorting:
49
50 1. Maybe changing name of `sort` parameter to `sortby` or `sortkey` will
51    be good idea?
52 1. Maybe you should use `title` sort key for title from meta plugin and `name`, 
53    `filename`, `page` or `pagename` for page names? In the future you can also
54    sort by meta author, license or another key.
55
56 --[[Paweł|ptecza]]
57
58     --- inline.pm-orig  2008-09-02 09:53:20.000000000 +0200
59     +++ inline.pm       2008-09-02 10:09:02.000000000 +0200
60     @@ -186,7 +186,15 @@
61         }
62
63         if (exists $params{sort} && $params{sort} eq 'title') {
64     -           @list=sort { pagetitle(basename($a)) cmp pagetitle(basename($b)) } @list;
65     +           if (! $params{sorttype} || $params{sorttype} eq 'lexical') {
66     +                   @list=sort { pagetitle(basename($a)) cmp pagetitle(basename($b)) } @list;
67     +           }
68     +           elsif ($params{sorttype} eq 'numeric') {
69     +                   @list=sort { pagetitle(basename($a)) <=> pagetitle(basename($b)) } @list;
70     +           }
71     +           else {
72     +                   return sprintf(gettext("unknown sort type %s"), $params{sorttype});
73     +           }
74         }
75         elsif (exists $params{sort} && $params{sort} eq 'mtime') {
76                 @list=sort { $pagemtime{$b} <=> $pagemtime{$a} } @list;
77     @@ -195,7 +203,7 @@
78                 @list=sort { $pagectime{$b} <=> $pagectime{$a} } @list;
79         }
80         else {
81     -           return sprintf(gettext("unknown sort type %s"), $params{sort});
82     +           return sprintf(gettext("unknown sort key %s"), $params{sort});
83         }
84
85         if (yesno($params{reverse})) {
86
87 ---
88
89 Joey, have you forgotten about that request? ;) --[[Paweł|ptecza]]
90
91 > Okie.  Here is a different [[patch]] based on my comment above.  It doesn't introduce
92 > a new key, but rather changes the title sorting order. Two caveats:
93
94  * I've only tested this in `inline`, not the other places I changed the sort order.
95  * I'm unsure if the regexp used in the split should be `/(-?\d+)/` instead of `/(\d+)/`.
96     As written, '-' is interpreted as a hyphen rather than a minus sign.
97
98 > --[[Will]]
99
100 >> Hi Will! Your idea looks interesting for me, but I'm affraid that it's too big
101 >> change in Ikiwiki... Maybe I'm wrong? ;) What do you think, Joey? --[[Paweł|ptecza]]
102
103 ----
104
105     diff --git a/IkiWiki.pm b/IkiWiki.pm
106     index c0f5dea..d001f8d 100644
107     --- a/IkiWiki.pm
108     +++ b/IkiWiki.pm
109     @@ -20,7 +20,7 @@ use Exporter q{import};
110      our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
111                       bestlink htmllink readfile writefile pagetype srcfile pagename
112                       displaytime will_render gettext urlto targetpage
113     -            add_underlay
114     +            add_underlay titlecmp
115                       %config %links %pagestate %renderedfiles
116                       %pagesources %destsources);
117      our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
118     @@ -835,6 +835,42 @@ sub titlepage ($) { #{{{
119         return $title;
120      } #}}}
121      
122     +sub titlecmp ($$) { #{{{
123     +   my $titleA=shift;
124     +   my $titleB=shift;
125     +   
126     +   my @listA=split(/(\d+)/,$titleA);
127     +   my @listB=split(/(\d+)/,$titleB);
128     +   
129     +   while (@listA && @listB) {
130     +           # compare bits of text
131     +           my $a = shift @listA;
132     +           my $b = shift @listB;
133     +           my $c = ($a cmp $b);
134     +           return $c if ($c);
135     +
136     +           if (@listA && @listB) {
137     +                   # compare numbers
138     +                   $a = shift @listA;
139     +                   $b = shift @listB;
140     +                   $c = $a <=> $b;
141     +                   return $c if ($c);
142     +                   
143     +                   # 01 is different to 1
144     +                   $c = (length($a) <=> length($b));
145     +                   return $c if ($c);
146     +
147     +                   $c = ($a cmp $b);
148     +                   return $c if ($c);
149     +           }
150     +   }
151     +   
152     +   return 1 if (@listA);
153     +   return -1 if (@listB);
154     +   
155     +   return 0;
156     +} #}}}
157     +
158      sub linkpage ($) { #{{{
159         my $link=shift;
160         my $chars = defined $config{wiki_file_chars} ? $config{wiki_file_chars} : "-[:alnum:]+/.:_";
161     diff --git a/IkiWiki/Plugin/brokenlinks.pm b/IkiWiki/Plugin/brokenlinks.pm
162     index 37752dd..ccaa399 100644
163     --- a/IkiWiki/Plugin/brokenlinks.pm
164     +++ b/IkiWiki/Plugin/brokenlinks.pm
165     @@ -59,7 +59,7 @@ sub preprocess (@) { #{{{
166                         map {
167                                 "<li>$_</li>"
168                         }
169     -                   sort @broken)
170     +                   sort titlecmp @broken)
171                 ."</ul>\n";
172      } # }}}
173      
174     diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
175     index 8efef3f..263e7a6 100644
176     --- a/IkiWiki/Plugin/inline.pm
177     +++ b/IkiWiki/Plugin/inline.pm
178     @@ -192,7 +192,7 @@ sub preprocess_inline (@) { #{{{
179         }
180      
181         if (exists $params{sort} && $params{sort} eq 'title') {
182     -           @list=sort { pagetitle(basename($a)) cmp pagetitle(basename($b)) } @list;
183     +           @list=sort { titlecmp(pagetitle(basename($a)),pagetitle(basename($b))) } @list;
184         }
185         elsif (exists $params{sort} && $params{sort} eq 'mtime') {
186                 @list=sort { $pagemtime{$b} <=> $pagemtime{$a} } @list;
187     diff --git a/IkiWiki/Plugin/orphans.pm b/IkiWiki/Plugin/orphans.pm
188     index b910758..10a1d87 100644
189     --- a/IkiWiki/Plugin/orphans.pm
190     +++ b/IkiWiki/Plugin/orphans.pm
191     @@ -56,7 +56,7 @@ sub preprocess (@) { #{{{
192                                 htmllink($params{page}, $params{destpage}, $_,
193                                          noimageinline => 1).
194                                 "</li>"
195     -                   } sort @orphans).
196     +                   } sort titlecmp @orphans).
197                 "</ul>\n";
198      } # }}}
199      
200     diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
201     index ceb7c84..00798e1 100644
202     --- a/IkiWiki/Render.pm
203     +++ b/IkiWiki/Render.pm
204     @@ -89,7 +89,7 @@ sub genpage ($$) { #{{{
205                 $template->param(have_actions => 1);
206         }
207      
208     -   my @backlinks=sort { $a->{page} cmp $b->{page} } backlinks($page);
209     +   my @backlinks=sort { titlecmp($a->{page}, $b->{page}) } backlinks($page);
210         my ($backlinks, $more_backlinks);
211         if (@backlinks <= $config{numbacklinks} || ! $config{numbacklinks}) {
212                 $backlinks=\@backlinks;