aboutsummaryrefslogtreecommitdiff
path: root/doc/todo/syntax_highlighting.mdwn
blob: d9a791c6f9e823695a9fe9eab768293894808bd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
There's been a lot of work on contrib syntax highlighting plugins. One should be
picked and added to ikiwiki core.

Ideally, it should support both converting whole source files into wiki
pages, as well as doing syntax highlighting as a preprocessor directive 
(which is either passed the text, or reads it from a file).

## The big list of possibilities

* [[plugins/contrib/highlightcode]] uses [[!cpan Syntax::Highlight::Engine::Kate]],
  operates on whole source files only, has a few bugs (see
  [here](http://u32.net/Highlight_Code_Plugin/), and needs to be updated to
  support [[bugs/multiple_pages_with_same_name]].
* [[!cpan IkiWiki-Plugin-syntax]] only operates as a directive.
  Interestingly, it supports multiple highlighting backends, including Kate
  and Vim.
* [[plugins/contrib/syntax]] only operates as a directive
  ([[not_on_source_code_files|automatic_use_of_syntax_plugin_on_source_code_files]]),
  and uses [[!cpan Text::VimColor]].
* [[plugins/contrib/sourcehighlight]] uses src-highlight, and operates on
  whole source files only. Needs to be updated to
  support [[bugs/multiple_pages_with_same_name]].
* [[sourcecode|todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion]]
  also uses src-highlight, and operates on whole source files.
  Updated to work with the fix for [[bugs/multiple_pages_with_same_name]].  Untested with files with no extension, e.g. `Makefile`.
* [[users/jasonblevins]]'s code plugin uses src-highlight, and supports both
  while file and directive use.

## General problems

* Using non-perl syntax highlighting backends is slow. I'd prefer either
  using a perl module, or a multiple-backend solution that can use a perl
  module as one option. (Or, if there's a great highlighter python module,
  we could use an external plugin..)
* Currently no single plugin supports both modes of operation (directive
  and whole source file to page).

  > This is now fixed by the [[ikiwiki/directive/format]] directive for all
  > whole-source-file plugins, right?

* Nothing seems to support 
  [[wiki-formatted_comments|wiki-formatted_comments_with_syntax_plugin]]
  inside source files. Doing this probably means post-processing the 
  results of the highlighting engine, to find places where it's highlighted
  comments, and then running them through the ikiwiki rendering pipeline.
  This seems fairly doable with [[!cpan Syntax::Highlight::Engine::Kate]],
  at least.
* The whole-file plugins tend to have a problem that things that look like
  wikilinks in the source code get munged into links by ikiwiki, which can
  have confusing results. Similar problem with preprocessor directives.
  One approach that's also been requested for eg,
  [[plugins/contrib/mediawiki]] is to allow controlling which linkification
  types a page type can have on it.

  > The previous two points seem to be related.  One thought: instead of
  > getting the source from the `content` parameter, the plugin could
  > re-load the page source.  That would stop directives/links from
  > being processed in the source.  As noted above, comments
  > could then be parsed for directives/links later.
  >
  > Would it be worth adding a `nodirectives` option when registering
  > an htmlize hook that switches off directive and link processing before
  > generating the html for a page?

* The whole-file plugins all get confused if there is a `foo.c` and a `foo.h`.
  This is trivially fixable now by passing the keepextension option when
  registering the htmlize hooks, though.
* Whole-file plugins register a bunch of htmlize hooks. The wacky thing
  about it is that, when creating a new page, you can then pick "c" or
  "h" or "pl" etc from the dropdown that normally has "mdwn" etc in it.
  Is this a bug, or a feature? (Even if a feature, plugins with many
  extensions make the dropdown unusable.. One way to deal with that is have
  a config setting that lists what extensions to offer highlighting for.
  Most people won't need/want the dozens some engines support.)
* The per page highlighters can't handle creating wiki pages from 
  "Makefile", or other files without a significant extension.
  Not clear how to fix this, as ikiwiki is very oriented toward file
  extensions. The workaround is to use a directive on a wiki page, pulling
  in the Makefile.

  > I wonder how hard it would be to make a patch whereby a file with
  > no `.` in the name, and a name that matches a filetype, and where
  > that filetype was registered `keepextension`, then the file is just
  > chosen as the appropriate type.  This would allow `Makefile` to
  > work.

like this:

    diff --git a/IkiWiki.pm b/IkiWiki.pm
    index 8d728c9..1bd46a9 100644
    --- a/IkiWiki.pm
    +++ b/IkiWiki.pm
    @@ -618,6 +618,8 @@ sub pagetype ($) {
     	
     	if ($page =~ /\.([^.]+)$/) {
     		return $1 if exists $hooks{htmlize}{$1};
    +	} elsif ($hooks{htmlize}{$page}{keepextension}) {
    +		return $page;
     	}
     	return;
     }

## format directive

Rather than making syntax highlight plugins have to provide a preprocessor
directive as well as handling whole source files, perhaps a generic format
directive could be used:

	\[[!format pl """..."""]]

That would run the text through the pl htmlizer, from the syntax hightligh
plugin. OTOH, if "rst" were given, it would run the text through the rst
htmlizer. So, more generic, allows mixing different types of markup on one
page, as well as syntax highlighting. Does require specifying the type of
format, instead of allowing it to be guessed (which some syntax highlighters
can do). (This directive is now implemented..)

Hmm, this would also allow comments inside source files to have mdwn
embedded in them, without making the use of mdwn a special case, or needing
to postprocess the syntax highlighter output to find comments.

	/* \[[!format mdwn """

	This is a comment in my C file. You can use mdwn in here.

	"""]] */

Note that this assumes that directives are expanded in source files.