1Here's an idea with [[patch]] for extending inline in two directions:
2
31. Permit the content-fetching function to return undef to skip a page. The limiting of @list to a set size is performed after that filtering.
42. Permit other directive plugins to pass a function to generate content via an inliner_ parameter. The current patch doesn't try to remove that key from the parameters, so hilarity might ensue if someone is too clever. I suppose I should fix that... My *intent* is that other, custom directives can add inliner_.
5
6The diff looks large because the first requires switching some loops.
7
8I'm using this along with a custom BibTeX formatter (one item per file) to generate larger pages and tiny listings. I still need to hammer the templates for that, but I think that's possible without further patches.
9
10(Setting up a git branch for a single plugin is a pain, but I can if necessary. I also could separate this into some sequence rather than all at once, but I won't have time for a week or two.)
11
12-- [[JasonRiedy]]
13
14<pre><code>
15--- /home/ejr/src/git.ikiwiki.info/IkiWiki/Plugin/inline.pm	2011-03-05 14:18:30.261293808 -0500
16+++ inline.pm	2011-03-06 21:44:18.887903638 -0500
17@@ -185,6 +185,7 @@
18 	}
19
20 	my @list;
21+	my $num = 0;
22
23 	if (exists $params{pagenames}) {
24 		foreach my $p (qw(sort pages)) {
25@@ -213,23 +214,121 @@
26 		if ($params{feedshow} && $num < $params{feedshow} && $num > 0) {
27 			$num=$params{feedshow};
28 		}
29-		if ($params{skip} && $num) {
30-			$num+=$params{skip};
31-		}
32
33 		@list = pagespec_match_list($params{page}, $params{pages},
34 			deptype => deptype($quick ? "presence" : "content"),
35 			filter => sub { $_[0] eq $params{page} },
36 			sort => exists $params{sort} ? $params{sort} : "age",
37 			reverse => yesno($params{reverse}),
38-			($num ? (num => $num) : ()),
39 		);
40 	}
41
42 	if (exists $params{skip}) {
43 		@list=@list[$params{skip} .. $#list];
44 	}
45+
46+	if ($params{show} && $params{show} > $num) {
47+		$num = $params{show}
48+	}
49+
50+	my $ret="";
51+	my @displist;
52+	if ($feedonly) {
53+		@displist = @list;
54+	} else {
55+		my $template;
56+		if (! $raw) {
57+			# cannot use wiki pages as templates; template not sanitized due to
58+			# format hook hack
59+			eval {
60+				$template=template_depends($params{template}.".tmpl", $params{page},
61+					blind_cache => 1);
62+			};
63+			if ($@) {
64+				error sprintf(gettext("failed to process template %s"), $params{template}.".tmpl").": $@";
65+			}
66+		}
67+		my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
68+
69+		foreach my $page (@list) {
70+			last if ($num && scalar @displist >= $num);
71+			my $file = $pagesources{$page};
72+			my $type = pagetype($file);
73+			if (! $raw) {
74+				# Get the content before populating the
75+				# template, since getting the content uses
76+				# the same template if inlines are nested.
77+				if ($needcontent) {
78+					my $content;
79+					if (exists $params{inliner_} && defined $params{inliner_}) {
80+						$content = &{$params{inliner_}}($page, $template, %params);
81+					} else {
82+						$content=get_inline_content($page, $params{destpage});
83+					}
84+					next if !defined $content;
85+					$template->param(content => $content);
86+					push @displist, $page;
87+				}
88+				$template->param(pageurl => urlto($page, $params{destpage}));
89+				$template->param(inlinepage => $page);
90+				$template->param(title => pagetitle(basename($page)));
91+				$template->param(ctime => displaytime($pagectime{$page}, $params{timeformat}, 1));
92+				$template->param(mtime => displaytime($pagemtime{$page}, $params{timeformat}));
93+				$template->param(first => 1) if $page eq $list[0];
94+				$template->param(last => 1) if ($num && scalar @displist == $num);
95+				$template->param(html5 => $config{html5});
96
97+				if ($actions) {
98+					my $file = $pagesources{$page};
99+					my $type = pagetype($file);
100+					if ($config{discussion}) {
101+						if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
102+						    (length $config{cgiurl} ||
103+						     exists $pagesources{$page."/".lc($config{discussionpage})})) {
104+							$template->param(have_actions => 1);
105+							$template->param(discussionlink =>
106+								htmllink($page,
107+									$params{destpage},
108+									$config{discussionpage},
109+									noimageinline => 1,
110+									forcesubpage => 1));
111+						}
112+					}
113+					if (length $config{cgiurl} &&
114+					    defined $type &&
115+					    IkiWiki->can("cgi_editpage")) {
116+						$template->param(have_actions => 1);
117+						$template->param(editurl => cgiurl(do => "edit", page => $page));
118+
119+					}
120+				}
121+
122+				run_hooks(pagetemplate => sub {
123+					shift->(page => $page, destpage => $params{destpage},
124+						template => $template,);
125+				});
126+
127+				$ret.=$template->output;
128+				$template->clear_params;
129+			}
130+			else {
131+				if (defined $type) {
132+					$ret.="\n".
133+					      linkify($page, $params{destpage},
134+					      preprocess($page, $params{destpage},
135+					      filter($page, $params{destpage},
136+					      readfile(srcfile($file)))));
137+				}
138+				else {
139+					$ret.="\n".
140+					      readfile(srcfile($file));
141+				}
142+				push @displist, $page;
143+			}
144+		}
145+	}
146+	@list = @displist;
147+
148 	my @feedlist;
149 	if ($feeds) {
150 		if (exists $params{feedshow} &&
151@@ -241,10 +340,6 @@
152 		}
153 	}
154
155-	if ($params{show} && @list > $params{show}) {
156-		@list=@list[0..$params{show} - 1];
157-	}
158-
159 	if ($feeds && exists $params{feedpages}) {
160 		@feedlist = pagespec_match_list(
161 			$params{page}, "($params{pages}) and ($params{feedpages})",
162@@ -302,8 +397,6 @@
163 		}
164 	}
165
166-	my $ret="";
167-
168 	if (length $config{cgiurl} && ! $params{preview} && (exists $params{rootpage} ||
169 	    (exists $params{postform} && yesno($params{postform}))) &&
170 	    IkiWiki->can("cgi_editpage")) {
171@@ -355,91 +448,7 @@
172 		}
173 		$ret.=$linktemplate->output;
174 	}
175-
176-	if (! $feedonly) {
177-		my $template;
178-		if (! $raw) {
179-			# cannot use wiki pages as templates; template not sanitized due to
180-			# format hook hack
181-			eval {
182-				$template=template_depends($params{template}.".tmpl", $params{page},
183-					blind_cache => 1);
184-			};
185-			if ($@) {
186-				error sprintf(gettext("failed to process template %s"), $params{template}.".tmpl").": $@";
187-			}
188-		}
189-		my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
190-
191-		foreach my $page (@list) {
192-			my $file = $pagesources{$page};
193-			my $type = pagetype($file);
194-			if (! $raw) {
195-				if ($needcontent) {
196-					# Get the content before populating the
197-					# template, since getting the content uses
198-					# the same template if inlines are nested.
199-					my $content=get_inline_content($page, $params{destpage});
200-					$template->param(content => $content);
201-				}
202-				$template->param(pageurl => urlto($page, $params{destpage}));
203-				$template->param(inlinepage => $page);
204-				$template->param(title => pagetitle(basename($page)));
205-				$template->param(ctime => displaytime($pagectime{$page}, $params{timeformat}, 1));
206-				$template->param(mtime => displaytime($pagemtime{$page}, $params{timeformat}));
207-				$template->param(first => 1) if $page eq $list[0];
208-				$template->param(last => 1) if $page eq $list[$#list];
209-				$template->param(html5 => $config{html5});
210-
211-				if ($actions) {
212-					my $file = $pagesources{$page};
213-					my $type = pagetype($file);
214-					if ($config{discussion}) {
215-						if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
216-						    (length $config{cgiurl} ||
217-						     exists $pagesources{$page."/".lc($config{discussionpage})})) {
218-							$template->param(have_actions => 1);
219-							$template->param(discussionlink =>
220-								htmllink($page,
221-									$params{destpage},
222-									$config{discussionpage},
223-									noimageinline => 1,
224-									forcesubpage => 1));
225-						}
226-					}
227-					if (length $config{cgiurl} &&
228-					    defined $type &&
229-					    IkiWiki->can("cgi_editpage")) {
230-						$template->param(have_actions => 1);
231-						$template->param(editurl => cgiurl(do => "edit", page => $page));
232
233-					}
234-				}
235-
236-				run_hooks(pagetemplate => sub {
237-					shift->(page => $page, destpage => $params{destpage},
238-						template => $template,);
239-				});
240-
241-				$ret.=$template->output;
242-				$template->clear_params;
243-			}
244-			else {
245-				if (defined $type) {
246-					$ret.="\n".
247-					      linkify($page, $params{destpage},
248-					      preprocess($page, $params{destpage},
249-					      filter($page, $params{destpage},
250-					      readfile(srcfile($file)))));
251-				}
252-				else {
253-					$ret.="\n".
254-					      readfile(srcfile($file));
255-				}
256-			}
257-		}
258-	}
259-
260 	if ($feeds && ($emptyfeeds || @feedlist)) {
261 		if ($rss) {
262 			my $rssp=$feedbase."rss".$feednum;
263</code></pre>
264