some fixes; my .emacs glue
[emacs-confluence-mode.git] / simple-confluence-wiki-mode.el
1 ;;; simple-confluence-wiki-mode.el --- edit local raw confluence wiki pages
2
3 ;; Copyright (C) 2007 David Blacka
4
5 ;; Author: David Blacka <david@blacka.com>
6 ;; Keywords: hypermedia
7
8 ;; This file is not part of GNU Emacs.
9
10 ;; This is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; This is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Commentary:
26
27 ;; This is a customization of simple-wiki-mode for Atlassian's
28 ;; Confluence Wiki (a commercial wiki package).
29 ;;
30 ;; The customization mostly provides font-lock support for
31 ;; Confluence's specific form of wikitext.
32 ;;
33 ;; This is a work-in-progress, and, as such, only supports a fraction
34 ;; of the wikitext.
35
36 (require 'simple-wiki)
37
38 (defun simple-confluencewiki-match-macro (macro limit)
39   "Font lock matcher for regions within {macro}{macro}"
40   (when (search-forward-regexp (concat "{" macro "\\(:.*?\\)?}") limit t)
41     (let ((beg (match-end 0)) end)
42       (if (search-forward (concat "{" macro "}") (point-max) t)
43           (setq end (match-beginning 0))
44         (setq end (point)))
45       (store-match-data (list beg end))
46       t)))
47
48 ;; create matcher defuns for all of the relevant macros
49 (dolist (macro '("noformat" "code"))
50   (eval `(defun ,(intern (concat "simple-confluencewiki-match-macro-" macro))
51            (limit)
52            (simple-confluencewiki-match-macro ,macro limit))))
53
54 ;; Define the major mode itself
55 (simple-wiki-define-major-mode
56  'confluencewiki
57  "Confluence"
58  "Simple mode to edit Confluence pages.
59 \\{simple-confluencewiki-mode-map}"
60
61  ;; no camelcasing.
62  :camelcase 'none
63
64  ;; Basically all links in Confluence are "free" links.
65  :free-link '("\\[\\([^[\n]+?\\)\\]" . 1)
66   
67  ;; no smilies
68  :smilies 'none
69
70  ;; no (html) tags
71  :tags 'none
72
73  ;; line breaks are "\\ ".  Unfortunately, a literal \ translates to
74  ;; four of them in a regexp.
75  :linebreak '("\\\\\\\\ " . 0)
76
77  ;; refine bullets an enums to require a following whitespace character
78  :enum '("^\\([*#]*#+\\)\\([    ]\\|$\\)" . 1)
79  :bullet '("^\\([*#]*\\*+\\)\\([        ]\\|$\\)" . 1)
80
81  ;; italics are _foo_ (which should be underline, but whatever)
82  :em-strings '("_" . "_")
83  ;; this is a list of 'italics', 'bold', and 'bold-italics' patterns.
84  :em-patterns '(("\\(^\\|\\W\\)\\(_[^   ].*?_\\)\\(\\W\\|$\\)" . 2) ;; italics
85                 ("\\(^\\|\\W\\)\\([*][^         ].*?[*]\\)" . 2) ;; bold
86                 ("\\(^\\|\\W\\)\\([_*]\\{2\\}[^         ].*?[*_]\\{2\\}\\)" . 2) ;; bold+italics
87                 )
88
89  :strong-strings '("*" . "*")
90  :strong-em-strings '("*_" . "_*")
91
92  ;; headlines are specified in a list of various headline levels
93  :headlines '(("^h1\\..*$" . 0)
94               ("^h2\\..*$" . 0)
95               ("^h3\\..*$" . 0)
96               ("^h4\\..*$" . 0)
97               ("^h5\\..*$" . 0)
98               ("^h[6-9]\\..*$" . 0))
99  
100  ;; no way to indent in confluence
101  :indent 'none
102
103  ;; no definition lists in confluence, either.
104  :deflist 'none
105
106  ;; Additional font-lock magic.
107  :keywords
108  '(
109    ;; underlining is +foo+.
110    ("\\(^\\|\\W\\)\\(\\+.*?\\+\\)" 2 'simple-wiki-underline-face t)
111    ;; monospacing single words is done with {{some words}}
112    ("{{\\([^{}]+?\\)}}" 1 'simple-wiki-teletype-face t)
113    ;; generically, macros are {macro:param="value"|param2="value2"}
114    ("\\(^\\|[^{]\\){\\([^{}]*?\\)}" 2 'font-lock-comment-face t) ; macros
115    ;; code and noformat regions are pretty similar to each other.
116    (simple-confluencewiki-match-macro-noformat . (0 'simple-wiki-code-face
117                                                     prepend))
118    (simple-confluencewiki-match-macro-code . (0 'simple-wiki-code-face prepend))
119    ;; set the table header in bold
120    ("^||.*||$" 0 'simple-wiki-bold-face t)
121    ;; html entities
122    ("&[a-z]\\{1,8\\}+;" 0 'font-lock-type-face)
123    ;; Image links
124    ("![^    ]+!" 0 'simple-wiki-local-link-face append)
125   )
126  )
127
128 (provide 'simple-confluence-wiki-mode)