aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--wiki-faces.el108
-rw-r--r--wiki-markup.el121
-rw-r--r--wiki.el32
4 files changed, 262 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e4e5f6c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*~ \ No newline at end of file
diff --git a/wiki-faces.el b/wiki-faces.el
new file mode 100644
index 0000000..00a346a
--- /dev/null
+++ b/wiki-faces.el
@@ -0,0 +1,108 @@
+;;; wiki-faces.el -- faces for wiki-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2023 Free Software Foundation.
+
+;; Author: Yuchen Pei <id@ypei.org>
+;; Package-Requires: ((emacs "28.2"))
+
+;; This file is part of dotted.
+
+;; dotted is free software: you can redistribute it and/or modify it under
+;; the terms of the GNU Affero General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; dotted is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
+;; Public License for more details.
+
+;; You should have received a copy of the GNU Affero General Public
+;; License along with dotted. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; faces for wiki-mode.
+
+;;; Code:
+
+(defgroup wiki-faces nil
+ "Faces in wiki mode."
+ :tag "Wiki Faces"
+ :group 'wiki-appearance)
+
+(defface wiki-level-1 '((t :inherit outline-1))
+ "Face used for level 1 headlines."
+ :group 'wiki-faces)
+
+(defvar wiki-level-1 'wiki-level-1
+ "Face used for level 1 headlines.")
+
+(defface wiki-level-2 '((t :inherit outline-2))
+ "Face used for level 2 headlines."
+ :group 'wiki-faces)
+
+(defvar wiki-level-2 'wiki-level-2
+ "Face used for level 2 headlines.")
+
+(defface wiki-level-3 '((t :inherit outline-3))
+ "Face used for level 3 headlines."
+ :group 'wiki-faces)
+
+(defvar wiki-level-3 'wiki-level-3
+ "Face used for level 3 headlines.")
+
+(defface wiki-level-4 '((t :inherit outline-4))
+ "Face used for level 4 headlines."
+ :group 'wiki-faces)
+
+(defvar wiki-level-4 'wiki-level-4
+ "Face used for level 4 headlines.")
+
+(defface wiki-level-5 '((t :inherit outline-5))
+ "Face used for level 5 headlines."
+ :group 'wiki-faces)
+
+(defvar wiki-level-5 'wiki-level-5
+ "Face used for level 5 headlines.")
+
+(defface wiki-level-6 '((t :inherit outline-6))
+ "Face used for level 6 headlines."
+ :group 'wiki-faces)
+
+(defvar wiki-level-6 'wiki-level-6
+ "Face used for level 6 headlines.")
+
+(defface wiki-hr-face '((t :inherit font-lock-builtin-face))
+ "Wiki hrule face")
+
+(defvar wiki-hr-face 'wiki-hr-face
+ "Wiki hrule face")
+
+(defface wiki-bold-italic '((t :inherit bold-italic))
+ "Wiki bold-italic face")
+
+(defvar wiki-bold-italic 'wiki-bold-italic
+ "Wiki bold-italic face")
+
+(defface wiki-bold '((t :inherit bold))
+ "Wiki bold face")
+
+(defvar wiki-bold 'wiki-bold
+ "Wiki bold face")
+
+(defface wiki-italic '((t :inherit italic))
+ "Wiki italic face")
+
+(defvar wiki-italic 'wiki-italic "Wiki italic face")
+
+(defface wiki-pre-face '((t :inherit org-code)) "Wiki pre face")
+
+(defvar wiki-pre-face 'wiki-pre-face "Wiki pre face")
+
+(defface wiki-link '((t :inherit org-link)) "Wiki link face")
+
+(defvar wiki-link 'wiki-link "Wiki link face")
+
+(provide 'wiki-faces)
+;;; wiki-faces.el ends here
diff --git a/wiki-markup.el b/wiki-markup.el
new file mode 100644
index 0000000..45bc740
--- /dev/null
+++ b/wiki-markup.el
@@ -0,0 +1,121 @@
+;;; wiki-markup.el -- A wikitext mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2023 Free Software Foundation.
+
+;; Author: Yuchen Pei <id@ypei.org>
+;; Package-Requires: ((emacs "28.2"))
+
+;; This file is part of wiki-markup.el.
+
+;; wiki-markup.el is free software: you can redistribute it and/or modify it under
+;; the terms of the GNU Affero General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; wiki-markup.el is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
+;; Public License for more details.
+
+;; You should have received a copy of the GNU Affero General Public
+;; License along with wiki-markup.el. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; A wikitext mode for wiki-markup
+
+;;; Code:
+(require 'wiki-faces)
+
+(defvar wiki-url-regexp "https?://[^ ]+")
+
+(defvar wiki-external-link-re
+ (rx (seq "[["
+ (group (seq "http"
+ (opt "s")
+ "://"
+ (+ (not " "))))
+ (opt (seq " " (group (+? anything))))
+ "]]")))
+
+(defvar wiki-internal-link-re
+ (rx (seq "[["
+ ;; Target
+ (group
+ (one-or-more
+ (not (any "[|]"))))
+ ;; Label (optional)
+ (opt (seq "|" (group (+? anything))))
+ "]]"))
+ )
+
+(defvar wiki-font-lock-keywords
+ (list
+ (cons "^======.*======\\ *$" 'wiki-level-6)
+ (cons "^=====.*=====\\ *$" 'wiki-level-5)
+ (cons "^====.*====\\ *$" 'wiki-level-4)
+ (cons "^===.*===\\ *$" 'wiki-level-3)
+ (cons "^==.*==\\ *$" 'wiki-level-2)
+ (cons "^=.*=\\ *$" 'wiki-level-1)
+ (cons "^----+\\ *$" 'wiki-hr-face)
+ (cons "'''''[^ \t\n].*?[^ \t\n]'''''" 'wiki-bold-italic)
+ (cons "'''[^ \t\n'].*?[^ \t\n']'''" 'wiki-bold)
+ (cons "''[^ \t\n'].*?[^ \t\n']''" 'wiki-italic)
+ (cons "^ .*$" 'wiki-pre-face)
+ '(wiki-activate-external-links)
+ '(wiki-activate-internal-links)
+ ))
+
+(defvar wiki-outline-regexp "=+.*=+\ *$")
+
+(defun wiki-outline-level ()
+ (when (looking-at "\\(=+\\).*\\(=+\\)\ *$")
+ (min (length (match-string 1))
+ (length (match-string 2))
+ 6)))
+
+;; Like `org-activate-links'
+(defun wiki-activate-links (link-re limit)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward link-re limit t)
+ (let ((start (match-beginning 0))
+ (end (match-end 0))
+ (visible-start (or (match-beginning 2) (match-beginning 1)))
+ (visible-end (or (match-end 2) (match-end 1)))
+ )
+ (put-text-property start visible-start 'invisible t)
+ (put-text-property start end 'font-lock-face 'wiki-link)
+ (put-text-property visible-end end 'invisible t)
+ (add-text-properties (1- visible-start) visible-start
+ '(rear-nonsticky (invisible)))
+ (add-text-properties (1- visible-end) visible-end
+ '(rear-nonsticky (invisible)))
+ ))))
+
+(defun wiki-activate-internal-links (limit)
+ (wiki-activate-links wiki-internal-link-re limit))
+
+(defun wiki-activate-external-links (limit)
+ (wiki-activate-links wiki-external-link-re limit))
+
+(define-derived-mode wiki-mode outline-mode "Wiki"
+ "A wikitext mode."
+
+ (setq-local comment-start "<!--")
+ (setq-local comment-end "-->")
+
+ ;; FIXME: this should not be necessary in outline mode
+ (setq-local font-lock-defaults
+ '(wiki-font-lock-keywords
+ t
+ nil
+ nil
+ (font-lock-extra-managed-props invisible font-lock-face)))
+ (setq-local outline-regexp wiki-outline-regexp)
+ (setq-local outline-level 'wiki-outline-level)
+ )
+
+(provide 'wiki-markup)
+;;; wiki-markup.el ends here
+
diff --git a/wiki.el b/wiki.el
new file mode 100644
index 0000000..5780a60
--- /dev/null
+++ b/wiki.el
@@ -0,0 +1,32 @@
+;;; wiki.el -- emacs wiki mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2023 Free Software Foundation.
+
+;; Author: Yuchen Pei <id@ypei.org>
+;; Package-Requires: ((emacs "28.2"))
+
+;; This file is part of wiki.el.
+
+;; wiki.el is free software: you can redistribute it and/or modify it under
+;; the terms of the GNU Affero General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; wiki.el is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
+;; Public License for more details.
+
+;; You should have received a copy of the GNU Affero General Public
+;; License along with wiki.el. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; emacs wiki mode.
+
+;;; Code:
+
+(require 'wiki-markup)
+
+(provide 'wiki)
+;;; wiki.el ends here