From 94d2fc1815a919734353c942f224db1de4b4fcb8 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Mon, 7 Mar 2011 09:04:49 +0100 Subject: Django, org * Added nxhtml, mostly for django support. * Changed some org settings. --- emacs.d/nxhtml/related/wikipedia-mode.el | 2296 ++++++++++++++++++++++++++++++ 1 file changed, 2296 insertions(+) create mode 100644 emacs.d/nxhtml/related/wikipedia-mode.el (limited to 'emacs.d/nxhtml/related/wikipedia-mode.el') diff --git a/emacs.d/nxhtml/related/wikipedia-mode.el b/emacs.d/nxhtml/related/wikipedia-mode.el new file mode 100644 index 0000000..c219e19 --- /dev/null +++ b/emacs.d/nxhtml/related/wikipedia-mode.el @@ -0,0 +1,2296 @@ +;;; wikipedia-mode.el --- Mode for editing Wikipedia articles off-line +;; Copyright (C) 2003, 2004, 2006 Chong Yidong, Uwe Brauer + +;; Author: Chong Yidong +;; Maintainer: Uwe Brauer +;; Version: 0.51 +;; Keywords: wiki +;; $Id: wikipedia-mode.el,v 1.5 2006/05/30 15:16:45 oub Exp oub $ + + +;; This file is not part of GNU Emacs. + +;;{{{ GPL2 + +;; This file is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2 of +;; the License, or (at your option) any later version. + +;; This file 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 General Public License for more details. + +;; You should have received a copy of the GNU General Public +;; License along with GNU Emacs; if not, write to the Free +;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +;; MA 02111-1307 USA + +;;}}} + +;;; Commentary: + +;; This is `wikipedia-mode', a major mode for editing articles written +;; in the markup language used by Wikipedia, the free on-line +;; encyclopedia (http://www.wikipedia.org). It is intended to work +;; with GNU Emacs 21.x, and Xemacs 21.4.x. See below for details. + +;; wikipedia mode can be found also at: +;; http://en.wikipedia.org/wiki/Wikipedia:Wikipedia-mode.el + +;;{{{ INSTALLING WIKIPEDIA-MODE + +;; Installing wikipedia-mode +;; ========================= +;; +;; Save wikipedia-mode.el in a convenient directory, preferably in +;; your `load-path'. Add the following to your `user-init-file': +;; +;; (autoload 'wikipedia-mode +;; "wikipedia-mode.el" +;; "Major mode for editing documents in Wikipedia markup." t) +;; +;; If you did not save wikipedia-mode.el in your `load-path', you must +;; use the full pathname. On MS Windows, use forward slashes (/) +;; rather than back slashes (\) to indicate the directory, e.g.: +;; +;; (autoload 'wikipedia-mode +;; "C:/Documents and Settings/USERNAME/.emacs.d/Wikipedia-mode.el" +;; "Major mode for editing documents in Wikipedia markup." t) +;; +;; If you want to associate filenames ending in ".wiki" with +;; wikipedia-mode, add the following to your init file: +;; +;; (setq auto-mode-alist +;; (cons '("\\.wiki\\'" . wikipedia-mode) auto-mode-alist)) + +;;}}} + +;;{{{ REQUIREMENTS + +;; This is not a real requirements but I highly recommend to use +;; outline-magic written by Carsten Dominik. If you don't want to use it +;; you have to comment out the relevant reference to outline magic. +;; It can be found at +;; http://www.astro.uva.nl/~dominik/Tools/outline-magic.el + + + + +;;}}} + +;;{{{ RECOMMENDATIONS INSTALLING LONGLINES-MODE + +;; Installing longlines-mode +;; ========================= +;; +;; If you are using Emacs 22 or later longlines-mode is included so +;; please skip this section! +;; +;; Wikipedia articles don't use newline characters to break paragraphs +;; into lines, so each paragraph looks like a super-long line to +;; Emacs. To let Emacs handle "soft word wrapping", you need to +;; download a third-party package, longlines-mode. +;; +;; Download longlines.el, saving into your `load-path': +;; +;; http://www.emacswiki.org/elisp/longlines.el +;; +;; Add the following to your `user-init-file': +;; +;; (autoload 'longlines-mode "longlines.el" +;; "Minor mode for editing long lines." t) +;; +;; +;; WARNING: if you insert text from one file in wikipedia-mode to +;; another file in wikipedia-mode I strongly recommend, to turn +;; longlines-mode off, before the copying! + +;;}}} + +;;{{{ RECOMMENDATIONS INSTALLING PABBREV-MODE + +;; Installing pabbrev-mode +;; ========================= +;; +;; You may find pabbrev.el useful, which can be found at +;; http://www.russet.org.uk/download/emacs/pabbrev.el + + +;;}}} + +;;{{{ Xemacs or (GNU) Emacs + +;; Xemacs or (GNU) Emacs +;; ===================== +;; Usually that is a question of taste. However almost all wikipedia +;; articles nowadays use UTF8 coding, so the question which of the +;; Macsen to use, boils down to which degree UTF8 support is +;; implemented (no mule Xemacs is ruled out). While Xemacs has the +;; better font support, the UTF8 support still is not complete and +;; hence at the time being it is sad for the maintainer (a long time +;; Xemacs user) to recommend NOT to use Xemacs, even not 21.5.x, which +;; has a much better implemented UTF8 coding engine. That might +;; however change in the foreseeable future.... +;; WARNING: at least for me in Debian testing/unstable Emacs does not +;; ship all fonts necessary for a flawless editing of UTF8 files. For +;; example you can chose Greek input, write Greek text, but then when +;; you close and open the file again, the Greek symbol are not +;; displayed but you see empty blocks. The reason seems that emacs +;; chooses for the input fonts other fonts as for the display (don't +;; ask me). However for installing the (ugly) UTF8 compatible fonts +;; from ..... solved that problem. + + +;;}}} + +;;{{{ INSTALLING EE-HELPER or MOZEX + +;; Installing the helper programs. +;; ========================= +;; Helper Programs: MozEx and EE-HELPER. There are three possibilities +;; in order to use Emacs as an external editor +;; +;; (1) Firefox add-on It's All Text: Recommended. The elisp +;; library its-all-text.el makes it easier to use this. +;; +;; PROS: Easy to intall, supported. (You need to add Emacs +;; client as the editor.) Can be used for editing other +;; text fields with Emacs too. +;; +;; (2) EE-HELPER: This is perl script which will communicate with +;; the wikipedia server. However that sometimes be slow. + +;; PROS: if the editor supports UTF8, then ee-helper will +;; pass the coding flawlessly. +;; +;; CONTRA: the problem with this script is that it directly +;; communicates with the wikipedia site and does not +;; warn you about simultaneous editing. Use it with +;; care!!! Moreover section editing is not implemented. + +;; (3) MozEx: this is a Java-script which allows to communicate +;; Mozilla (or Firefox) directly with Emacs. + +;; PROS: After finishing editing you use the wikipedia +;; software to submit your changes and not the script, +;; so you are warned about possible conflicting editing. +;; +;; CONTRA: the official version does not support UTF8, +;; however there is now a new semi official version which +;; does support UTF8. + +;; Installing It's All Text +;; ======================== +;; +;; Go to the home page and follow the instructions there: +;; +;; https://addons.mozilla.org/en-US/firefox/addon/4125 +;; +;; Then open It's All Text preferences from the Firefox Add-ons page +;; and choose emacsclient as your editor (emacsclientw.exe on +;; Windows). + +;; Installing ee-helper +;; ==================== +;; +;; Download the perl script from +;; +;; http://meta.wikimedia.org/wiki/Help:External_editors +;; +;; and follow the instructions. configure the .ee-ini file. chance in +;; your personal wikipedia-mode-map account setting the editing +;; functions: activate the `external editor' option. + +;; Installing MozEx +;; ================ +;; +;; If your web browser is Mozilla or Firefox, take a look at the MozEx +;; extension, which allows you to call Emacs for editing text boxes: +;; +;; http://mozex.mozdev.org/development.html +;; +;; See also +;; +;; http://www.emacswiki.org/cgi-bin/wiki/FireFox +;; +;; If you mostly use MozEx to edit Wikipedia articles, it might be +;; worthwhile to tell Emacs to enter wikipedia-mode whenever it is +;; called by MozEx. Just add this to your `user-init-file': +;; +;; (add-to-list 'auto-mode-alist '("mozex.\\.*" . wikipedia-mode)) + +;; Recall: you have to click on edit (either edit article or edit +;; section), then use mouse3 (or shift f10), then select +;; mozex, then edit textarea: Edit-->mouse3-->mozex-->Edit +;; Textarea. After editing, you have to _click_ on the +;; text in the browser otherwise Mozilla will ignore your +;; typing. + +;;}}} + +;;{{{ NEWS + + +;; NEWS +;; ================================== +;; (1) Font setting has changed. +;; (2) Some makeup formats have been added: italics, bold, strong +;; emphasise, links. +;; (3) outline-cycle from Carsten Dominiks outline-magic has been +;; added. +;; (4) "Draft", "send" and "reply" (for discussion pages) +;; abilities 'based' on ideas of John Wigleys remember.el: see +;; the functions wikipedia-draft-* +;; RATIONALE: This comes handy in 2 situations +;; 1. You are editing articles which various authors (this I +;; think is the usual case), you then want not to submit +;; your edit immediately but want to copy it somewhere and +;; to continue later. You can use the following functions +;; for doing that: +;; wikipedia-draft-buffer \C-c\C-b +;; wikipedia-draft-region \C-c\C-r +;; then the buffer/region will be appended to the +;; wikipedia-draft-data-file (default is +;; "~/Wiki/discussions/draft.wiki", which you can visit via +;; wikipedia-draft-view-draft) and it will be +;; surrounded by the ^L marks in order to set a page. +;; moreover on top on that a section header == will be +;; inserted, which consists of the Word Draft, a subject +;; you are asked for and a date stamp. +;; +;; Another possibility consists in using the function +;; wikipedia-draft, bound to \C-c \C-m then a new buffer +;; will opened already in wikipedia mode. You edit and then +;; either can send the content of the buffer to the +;; wikipedia-draft-data-file in the same manner as +;; described above using the function +;; wikipedia-draft-buffer (bound to \C-c\C-k) +;; +;; BACK: In order to copy/send the content of temporary +;; buffer or of a page in the wikipedia-draft-data-file +;; back in to your wikipedia file, use the function +;; `wikipedia-send-to-mozex'. You +;; will be asked to which buffer to copy your text! +;; +;; +;; 2. You want to reply in a discussion page to a specific +;; contribution, you can use either the function +;; +;; \\[wikipedia-reply-at-point-simple] bound to [(meta shift r)] +;; which inserts a newline, a hline, and the signature of +;; the author. Or can use +;; \\[wikipedia-draft-reply] bound [(meta r)] +;; which does the same as wikipedia-reply-at-point-simple +;; but in a temporary draft buffer. +;; +;; BACK: In order to copy/send the content of that buffer +;; back in to your wikipedia file, use the function +;; \\[wikipedia-send-to-mozex] bound to "\C-c\C-c". You +;; will be asked to which buffer to copy your text! If +;; you want a copy to be send to your draft file, use +;; the variable wikipedia-draft-send-archive +;; + +;;}}} + +;;{{{ NEW FUNCTIONS AND VARIABLES + + +;; VERSION 0.4 +;;================== +;; NEW FUNCTIONS +;; ------------------ +;; wikipedia-insert-enumerate +;; wikipedia-insert-itemize +;; wikipedia-insert-strong-emphasis (renamed to wikipedia-insert-bold-italic) +;; wikipedia-insert-bold +;; wikipedia-insert-italics +;; wikipedia-insert-header +;; wikipedia-insert-link-wiki +;; wikipedia-turn-on-outline-minor-mode +;; wikipedia-insert-signature +;; wikipedia-insert-hline +;; wikipedia-unfill-paragraph-or-region +;; wikipedia-start-paragraph +;; wikipedia-hardlines +;; wikipedia-outline-magic-keys +;; wikipedia-enhance-indent +;; wikipedia-yank-prefix +;; wikipedia-simple-outline-promote +;; wikipedia-simple-outline-demote +;; wikipedia-next-long-line +;; wikipedia-unfill-paragraph +;; wikipedia-rename-buffer +;; wikipedia-draft +;; wikipedia-draft-buffer-desc +;; wikipedia-draft-append-to-file +;; wikipedia-draft-page +;; wikipedia-draft-region (&optional beg end) +;; wikipedia-draft-buffer +;; wikipedia-draft-clipboard +;; wikipedia-draft-mode +;; wikipedia-draft-view-draft +;; wikipedia-mark-section +;; wikipedia-activate-region +;; wikipedia-copy-page-to-register +;; wikipedia-insert-page-to-register +;; wikipedia-send-to-mozex (target-buffer) +;; wikipedia-reply-at-point-simple +;; wikipedia-draft-reply +;; wikipedia-insert-quotation-with-signature +;; wikipedia-insert-quotation + +;; NEW VARIABLES +;;--------------------- +;; wikipedia-enumerate-with-terminate-paragraph +;; wikipedia-draft-buffer "*Wikipedia-Draft*" +;; wikipedia-draft-mode-map +;; wikipedia-draft-mode-hook +;; wikipedia-draft-register ?R +;; wikipedia-draft-filter-functions +;; wikipedia-draft-handler-functions '(wikipedia-draft-append-to-file) +;; wikipedia-draft-data-file "~/Wiki/discussions/draft.wiki" +;; wikipedia-draft-leader-text "== " +;; wikipedia-draft-page ?S +;; wikipedia-draft-send-archive +;; wikipedia-reply-with-quote + + +;; VERSION 0.5 +;;==================================== +;; NEW FUNCTIONS +;; ------------------------------------ +;; wikipedia-insert-audio +;; wikipedia-insert-image +;; wikipedia-insert-link-www (renamed to wikipedia-insert-link-external) +;; wikipedia-insert-user +;; wikipedia-mark-signature +;; wikipedia-outline-cycle +;; wikipedia-reply-at-signature +;; wikipedia-terminate-paragraph-and-indent +;; wikipedia-yank-prefix + +;; NEW VARIABLES (defvar, defcustom, defconst) +;; ---------------------- +;; wikipedia-reply-with-hline +;; wikipedia-user-simplify-signature +;; wikipedia-english-or-german +;; wikipedia-draft-reply-register ?M +;; wikipedia-mode-version + +;; VERSION 0.51 +;;==================================== +;; +;; - Now requires Emacs 22 or higher. +;; - Cleaned the code in various ways. +;; - Removed wikipedia-english-or-german +;; - Removed some private stuff +;; - Simplified some key bindings. +;; - Changed some key bindings to those used in org-mode. +;; - Added wikipedia-lang etc +;; - Added support for templates +;; - Adjusted header end after inserting heading/promoting/demoting +;; - Removed some functions that are already supported by outline.el +;; - Changed wikipedia-mode menus +;; - Added support for bullets and numbering + +;;}}} + +;;{{{ TODO + +;; Todo +;; ---- + + +;; * Implement TeX highlighting in environment +;; * Implement (La)TeX input syntax, following the ideas of CDlatex.el +;; * Make outline-cycle work correctly +;; * wikipedia-reply-at-point-simple should use regexp! + +;;}}} + + + +;;; Code: + +(require 'org) + +(defconst wikipedia-mode-version (concat "0." (substring "$Revision: 1.5 $" 13 14)) + "$Id: wikipedia-mode.el,v 1.5 2006/05/30 15:16:45 oub Exp oub $ + +Report bugs to: Uwe Brauer oub at mat.ucm.es") + +;;{{{ LANGS + +;; (defvar wikipedia-english-or-german t +;; "*Variable in order to set the english (t) or german (nil) environment.") + +(require 'tutorial) ;; for lang strings + +(defvar wikipedia-lang "English") + +(defvar wikipedia-langs-added nil) +;;(defconst xlang-strings nil) + +(unless wikipedia-langs-added + (defun add-lang-strings (lang new-strings) + (let ((lang-rec (assoc lang lang-strings))) + (if lang-rec + (dolist (str new-strings) + (nconc (cdr lang-rec) (list str))) + (setq lang-rec (cons lang new-strings)) + (add-to-list 'lang-strings lang-rec)))) + + (add-lang-strings "English" + '( + (wikip-username-prompt . "Name of user: ") + (wikip-image-mark . "[[Image:") + (wikip-media-mark . "[[Media:") + (wikip-utc . "(UTC)") + (wikip-user-mark . "[[User:") + )) + (add-lang-strings "Deutsch" + '( + (wikip-username-prompt . "Name des Benutzers: ") + (wikip-image-mark . "[[Bild:") + (wikip-media-mark . "[[Bild:") + (wikip-utc . "(CET)") + (wikip-user-mark . "[[Benutzer:") + )) + (setq wikipedia-langs-added t)) + +;;}}} + +;;{{{ TAGS + +(defvar wikipedia-simple-tags + '("b" "big" "blockquote" "br" "caption" "code" "center" "cite" "del" + "dfn" "dl" "em" "i" "ins" "kbd" "math" "nowiki" "ol" "pre" "samp" + "small" "strike" "strong" "sub" "sup" "tt" "u" "ul" "var") + "Tags that do not accept arguments.") + +(defvar wikipedia-complex-tags + '("a" "div" "font" "table" "td" "th" "tr") + "Tags that accept arguments.") + +(defvar wikipedia-url-protocols + '("ftp" "gopher" "http" "https" "mailto" "news") + "Valid protocols for URLs in Wikipedia articles.") + +;;}}} + +;;{{{ FACES + +(defvar font-wikipedia-sedate-face 'font-wikipedia-sedate-face + "Face to use for Wikipedia minor keywords.") + +(defvar font-wikipedia-italic-face 'font-wikipedia-italic-face + "Face to use for Wikipedia italics.") +(defvar font-wikipedia-bold-face 'font-wikipedia-bold-face + "Face to use for Wikipedia bolds.") +(defvar font-wikipedia-math-face 'font-wikipedia-math-face + "Face to use for Wikipedia math environments.") +(defvar font-wikipedia-string-face 'font-wikipedia-string-face + "Face to use for strings. This is set by Font Wikipedia.") +(defvar font-wikipedia-verbatim-face 'font-wikipedia-verbatim-face + "Face to use for text in verbatim macros or environments.") + + + + +(defface font-wikipedia-bold-face + (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit bold)) + ((assq :weight custom-face-attributes) '(:weight bold)) + (t '(:bold t))))) + `((((class grayscale) (background light)) + (:foreground "DimGray" ,@font)) + (((class grayscale) (background dark)) + (:foreground "LightGray" ,@font)) + (((class color) (background light)) + (:foreground "DarkOliveGreen" ,@font)) + (((class color) (background dark)) + (:foreground "OliveDrab" ,@font)) + (t (,@font)))) + "Face used to highlight text to be typeset in bold." + :group 'font-wikipedia-highlighting-faces) + +(defface font-wikipedia-italic-face + (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit italic)) + ((assq :slant custom-face-attributes) '(:slant italic)) + (t '(:italic t))))) + `((((class grayscale) (background light)) + (:foreground "DimGray" ,@font)) + (((class grayscale) (background dark)) + (:foreground "LightGray" ,@font)) + (((class color) (background light)) + (:foreground "DarkOliveGreen" ,@font)) + (((class color) (background dark)) + (:foreground "OliveDrab" ,@font)) + (t (,@font)))) + "Face used to highlight text to be typeset in italic." + :group 'font-wikipedia-highlighting-faces) + +(defface font-wikipedia-math-face + (let ((font (cond ((assq :inherit custom-face-attributes) + '(:inherit underline)) + (t '(:underline t))))) + `((((class grayscale) (background light)) + (:foreground "DimGray" ,@font)) + (((class grayscale) (background dark)) + (:foreground "LightGray" ,@font)) + (((class color) (background light)) + (:foreground "SaddleBrown")) + (((class color) (background dark)) + (:foreground "burlywood")) + (t (,@font)))) + "Face used to highlight math." + :group 'font-wikipedia-highlighting-faces) + +(defface font-wikipedia-sedate-face + '((((class grayscale) (background light)) (:foreground "DimGray")) + (((class grayscale) (background dark)) (:foreground "LightGray")) + (((class color) (background light)) (:foreground "DimGray")) + (((class color) (background dark)) (:foreground "LightGray")) +;;;(t (:underline t)) + ) + "Face used to highlight sedate stuff." + :group 'font-wikipedia-highlighting-faces) + +(defface font-wikipedia-string-face + (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit italic)) + ((assq :slant custom-face-attributes) '(:slant italic)) + (t '(:italic t))))) + `((((type tty) (class color)) + (:foreground "green")) + (((class grayscale) (background light)) + (:foreground "DimGray" ,@font)) + (((class grayscale) (background dark)) + (:foreground "LightGray" ,@font)) + (((class color) (background light)) + (:foreground "RosyBrown")) + (((class color) (background dark)) + (:foreground "LightSalmon")) + (t (,@font)))) + "Face used to highlight strings." + :group 'font-wikipedia-highlighting-faces) + +(defface font-wikipedia-warning-face + (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit bold)) + ((assq :weight custom-face-attributes) '(:weight bold)) + (t '(:bold t))))) + `((((class grayscale)(background light)) + (:foreground "DimGray" ,@font)) + (((class grayscale)(background dark)) + (:foreground "LightGray" ,@font)) + (((class color)(background light)) + (:foreground "red" ,@font)) + (((class color)(background dark)) + (:foreground "red" ,@font)) + (t (,@font)))) + "Face for important keywords." + :group 'font-wikipedia-highlighting-faces) + +(defface font-wikipedia-verbatim-face + (let ((font (if (and (assq :inherit custom-face-attributes) + (if (featurep 'xemacs) + (find-face 'fixed-pitch) + (facep 'fixed-pitch))) + '(:inherit fixed-pitch) + '(:family "courier")))) + `((((class grayscale) (background light)) + (:foreground "DimGray" ,@font)) + (((class grayscale) (background dark)) + (:foreground "LightGray" ,@font)) + (((class color) (background light)) + (:foreground "SaddleBrown" ,@font)) + (((class color) (background dark)) + (:foreground "burlywood" ,@font)) + (t (,@font)))) + "Face used to highlight TeX verbatim environments." + :group 'font-wikipedia-highlighting-faces) + + +(defvar wikipedia-font-lock-keywords + (list + + ;; Apostrophe-style text markup + (cons "''''\\([^']\\|[^']'\\)*?\\(''''\\|\n\n\\)" + 'font-lock-builtin-face) + (cons "'''\\([^']\\|[^']'\\)*?\\('''\\|\n\n\\)" + ; 'font-lock-builtin-face) + 'font-wikipedia-bold-face) + (cons "''\\([^']\\|[^']'\\)*?\\(''\\|\n\n\\)" + 'font-wikipedia-italic-face) + + ;; Headers and dividers + (list "^\\(==+\\)\\(.*\\)\\(\\1\\)" + '(1 font-lock-builtin-face) + ; '(2 wikipedia-header-face) + '(2 font-wikipedia-sedate-face) + '(3 font-lock-builtin-face)) + (cons "^-----*" 'font-lock-builtin-face) + + ;; Bare URLs and ISBNs + (cons (concat "\\(^\\| \\)" (regexp-opt wikipedia-url-protocols t) + "://[-A-Za-z0-9._\/~%+&#?!=()@]+") + 'font-lock-variable-name-face) + (cons "\\(^\\| \\)ISBN [-0-9A-Z]+" 'font-lock-variable-name-face) + + ;; Colon indentation, lists, definitions, and tables + (cons "^\\(:+\\|[*#]+\\||[}-]?\\|{|\\)" 'font-lock-builtin-face) + + (list "^\\(;\\)\\([^:\n]*\\)\\(:?\\)" + '(1 font-lock-builtin-face) + '(2 font-lock-keyword-face) + '(3 font-lock-builtin-face)) + + + + ;; Tags and comments + + (list (concat "\\(\\)") + '(1 font-lock-builtin-face t t) + '(2 font-lock-function-name-face t t) + '(3 font-lock-builtin-face t t)) + (list (concat "\\(<]\\|\"[^\"]*\"\\|'[^']*'\\)*\\)?\\)\\(>\\)") + '(1 font-lock-builtin-face t t) + '(2 font-lock-function-name-face t t) + '(3 font-lock-keyword-face t t) + '(4 font-lock-builtin-face t t)) + (cons (concat "") + '(0 font-lock-comment-face t t)) + + + + ;; External Links + + (list (concat "\\(\\[\\)\\(\\(?:" + (regexp-opt wikipedia-url-protocols) + "\\)://[-A-Za-z0-9._\/~%-+&#?!=()@]+\\)\\(\\(?: [^]\n]*\\)?\\)\\(\\]\\)") + '(1 font-lock-builtin-face t t) + '(2 font-lock-variable-name-face t t) + '(3 font-lock-keyword-face t t) + '(4 font-lock-builtin-face t t)) + + + + + ;; Wiki links + '("\\(\\[\\[\\)\\([^]\n|]*\\)\\(|?\\)\\([^]\n]*\\)\\(\\]\\]\\)" + (1 font-lock-builtin-face t t) + (2 font-lock-variable-name-face t t) + (3 font-lock-builtin-face t t) + (4 font-lock-keyword-face t t) + (5 font-lock-builtin-face t t)) + + ;; Wiki variables + '("\\({{\\)\\(.+?\\)\\(}}\\)" + (1 font-lock-builtin-face t t) + (2 font-lock-variable-name-face t t) + (3 font-lock-builtin-face t t)) + + ;; Character entity references + (cons "&#?[a-zA-Z0-9]+;" '(0 font-lock-type-face t t)) + + ;; Preformatted text + (cons "^ .*$" '(0 font-lock-constant-face t t)) + + ;; Math environment (uniform highlight only, no TeX markup) + (list "\\(\\(\n?.\\)*\\)" + '(1 font-lock-keyword-face t t)))) + + ; ) + +;;}}} + +;;{{{ Menu and header stuff + +(defvar wikipedia-imenu-generic-expression + ;;(list '(nil "^==+ *\\(.*[^\n=]\\)==+" 1)) + (list '(nil "^=+ *\\(.*[^\n=]\\)=+" 1)) + "Imenu expression for `wikipedia-mode'. See `imenu-generic-expression'.") + +;; (defun wikipedia-next-header () +;; "Move point to the end of the next section header." +;; (interactive) +;; (let ((oldpoint (point))) +;; (end-of-line) +;; (if (re-search-forward "\\(^==+\\).*\\1" (point-max) t) +;; (beginning-of-line) +;; (goto-char oldpoint) +;; (message "No section headers after point.")))) + +;; (defun wikipedia-prev-header () +;; "Move point to the start of the previous section header." +;; (interactive) +;; (unless (re-search-backward "\\(^==+\\).*\\1" (point-min) t) +;; (message "No section headers before point."))) + +;;}}} + +;;{{{ Paragraph terminate and filling stuff (Chong) + +(defun wikipedia-terminate-paragraph () ;Version:1.58 + "New list item or paragraph. +In a list, start a new list item. In a paragraph, start a new +paragraph. + +If the current paragraph is colon indented, the new paragraph +will be indented in the same way." + (interactive) + (let (indent-chars) + (save-excursion + (beginning-of-line) + (while (cond ((looking-at "^$") nil) + ((looking-at "^\\(\\(?: \\|:+\\|[#*]+\\) *\\)") + (setq indent-chars (match-string 1)) nil) + ((eq (point) (point-min)) nil) + ((progn (forward-line -1) t))) + t)) + (newline) (if (not indent-chars) (newline) + (insert indent-chars)))) + +(defun wikipedia-terminate-paragraph-and-indent () + "New list item or paragraph, ignore *,#. +In a list, start a new list item. In a paragraph, start a new +paragraph but *,# will be ignored. + +If the current paragraph is colon ; indented, the new paragraph +will be indented in the same way." + (interactive) + (let (indent-chars) + (save-excursion + (beginning-of-line) + (while (cond ((looking-at "^$") nil) + ((looking-at "^\\(\\(?: \\|:+\\) *\\)") + (setq indent-chars (match-string 1)) nil) + ((eq (point) (point-min)) nil) + ((progn (forward-line -1) t))) + t)) + (newline) (if (not indent-chars) (newline) + (insert indent-chars)))) + + +(defun wikipedia-link-fill-nobreak-p () + "Function for `fill-nobreak-predicate'. +When filling, don't break the line for preformatted (fixed-width) +text or inside a Wiki link." + (save-excursion + (let ((pos (point))) + (or (eq (char-after (line-beginning-position)) ? ) + (if (re-search-backward "\\[\\[" (line-beginning-position) t) + ;; Break if the link is really really long. + ;; You often get this with captioned images. + (null (or (> (- pos (point)) fill-column) + (re-search-forward "\\]\\]" pos t)))))))) + +(defun wikipedia-fill-article () + "Fill the entire article." + (interactive) + (save-excursion + (fill-region (point-min) (point-max)))) + +(defun wikipedia-unfill-article () + "Unfill article. +Undo filling, deleting stand-alone newlines (newlines that do not +end paragraphs, list entries, etc.)" + (interactive) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward ".\\(\n\\)\\([^# *;:|!\n]\\|----\\)" nil t) + (replace-match " " nil nil nil 1))) + (message "Stand-alone newlines deleted")) + + +(defun wikipedia-unfill-paragraph-with-newline (&optional justifyp) + (interactive "P") + (let ((before (point))) ;Version:1.3 + (save-excursion + (forward-paragraph) + (or (bolp) (newline 1)) + (let ((end (point)) + (start (progn (backward-paragraph) (point)))) + (goto-char before) + (while (re-search-forward ".\\(\n\\)\\([^# *;:|!\n]\\|----\\)" nil t) + (replace-match " " nil nil nil 1)))))) + ; (message "Stand-alone newlines IN PARAGRAPH deleted")) + +(defun wikipedia-unfill-region () + "Unfill region. +Undo filling, deleting stand-alone newlines (newlines that do not +end paragraphs, list entries, etc.) see also the function +\\[wikipedia-unfill-paragraph-or-region] and the even simpler +function \\[wikipedia-unfill-paragraph-simple]." + (interactive) + (save-excursion + (narrow-to-region (point) (mark)) + (goto-char (point-min)) + (while (re-search-forward ".\\(\n\\)\\([^# *;:|!\n]\\|----\\)" nil t) + (replace-match " " nil nil nil 1))) + (message "Stand-alone newlines deleted") + (widen)) + +;;}}} + +;;{{{ Main function wikipedia mode (using define-derived mode) + +;;{{{ KEY SETTING +;; (defvar wikipedia-outline-map +;; (let ((map (make-sparse-keymap))) +;; (define-key map [(down)] 'outline-next-visible-heading) +;; (define-key map [(up)] 'outline-previous-visible-heading) +;; (define-key map "n" 'outline-next-visible-heading) +;; (define-key map "p" 'outline-previous-visible-heading) +;; (define-key map "f" 'outline-forward-same-level) +;; (define-key map "b" 'outline-backward-same-level) +;; (define-key map "u" 'outline-up-heading) +;; (define-key map "/" 'org-occur) +;; (define-key map "\C-c\C-n" 'outline-next-visible-heading) +;; (define-key map "\C-c\C-p" 'outline-previous-visible-heading) +;; (define-key map "\C-c\C-f" 'outline-forward-same-level) +;; (define-key map "\C-c\C-b" 'outline-backward-same-level) +;; (define-key map "\C-c\C-u" 'outline-up-heading) +;; map)) + + +(defvar wikipedia-mode-map + (let ((map (make-sparse-keymap))) + ;;(define-key map "\M-n" 'wikipedia-next-header) + (define-key map "\C-c\C-n" 'wikipedia-next-long-line) + ;; (define-key map "\M-p" 'wikipedia-prev-header) + ;; (define-key map [(meta down)] 'wikipedia-next-header) + ;; (define-key map [(meta up)] 'wikipedia-prev-header) + (define-key map "\C-j" 'wikipedia-terminate-paragraph) + ;;(define-key map "RET" 'wikipedia-newline) + (define-key map [(shift return)] 'wikipedia-newline) + + ;;(define-key mm [separator-format] '("--")) +;; (define-key mm [outline] +;; '("Toggle Outline Mode..." . outline-minor-mode)) + ;;(define-key mm [separator-edit-structure] '("--")) + + + ;; Use some mnemonic + ;;(define-key map "\C-c\C-q" 'wikipedia-unfill-article) + (define-key map "\C-c\M-qua" 'wikipedia-unfill-article) + ;;(define-key map "\C-c\M-q" 'wikipedia-fill-article) + (define-key map "\C-c\M-qfa" 'wikipedia-fill-article) + ;;(define-key map "\M-u" 'wikipedia-unfill-paragraph-or-region) + (define-key map "\C-c\M-qur" 'wikipedia-unfill-paragraph-or-region) + ;;(define-key map "\C-c\C-u" 'wikipedia-unfill-paragraph-simple) + (define-key map "\C-c\M-qup" 'wikipedia-unfill-paragraph-simple) + + (define-key map "\C-c\C-fs" 'wikipedia-insert-bold-italic) + (define-key map "\C-c\C-fb" 'wikipedia-insert-bold) ;Version:1.3 + (define-key map "\C-c\C-fi" 'wikipedia-insert-italics) + (define-key map "\C-c\C-fn" 'wikipedia-insert-nowiki) + + (define-key map "\C-c\C-ts" 'wikipedia-insert-signature) + (define-key map "\C-c\C-tt" 'wikipedia-insert-template) + (define-key map "\C-c\C-tu" 'wikipedia-insert-user) + ;;(define-key map "\C-c\C-fq" 'wikipedia-insert-quotation) + ;;(define-key map "\C-c\C-fh" 'wikipedia-insert-header) + (define-key map "\C-c\C-fr" 'wikipedia-insert-hline) ;Version:1.30 + (define-key map "\C-c\C-li" 'wikipedia-insert-link-wiki) + (define-key map "\C-c\C-le" 'wikipedia-insert-link-external) + + ;; Breaks key binding conventions: + ;;(define-key map [(meta f7)] 'wikipedia-draft) + ;;(define-key map [(meta f8)] 'wikipedia-reply-at-point-simple) + ;;(define-key map [(meta f9)] 'wikipedia-draft-view-draft) + + (define-key map "\C-c\C-r" 'wikipedia-reply-at-point-simple) + + ;; Breaks key binding conventions: + ;;(define-key map "\C-cr" 'wikipedia-draft-region) + + (define-key map [(meta r)] 'wikipedia-draft-reply) + (define-key map "\C-c\C-m" 'wikipedia-draft) ;Version:1.25 + (define-key map "\C-c\C-b" 'wikipedia-draft-region) + (define-key map "\C-c\C-d" 'wikipedia-draft-buffer) + (define-key map "\C-c\C-k" 'wikipedia-draft-buffer) + (define-key map "\C-c\C-p" 'wikipedia-draft-copy-page-to-register) ;Version:1.39 + ;; (define-key map "\C-c\C-c" 'wikipedia-draft-send-to-mozex) + (define-key map "\C-c\C-s" 'wikipedia-draft-yank-page-to-register) + + (define-key map [(control meta prior)] 'wikipedia-enhance-indent) + (define-key map [(control meta next)] 'wikipedia-yank-prefix) + (define-key map [(meta return)] 'wikipedia-insert-enumerate) + (define-key map [(meta control return)] 'wikipedia-insert-enumerate-nonewline) + ;; private setting + ;; This is bound to C-j by default: + ;;(define-key map [(shift return)] 'newline-and-indent) ;Version:1.24 + (define-key map "\C-\\" 'wikipedia-insert-itemize) ;Version:1.28 + (define-key map [(control return)] 'wikipedia-insert-itemize) + + ;; The next three breaks Emacs key binding conventions, are they really necessary? + ;;(define-key map "\C-ca" 'auto-capitalize-mode) + ;;(define-key map "\C-ci" 'set-input-method) + ;;(define-key map "\C-ct" 'toggle-input-method) ;Version:1.23 + + (define-key map [(shift tab)] 'org-shifttab) + (define-key map [backtab] 'org-shifttab) + (define-key map [tab] 'org-cycle) + + map)) + +(defvar wikipedia-org-menu nil) +;; From org.el: +(easy-menu-define wikipedia-org-menu wikipedia-mode-map "Wikipedia menu" + '("Wikipedia" + ("Show/Hide" + ["Cycle Visibility" org-cycle (or (bobp) (outline-on-heading-p))] + ["Cycle Global Visibility" org-shifttab] + ["Sparse Tree" org-occur t] + ["Reveal Context" org-reveal t] + ["Show All" show-all t] + "--" + ["Subtree to indirect buffer" org-tree-to-indirect-buffer t]) + "--" + ["New Heading" outline-insert-heading t] + ("Navigate Headings" + ["Up" outline-up-heading t] + ["Next" outline-next-visible-heading t] + ["Previous" outline-previous-visible-heading t] + ["Next Same Level" outline-forward-same-level t] + ["Previous Same Level" outline-backward-same-level t] + "--" + ["Jump" org-goto t]) + ("Edit Structure" + ["Move Subtree Up" outline-move-subtree-up] + ["Move Subtree Down" outline-move-subtree-down] + "--" + ["Copy Subtree" org-copy-special] + ["Cut Subtree" org-cut-special] + ["Paste Subtree" org-paste-special] + "--" + ["Promote Heading" wikipedia-simple-outline-promote] + ["Promote Subtree" outline-promote] + ["Demote Heading" wikipedia-simple-outline-demote] + ["Demote Subtree" outline-demote]) + ("Filling" + ["Unfill article" wikipedia-unfill-article] + ["Fill article" wikipedia-fill-article]) + "--" + ("Format" + ["Horizontal line" wikipedia-insert-hline] + "--" + ["Indent Paragraph" wikipedia-indent-paragraph] + ["Deindent Paragraph" wikipedia-deindent-paragraph] + "--" + ["Insert No Wiki Formatting" wikipedia-insert-nowiki] + ["Bold-Italic" wikipedia-insert-bold-italic] + ["Italic" wikipedia-insert-italics] + ["Bold" wikipedia-insert-bold] + "--" + ("Insert" + ("Templates" + ["Site Specific Template" wikipedia-insert-template] + ["Signature" wikipedia-insert-signature] + ) + ("Links" + ["External Link" wikipedia-insert-link-external] + ["Internal Wiki Link" wikipedia-insert-link-wiki] + ) + ("Bullets and numbering" + ["Bullet" wikipedia-insert-bullet] + ["Numbering" wikipedia-insert-numbering] + ) + )) + )) +;;}}} + + +;;;###autoload +;;{{{ Main function wikipedia-mode + +(define-derived-mode wikipedia-mode outline-mode "Wikipedia" + "Major mode for editing wikimedia style wikis. +Major mode for editing articles written in the markup language +used by Wikipedia, the free on-line +encyclopedia (see URL `http://www.wikipedia.org'). + +There are several ways to use wikipedia-mode: + +- You can simply cut and paste articles between Emacs and your + web browser's text box. +- If you are using Firefox you can use the It's All Text add-on + for Firefox. +- You can use MozEx, a Mozilla/Firefox web browser extension that + allows you to call Emacs from a text + box (see URL `http://mozex.mozdev.org/'). +- Another way is to use the PERL script ee-helper, which allows + you to up and download wiki texts. + +Wikipedia articles are usually unfilled: newline characters are not +used for breaking paragraphs into lines. Unfortunately, Emacs does not +handle word wrapping yet. As a workaround, wikipedia-mode turns on +longlines-mode automatically. In case something goes wrong, the +following commands may come in handy: + +\\[wikipedia-fill-article] fills the buffer. +\\[wikipedia-unfill-article] unfills the buffer. +Be warned that function can be dead slow, better use wikipedia-unfill-paragraph-or-region. +\\[wikipedia-unfill-paragraph-or-region] unfills the paragraph +\\[wikipedia-unfill-paragraph-simple] doehe same but simpler. + + + +The following commands put in markup structures. + +\\[wikipedia-insert-bold-italic] bold+italic +\\[wikipedia-insert-bold] bold text +\\[wikipedia-insert-italics] italics +\\[wikipedia-insert-nowiki] no wiki markup +\\[wikipedia-insert-link-wiki] inserts a link + +The following commands are also defined: +\\[wikipedia-insert-user] inserts user name +\\[wikipedia-insert-signature] inserts ~~~~ +\\[wikipedia-insert-enumerate] inserts enumerate type structures +\\[wikipedia-insert-itemize] inserts itemize type structures +\\[wikipedia-insert-hline] inserts a hline + +The draft functionality +\\[wikipedia-draft] +\\[wikipedia-draft-region] +\\[wikipedia-draft-view-draft] +\\[wikipedia-draft-page] +\\[wikipedia-draft-buffer] + +Replying and sending functionality +\\[wikipedia-reply-at-point-simple] +\\[wikipedia-draft-reply] + + +The register functionality +\\[wikipedia-copy-page-to-register] +\\[defun wikipedia-insert-page-to-register] + + +Some simple editing commands. +\\[wikipedia-enhance-indent] +\\[wikipedia-yank-prefix] +\\[wikipedia-unfill-paragraph-or-region] + + + +\\[wikipedia-terminate-paragraph] starts a new list item or paragraph in a context-aware manner." + + (set (make-local-variable 'adaptive-fill-regexp) "[ ]*") + (set (make-local-variable 'comment-start-skip) "\\(?:\\)?") + (set (make-local-variable 'comment-start) "") + (set (make-local-variable 'paragraph-start) + "\\*\\| \\|#\\|;\\|:\\||\\|!\\|$") + (set (make-local-variable 'sentence-end-double-space) nil) + (set (make-local-variable 'font-lock-multiline) t) + (set (make-local-variable 'font-lock-defaults) + '(wikipedia-font-lock-keywords t nil nil nil)) + (set (make-local-variable 'fill-nobreak-predicate) + 'wikipedia-link-fill-nobreak-p) + (set (make-local-variable 'auto-fill-inhibit-regexp) "^[ *#:|;]") + + ;; Support for outline-minor-mode. No key conflicts, so we'll use + ;; the normal outline-mode prefix. + ;;(set (make-local-variable 'outline-regexp) "==+") + (set (make-local-variable 'outline-regexp) "=+") + ;;(set (make-local-variable 'outline-heading-end-regexp) "=+") ;; For betting fixing + ;; (set (make-local-variable 'outline-regexp) "=+") + ;; (set (make-local-variable 'outline-regexp) ":") + + ;; Fix-me: Why change this?? Should not the user do this globally instead? + ;;(set (make-local-variable 'outline-minor-mode-prefix) "\C-c\C-o") + + ;; Fix-mde For longlines-mode??: + (set (make-local-variable 'auto-fill-inhibit-regexp) "^[ *#:|;]") + + ;: From org.el: + ;; Get rid of Outline menus, they are not needed + ;; Need to do this here because define-derived-mode sets up + ;; the keymap so late. Still, it is a waste to call this each time + ;; we switch another buffer into org-mode. + (if (featurep 'xemacs) + (when (boundp 'outline-mode-menu-heading) + ;; Assume this is Greg's port, it used easymenu + (easy-menu-remove outline-mode-menu-heading) + (easy-menu-remove outline-mode-menu-show) + (easy-menu-remove outline-mode-menu-hide)) + (define-key wikipedia-mode-map [menu-bar headings] 'undefined) + (define-key wikipedia-mode-map [menu-bar hide] 'undefined) + (define-key wikipedia-mode-map [menu-bar show] 'undefined)) + + (easy-menu-add wikipedia-org-menu) + + ;; Turn on the Imenu automatically. +;; (when menu-bar-mode +;; (set (make-local-variable 'imenu-generic-expression) +;; wikipedia-imenu-generic-expression) +;; (imenu-add-to-menubar "TOC")) + + (modify-syntax-entry ?< "(>" wikipedia-mode-syntax-table) + (modify-syntax-entry ?> ")<" wikipedia-mode-syntax-table) + + ;;}}} + + ;;; This is the wrong way to do it, see add-hook: + ;; (make-local-variable 'change-major-mode-hook) + + ;; Check if our version of outline.el has the new header hooks: + (require 'outline) + (when (boundp 'outline-demote-hook) + (add-hook 'outline-demote-hook 'wikipedia-outline-insert-heading-f nil t) + (add-hook 'outline-promote-hook 'wikipedia-outline-insert-heading-f nil t) + (add-hook 'outline-insert-heading-hook 'wikipedia-outline-insert-heading-f nil t) + ) + ) + +(defun wikipedia-outline-insert-heading-f () + (insert " ") + (backward-char) + (wikipedia-adjust-header-end)) + +;; wikipedia-mode ends here +;;}}} + +;;{{{ longlines-mode + +(defun wikipedia-turn-on-longlines () ;Version:1.58 + "Turn on longlines-mode if it is defined." + (if (functionp 'longlines-mode) + (longlines-mode 1))) + +(defcustom wikipedia-use-longlines-mode nil + "Turn on longlines-mode' if non-nil. +Unfortunately there are some bugs in `longlines-mode' so turning +it on is an option currently." + :type 'boolean + :set (lambda (sym val) + (set-default sym val) + (if val + (add-hook 'wikipedia-mode-hook 'wikipedia-turn-on-longlines) + (remove-hook 'wikipedia-mode-hook 'wikipedia-turn-on-longlines))) + :group 'wikipedia) + +;;}}} + +;; New formating stuff for inserting simple formating structures such + +;;{{{ Insert makeup and templates + +(defvar wikipedia-enumerate-with-terminate-paragraph nil + "*Before insert enumerate/itemize do \\[wikipedia-terminate-paragraph].") + +(defun wikipedia-region-active-p () + (or (and (boundp 'zmacs-region-active-p) zmacs-region-active-p) + (and (boundp 'transient-mark-mode) transient-mark-mode mark-active))) + +(defun wikipedia-insert-around-region (before after) + (if (wikipedia-region-active-p) + (save-excursion + (let ((beginning (region-beginning)) + (end (region-end)) + (check (= (string-to-char before) ?'))) + ;; When we are inserting ' do not mix them: + (if (or (not check) + (not (memq ?' + (append (buffer-substring-no-properties + beginning end) nil)))) + (progn + (goto-char end) + (insert after) + (goto-char beginning) + (insert before)) + (message "Sorry, the region already contains the char '.") + ))) + (insert before) + (insert after) + (backward-char (length after)))) + +(defun wikipedia-insert-enumerate () + "Insert enumerated items. +Format depends on `wikipedia-enumerate-with-terminate-paragraph'. +Note however that `wikipedia-terminate-paragraph' does not work +very well will longlines-mode." + (interactive) + (if wikipedia-enumerate-with-terminate-paragraph + (progn + (wikipedia-terminate-paragraph) + (insert "#")) + (newline nil) + (insert ":#"))) + + + + + +(defun wikipedia-insert-itemize () + "Insert not enumerated items. +Format depends on `wikipedia-enumerate-with-terminate-paragraph'. +Note however that the `wikipedia-terminate-paragraph' does not +work very well will longlines-mode." + (interactive) + (if wikipedia-enumerate-with-terminate-paragraph + (progn + (wikipedia-terminate-paragraph) + (insert "*")) + (newline nil) + (insert ":*"))) + + +(defun wikipedia-insert-bold-italic () + "Insert strong emphasis. +Uses four apostrophes (e.g. ''''FOO''''.) When mark is active, surrounds region." + (interactive) + (wikipedia-insert-around-region "''''" "''''")) + + +(defun wikipedia-insert-bold () + "Insert bold. +Uses three apostrophes (e.g. '''FOO'''.) When mark is active, +surrounds region." + (interactive) + (wikipedia-insert-around-region "'''" "'''")) + + +(defun wikipedia-insert-italics () + "Insert italics. +Uses two apostrophes (e.g. ''FOO''.) When mark is active, +surrounds region." + (interactive) + (wikipedia-insert-around-region "''" "''")) + +(defun wikipedia-indent-paragraph () + (interactive) + (backward-paragraph) + ) +(defun wikipedia-deindent-paragraph () + (interactive) + ) +;;}}} +;;{{{ Templates + +;; http://en.wikipedia.org/wiki/Template:Quotation +;; http://en.wikipedia.org/wiki/Help:A_quick_guide_to_templates +(defvar wikipedia-site nil) +(make-variable-buffer-local 'wikipedia-site) +(defvar wikipedia-site-history nil) + +(defcustom wikipedia-templates nil + "Templates for different wikis." + :type '(repeat (list + (string :tag "Wiki site") + (repeat + (list + (string :tag "Template name") + (string :tag "Template code"))))) + :group 'wikipedia) + +(defun wikipedia-insert-template () + "Prompts for a template and inserts it." + (interactive) + (let* ((t-name-code (wikipedia-get-template)) + (t-name (car t-name-code)) + ;; Ask how to insert: + (choices '("Evaluate when page is created" + "Substitute when saving this source page" + "Show template when page is fetched" + "Insert template itself")) + (hist (copy-sequence choices)) + (default (car choices)) + (choice (completing-read + "How do you want to insert the template? " + choices + nil + t + default + (cons 'hist 1)))) +;; (lwarn 't :warning "t-name=%s" t-name) +;; (lwarn 't :warning "choice=%s" choice) +;; (lwarn 't :warning "0=%s" (nth 0 choices)) +;; (lwarn 't :warning "1=%s" (nth 1 choices)) +;; (lwarn 't :warning "2=%s" (nth 2 choices)) + (cond + ((string= choice (nth 0 choices)) + ;;(lwarn 't :warning "evaluate=>%s" (concat "{{" t-name "}}")) + (insert "{{" t-name "}}") + ) + ((string= choice (nth 1 choices)) + ;;(lwarn 't :warning "subst=>%s" (concat "{{subst:" t-name "}}")) + (insert "{{subst:" t-name "}}") + ) + ((string= choice (nth 2 choices)) + ;;(lwarn 't :warning "raw=>%s" (concat "{{msgnw:" t-name "}}")) + (insert "{{msgnw:" t-name "}}") + ) + ((string= choice (nth 3 choices)) + (insert (cdr t-name-code)) + )))) + +(defun wikipedia-get-template () + (let* ((sites (mapcar (lambda (t-sites) + (car t-sites)) + wikipedia-templates)) + (hist (copy-sequence sites)) + (default-site wikipedia-site) + (histpos (if (not default-site) + 1 + (catch 'pos + (let ((n 0)) + (dolist (elt sites) + (setq n (1+ n)) + (when (string= default-site elt) + (throw 'pos n))))))) + (site (if (= 1 (length sites)) + (car sites) + (completing-read "Wiki site: " + sites + nil + t + default-site + (cons 'hist histpos)))) + (s-t (assoc site wikipedia-templates)) + (templates (car (cdr s-t))) + (t-names (mapcar (lambda (t-for-site) + ;;(lwarn 't :warning "t-for-site=%s" t-for-site) + (car t-for-site)) + templates)) + (t-name (wikipedia-get-template-name site templates)) + (code (car (cdr (assoc t-name templates)))) + ) + (setq wikipedia-site site) +;; (lwarn 't :warning "site=%s" site) +;; (lwarn 't :warning "s-t=%s" s-t) +;; (lwarn 't :warning "templates=%s" templates) +;; (lwarn 't :warning "t-names=%s" t-names) +;; (lwarn 't :warning "t-name=%s" t-name) +;; (lwarn 't :warning "code=%s" code) + (cons t-name code))) + +(defun wikipedia-get-template-name (site templates) + "" + (let* ((prompt "Template: ") + (minibuffer-local-must-match-map (copy-keymap minibuffer-local-must-match-map)) + (hist (mapcar (lambda (elt) + (car elt)) + templates)) + (desc-fun (lambda () + (let ((s (minibuffer-contents-no-properties))) + (when (< 0 (length s)) + (wikipedia-describe-template s site templates))))) + (up-fun (lambda () (interactive) + (previous-history-element 1) + (funcall desc-fun))) + (down-fun (lambda () (interactive) + (next-history-element 1) + (funcall desc-fun))) + (default nil) + (histpos (if (not default) 1)) + (default-name (if default + default + (car (nth (1- histpos) templates)))) + (tpl-name nil) + ) + (define-key minibuffer-local-must-match-map [up] up-fun) + (define-key minibuffer-local-must-match-map [down] down-fun) + (save-window-excursion + (wikipedia-describe-template default-name site templates) + (setq tpl-name (completing-read prompt + templates + nil ; predicate + t ; require-match + default-name ;; initial-input + (cons 'hist histpos) ;; hist + ))) + (when (= 0 (length tpl-name)) + (error "No template name given")) + (let ((tpl (assoc tpl-name templates))) + (unless tpl + (error "There is no template named %s for site %s" tpl-name site)) + ;;(lwarn 't :warning "tpl=%s" tpl) + ) + tpl-name)) + +(defun wikipedia-describe-template (name site templates) + (let ((tpl-rec (assoc name templates))) + (with-output-to-temp-buffer (help-buffer) + (with-current-buffer (help-buffer) + (help-setup-xref (list #'wikipedia-describe-template name site templates) (interactive-p)) + (let ((inhibit-read-only t) + start end + here + (tpl (assoc name templates))) + ;;(insert (format "%S\n\n" family)) + (insert (format "%s - a wiki template for site %s" name site)) + (insert "\n\n") + (setq start (point)) + (insert (cadr tpl)) + (setq end (point)) + (with-no-warnings (print-help-return-message)) + ;;(put-text-property start end 'face 'highlight) + (goto-char start) + (setq here (point)) + (while (re-search-forward "\\(?:\\|\\|.*\\)" end t) + (put-text-property here (match-beginning 0) 'face 'highlight) + (setq here (point)) + ) + (put-text-property (point) end 'face 'highlight) + ))))) + +(defun wikipedia-insert-nowiki () + "Mark the region as 'nowiki'. +When mark is active, surrounds region." + (interactive) + (wikipedia-insert-around-region "" "")) + + + +(defun wikipedia-insert-user () + "Prompt for a user name, insert [[User:foo]]" + (interactive) + (let ((user (read-string (get-lang-string wikipedia-lang 'wikip-username-prompt))) + (user-mark (get-lang-string wikipedia-lang 'wikip-user-mark))) + (insert (concat user-mark user "|" user "]]")))) + +(defun wikipedia-insert-signature () ;Version:1.4 + "Insert \"~~~~\". +This will be shown as your user identity when showing the page." + (interactive) + (insert "~~~~")) + + + +(defun wikipedia-insert-reply-prefix () ;Version:1.60 + "Quotation box of the form {{Quotation}}{{}}. When mark is active, +surrounds region." + (interactive) + (beginning-of-line 1) + (search-forward "[[") + (backward-char 2) + (mark-sexp 1) + (copy-to-register wikipedia-draft-reply-register (region-beginning) (region-end) nil) + (end-of-line 1) + (wikipedia-terminate-paragraph) + (beginning-of-line 1) + (kill-line nil) + (insert "----") + (newline 1) + (yank) + (insert ":'''Re: ") + (insert-register wikipedia-draft-reply-register 1) + (insert "''' ") + (end-of-line 1)) + +;; (defun wikipedia-insert-header () +;; "Insert subheader via == (e.g. == FOO ==.)" +;; (interactive) +;; (unless (bolp) +;; (beginning-of-line)) +;; (insert "== ") +;; (end-of-line) +;; (insert " ==") +;; (backward-char 3)) + +(defvar wikipedia-link-wiki-history nil) + +(defun wikipedia-insert-link-wiki () + "Insert link via [[ (e.g. [[FOO]].) When mark is active, surround region." + (interactive) + (if (wikipedia-region-active-p) + (wikipedia-insert-around-region "[[" "]]") + (let* ((link (read-string "Wiki link: " nil wikipedia-link-wiki-history)) + (name (read-string "Name (optional): "))) + (insert "[[" link) + (when (< 0 (length name)) + (insert "|" name)) + (insert "]]")))) + +(defun wikipedia-insert-link-external () + "Insert link via [[ (e.g. [http://FOO].) When mark is active, surround region." + (interactive) + (if (wikipedia-region-active-p) + (wikipedia-insert-around-region "[" "]") + (let* ((choices '("Plain" "Footnote" "Named")) + (hist (copy-sequence choices)) + (style (completing-read + "Link style: " ; prompt + choices ; collection + nil ; predicate + t ; requite-match + "Plain" ; initial-input + (cons 'hist 1) ; hist + )) + (url (read-string "URL: ")) + name) + ;;(lwarn 't :warning "style=%s" style) + (cond + ((string= style "Plain") + (insert url)) + ((string= style "Footnote") + (insert "[" url "]")) + ((string= style "Named") + (let ((name (read-string "Link name: "))) + (insert "[" url) + (when (< 0 (length name)) + (insert " " name)) + (insert "]"))) + (t + (error "Internal error, bad style=%s" style)))))) + + +(defun wikipedia-insert-image () + "Insert link image, e.g. [[Image:FOO]]. +When mark is active, surround region." + (interactive) + (let ((img-mark (get-lang-string wikipedia-lang 'wikip-image-mark))) + (wikipedia-insert-around-region img-mark "]]"))) + +(defun wikipedia-insert-audio () + "Insert audio link, e.g. [[Media:FOO]]. +When mark is active, surround region." + (interactive) + (let ((aud-mark (get-lang-string wikipedia-lang 'wikip-audio-mark))) + (wikipedia-insert-around-region aud-mark "]]"))) + + + + +;; (defun wikipedia-turn-on-outline-minor-mode () +;; "Turn on outline minor mode." +;; ;;(interactive) +;; (outline-minor-mode nil)) + + + + + + +(defun wikipedia-insert-hline () ;Version:1.29 + "Insert \"----\" " + (interactive) + (end-of-line) + (insert hard-newline "----" hard-newline)) + +(defun wikipedia-newline (&optional arg) + "Insert newline and check for bullets and numbering." + (interactive "*P") + (let ((here (point)) + (line-type nil)) + (beginning-of-line) + (when (eq ?* (char-after)) + (setq line-type 'bullet)) + (when (eq ?# (char-after)) + (setq line-type 'numbered)) + (if (and line-type + (looking-at ".\\s-*$")) + (progn + (delete-region (match-beginning 0) (match-end 0)) + (newline arg)) + (goto-char here) + (newline arg) + (cond + ((eq line-type 'bullet) + (insert "* ")) + ((eq line-type 'numbered) + (insert "# ")))))) + +;;}}} + +;;{{{ bullets and numbering + +;; Fix-me: Seems like this and my newline stuff already was there ... ;-) +(defun wikipedia-insert-bullet () + "Insert a bullet." + (interactive) + (end-of-line) + (newline) + (insert "* ")) + +(defun wikipedia-insert-numbering () + "Insert numbering." + (interactive) + (end-of-line) + (newline) + (insert "# ")) + +;;}}} + +;;{{{ filling and longline + +(defun wikipedia-unfill-paragraph-or-region () ;Version:1.7 + "Unfill region. +This function does NOT explicitly search for \"soft newlines\" as +does wikipedia-unfill-region." + (interactive) + (when use-hard-newlines + ;; (backward-paragraph 1) + ;; (next-line 1) + (beginning-of-line 1) + (set-fill-prefix) + ;; Fix-me: The use of make-local-variable here looks incorrect, + ;; use lexical binding instead: +;; (set (make-local-variable 'use-hard-newlines) nil) +;; (set (make-local-variable 'sentence-end-double-space) t) +;; (set (make-local-variable 'paragraph-start) "[   \n ]") + (let ((use-hard-newlines nil) + (sentence-end-double-space t) + (paragraph-start nil)) + (when (featurep 'xemacs) + (let ((fill-column (point-max))) + (fill-paragraph-or-region nil))) + (unless (featurep 'xemacs) + (let ((fill-column (point-max))) + (fill-paragraph nil))))) +;; (set (make-local-variable 'use-hard-newlines) t) +;; (set (make-local-variable 'sentence-end-double-space) nil) +;; (set (make-local-variable 'paragraph-start) "\\*\\| \\|#\\|;\\|:\\||\\|!\\|$")) + (unless use-hard-newlines + ;; (backward-paragraph 1) + ;; (next-line 1) + (beginning-of-line 1) + (set-fill-prefix) +;; (set (make-local-variable 'sentence-end-double-space) t) +;; (set (make-local-variable 'paragraph-start) + (let ((sentence-end-double-space t) + (paragraph-start nil)) + (when (featurep 'xemacs) + (let ((fill-column (point-max))) + (fill-paragraph-or-region nil))) + (unless (featurep 'xemacs) + (let ((fill-column (point-max))) + (fill-paragraph nil)))) +;; (set (make-local-variable 'sentence-end-double-space) nil) +;; (set (make-local-variable 'paragraph-start) "\\*\\| \\|#\\|;\\|:\\||\\|!\\|$") + )) + + + + +;; (defun wikipedia-start-paragraph () +;; (interactive) +;; (set (make-local-variable 'paragraph-start) +;; "\\*\\| \\|#\\|;\\|:\\||\\|!\\|$")) + +;; Use function use-hard-newlines instead: +;; (defun wikipedia-hardlines () +;; "Set use-hard-newlines to NIL." +;; (interactive) +;; (setq use-hard-newlines nil)) + +;; from emacs wiki +(defun wikipedia-next-long-line () + "Move forward to the next long line with column-width greater + than `fill-column'. + + TODO: When function reaches end of buffer, save-excursion to + starting point. + Generalise to make `previous-long-line'." + (interactive) + ;; global-variable: fill-column + (if (= (forward-line) 0) + (let ((line-length + (save-excursion + (end-of-line) + (current-column)))) + (if (<= line-length fill-column) + (wikipedia-next-long-line) + (message "Long line found"))) + ;; Stop, end of buffer reached. + (error "Long line not found"))) + + +(defun wikipedia-unfill-paragraph-simple () + "A very simple function for unfilling a paragraph." + (interactive) + (if (functionp 'filladapt-mode) + (filladapt-mode nil)) + (let ((fill-column (point-max))) + (fill-paragraph nil) + (if (functionp 'filladapt-mode) + (filladapt-mode nil)))) + +;;}}} + +;;{{{ outline and outline-magic stuff + +;;(add-hook 'wikipedia-mode-hook 'wikipedia-turn-on-outline-minor-mode) +;;(remove-hook 'wikipedia-mode-hook 'wikipedia-turn-on-outline-minor-mode) + +(defun wikipedia-outline-cycle () + (interactive) + (if (functionp 'outline-cycle) + (outline-cycle))) + +;; Fix-me: Unfortunately outline maybe does not take care of the +;; heading endings when promoting and demoting (I have submitted a bug +;; report for this and hooks will be added). To work around this we +;; defadvice outline-demote/promote: + +(require 'outline) +(unless (boundp 'outline-demote-hook) + + (defadvice outline-demote (after wikipedia-outline-demote-advice + (&optional which)) + "Adjust heading after demote." + (unless which + (wikipedia-adjust-header-end))) + + (defadvice outline-promote (after wikipedia-outline-promote-advice + (&optional which)) + "Adjust heading after promote." + (unless which + (wikipedia-adjust-header-end))) + + (defadvice outline-insert-heading (after wikipedia-outline-insert-heading-advice + ()) + "Adjust heading after insert new heading." + (wikipedia-adjust-header-end)) + + ) + +(defun wikipedia-adjust-header-end () + (when (eq major-mode 'wikipedia-mode) + (let ((here (point)) + (end-pos (line-end-position)) + bgn-mark + bgn-len + end-mark + end-len + ) + (beginning-of-line) + (when (looking-at outline-regexp) + (setq bgn-mark (match-string-no-properties 0)) + (setq bgn-len (length bgn-mark)) + (end-of-line) + (if (looking-back outline-regexp nil t) + (when (progn + (setq end-mark (match-string-no-properties 0)) + (setq end-len (length end-mark)) + (/= end-len bgn-len)) + (replace-match bgn-mark)) + (insert bgn-mark))) + ;;(lwarn 't :warning "bgn-len=%s, end-len=%s" bgn-len end-len) + (goto-char here)))) + + + +;;(add-hook 'outline-minor-mode-hook 'wikipedia-outline-magic-keys) +(add-hook 'wikipedia-mode-hook 'wikipedia-outline-magic-keys) + +(defun wikipedia-outline-magic-keys () + (interactive) + (unless (featurep 'xemacs) + (local-set-key [(shift iso-lefttab)] 'wikipedia-outline-cycle)) + (local-set-key [iso-left-tab] 'wikipedia-outline-cycle) + ;;(local-set-key [(meta left)] 'outline-promote) + (local-set-key [(meta shift left)] 'outline-promote) + ;;(local-set-key [(meta right)] 'outline-demote) + (local-set-key [(meta shift right)] 'outline-demote) + ;;(local-set-key [(control left)] 'wikipedia-simple-outline-promote) + (local-set-key [(meta left)] 'wikipedia-simple-outline-promote) + ;;(local-set-key [(control right)] 'wikipedia-simple-outline-demote) + (local-set-key [(meta right)] 'wikipedia-simple-outline-demote) + (local-set-key [(shift return)] 'newline-and-indent) + ;;(local-set-key [(control up)] 'outline-move-subtree-up) + (local-set-key [(meta shift up)] 'outline-move-subtree-up) + ;;(local-set-key [(control down)] 'outline-move-subtree-down)) + (local-set-key [(meta shift down)] 'outline-move-subtree-down)) + +(defun wikipedia-enhance-indent () ;Version:1.26 + (interactive) + (string-rectangle (region-beginning) (region-end) ":")) + +(defun wikipedia-yank-prefix () ;Version:1.26 + (interactive) + (string-rectangle (region-beginning) (region-end) ":")) + +;; modification for outline-magic + +(defun wikipedia-simple-outline-promote () + "Function simple deletes \"=\" and the end and the beginning of line, +does not promote the whole tree!" + (interactive) + (save-excursion + (progn + (beginning-of-line 1) + (search-forward "=") + (delete-char 1 nil) + (end-of-line 1) + (search-backward "=") + (delete-char 1 nil)))) + +(defun wikipedia-simple-outline-demote () + "Function simple adds \"=\" and the end and the beginning of line, +does not promote the whole tree!" + (interactive) + (save-excursion + (progn + (beginning-of-line 1) + (search-forward "=") + (insert "=") + (end-of-line 1) + (search-backward "=") + (insert "=")))) + + +(defun wikipedia-rename-buffer () ;Version:1.5 + "Make sure that the option UNIQUE is used." + (interactive) + (rename-buffer (read-string "Name of new buffer (unique): " ) 1)) + +;;}}} + +;;{{{ wikipedia drafts functionality: `stolen' from remember.el: + +(defgroup wikipedia-draft nil + "A mode to wikipedia-draft information." + :group 'data) + +;;; User Variables: + +(defcustom wikipedia-draft-mode-hook nil + "*Functions run upon entering wikipedia-draft-mode." + :type 'hook + :group 'wikipedia-draft) + +(defcustom wikipedia-draft-register ?R + "The register in which the window configuration is stored." + :type 'character + :group 'wikipedia-draft) + +(defcustom wikipedia-draft-filter-functions nil + "*Functions run to filter wikipedia-draft data. +All functions are run in the wikipedia-draft buffer." + :type 'hook + :group 'wikipedia-draft) + +(defcustom wikipedia-draft-handler-functions '(wikipedia-draft-append-to-file) + "*Functions run to process wikipedia-draft data. +Each function is called with the current buffer narrowed to what the +user wants wikipedia-drafted. +If any function returns non-nil, the data is assumed to have been +recorded somewhere by that function. " + :type 'hook + :group 'wikipedia-draft) + +(defcustom wikipedia-draft-data-file "~/Wiki/discussions/draft.wiki" + "*The file in which to store the wikipedia drafts." + :type 'file + :group 'wikipedia-draft) + +(defcustom wikipedia-draft-reply-register ?M + "The register in which the window configuration is stored." + :type 'character + :group 'wikipedia-draft) + +(defcustom wikipedia-draft-page ?S ;Version:1.37 + "The register in which the a page of the wiki draft file is stored." + :type 'character + :group 'wikipedia-draft) + + +(defcustom wikipedia-draft-leader-text "== " + "*The text used to begin each wikipedia-draft item." + :type 'string + :group 'wikipedia-draft) + + +;;; Internal Variables: + +(defvar wikipedia-draft-buffer "*Wikipedia-Draft*" + "The name of the wikipedia-draft (temporary) data entry buffer.") + +;;; User Functions: + +;;;###autoload +(defun wikipedia-draft () + "Open a temporary buffer in wikipedia mode for editing an + wikipedia draft, which an arbitrary piece of data. After + finishing the editing either use \\[wikipedia-draft-buffer] to + send the data into the wikipedia-draft-data-file, or send the + buffer using `wikipedia-draft-send-to-mozex' and insert it later + into a wikipedia article." + (interactive) + (window-configuration-to-register wikipedia-draft-register) + (let ((buf (get-buffer-create wikipedia-draft-buffer))) + (switch-to-buffer-other-window buf) + (wikipedia-mode) + (message " C-c C-k sends to draft file, C-c C-c sends to org buffer."))) + + + + + +(defsubst wikipedia-draft-time-to-seconds (time) + "Convert TIME to a floating point number." + (+ (* (car time) 65536.0) + (cadr time) + (/ (or (car (cdr (cdr time))) 0) 1000000.0))) + +(defsubst wikipedia-draft-mail-date (&optional rfc822-p) + "Return a simple date. Nothing fancy." + (if rfc822-p + (format-time-string "%a, %e %b %Y %T %z" (current-time)) + (format-time-string "%c" (current-time)))) + +(defun wikipedia-draft-buffer-desc () + "Using the first line of the current buffer, create a short description." + (buffer-substring (point-min) + (save-excursion + (goto-char (point-min)) + (end-of-line) + (if (> (- (point) (point-min)) 60) + (goto-char (+ (point-min) 60))) + (point)))) + + +;; Wikipedia-Drafting to plain files: + + +(defun wikipedia-draft-append-to-file () + "Add a header together with a subject to the text and add it to the +draft file. It might be better if longlines-mode is off." + (let ((text (buffer-string)) + (desc (wikipedia-draft-buffer-desc))) + (with-temp-buffer + (insert "\n\n") + (insert wikipedia-draft-leader-text) + (insert "Draft: ") ;Version:1.39 + (insert (read-string "Enter Subject: ")) + (insert " ") + (insert (current-time-string)) + (insert " ") + (insert wikipedia-draft-leader-text) + (insert "\n\n") ;Version:1.27 + (insert " ") + (insert "\n\n") + (insert text) + (insert "\n") + (insert " ") + (insert "\n") + (if (not (bolp)) + (insert "\n\n")) + (if (find-buffer-visiting wikipedia-draft-data-file) + (let ((wikipedia-draft-text (buffer-string))) + (set-buffer (get-file-buffer wikipedia-draft-data-file)) + (save-excursion + (goto-char (point-max)) + (insert "\n") + (insert wikipedia-draft-text) + (insert "\n") + (save-buffer))) + (append-to-file (point-min) (point-max) wikipedia-draft-data-file))))) + + +(setq wikipedia-draft-handler-functions 'wikipedia-draft-append-to-file) + + +(custom-add-option 'wikipedia-draft-handler-functions 'wikipedia-draft-append-to-file) + +;;;###autoload +(defun wikipedia-draft-page () ;Version:1.32 + (interactive) + (mark-page) + (copy-region-as-kill (region-beginning) (region-end)) + (wikipedia-draft) + (yank nil)) + + +(defun wikipedia-draft-region (&optional beg end) + "Wikipedia-Draft the data from BEG to END. +If called from within the wikipedia-draft buffer, BEG and END are ignored, +and the entire buffer will be wikipedia-drafted. If called from any other +buffer, that region, plus any context information specific to that +region, will be wikipedia-drafted." + (interactive) + (let ((b (or beg (min (point) (or (mark) (point-min))))) + (e (or end (max (point) (or (mark) (point-max)))))) + (save-restriction + (narrow-to-region b e) + (run-hook-with-args-until-success 'wikipedia-draft-handler-functions) + (when (equal wikipedia-draft-buffer (buffer-name)) + (kill-buffer (current-buffer)) + (jump-to-register wikipedia-draft-register))))) + +;; +;;;###autoload +(defun wikipedia-draft-buffer () + "Wikipedia-draft-buffer sends the contents of the current (temporary) +buffer to the wikipedia-draft-buffer, see the variable +wikipedia-draft-data-file." + (interactive) + (wikipedia-draft-region (point-min) (point-max))) + +(defun wikipedia-draft-clipboard () + "Wikipedia-Draft the contents of the current clipboard. +Most useful for wikipedia-drafting things from Netscape or other X Windows +application." + (interactive) + (with-temp-buffer + (insert (x-get-clipboard)) + (run-hook-with-args-until-success 'wikipedia-draft-handler-functions))) + +;;;###autoload + + +;;; Internal Functions: +(defvar wikipedia-draft-send-archive t ;Version:1.56 + "*Archive the reply.") + +(defvar wikipedia-draft-mode-map + (let ((m (make-sparse-keymap))) + (define-key m "\C-c\C-k" 'wikipedia-draft-buffer) + (define-key m "\C-c\C-d" 'wikipedia-draft-buffer) + m)) + +(defun wikipedia-draft-mode () + "Major mode for output from \\[wikipedia-draft]. +\\ This buffer is used to collect data that +you want wikipedia-draft. Just hit \\[wikipedia-draft-region] when +you're done entering, and it will go ahead and file the data for +latter retrieval, and possible indexing. +\\{wikipedia-draft-mode-map}" + (interactive) + (kill-all-local-variables) + (indented-text-mode) + (use-local-map wikipedia-draft-mode-map) + (setq major-mode 'wikipedia-draft-mode + mode-name "Wikipedia-Draft") + (run-hooks 'wikipedia-draft-mode-hook)) + + +(defun wikipedia-draft-view-draft () + (interactive) + "Simple shortcut to visit the file, which contains the wikipedia drafts." + (find-file wikipedia-draft-data-file)) + +;;}}} + +;;{{{ functions for marking regions + +(defun wikipedia-mark-section () ;Version:1.36 + "Set mark at end of current logical section, and point at top." + (interactive) + (re-search-forward (concat "== " "[a-z,A-z \t]*" + " ==")) + (re-search-backward "^") + (set-mark (point)) + (re-search-backward (concat "== " "[a-z,A-z \t]*" + " ")) + (wikipedia-activate-region)) + +(defun wikipedia-mark-signature () ;Version:1.36 + "Set mark at end of current logical section, and point at top." + (interactive) + (re-search-forward "]]") ;;[[ ]] + (re-search-backward "^") + (set-mark (point)) + (re-search-backward "[[") + (wikipedia-activate-region)) + +(when (featurep 'xemacs) + (fset 'wikipedia-activate-region (symbol-function 'zmacs-activate-region))) + +(unless (featurep 'xemacs) + (defun wikipedia-activate-region () + nil)) + +;;}}} + +;;{{{ `reply' and `send' functions + +(defun wikipedia-draft-copy-page-to-register () ;Version:1.47 + "Copy a page via the wikipedia-draft-register." + (interactive) + (save-excursion + (narrow-to-page nil) + (copy-to-register wikipedia-draft-page (point-min) (point-max) nil) + (message "draft page copied to wikipedia register wikipedia-draft-page.") + (widen))) + + ;aux function +(defun wikipedia-draft-yank-page-to-register () ;Version:1.50 + "Insert a page via the wikipedia-draft-register." + (interactive) + (insert-register wikipedia-draft-page nil)) + + + +(defun wikipedia-draft-send-to-mozex (target-buffer) ;Version:1.56 + "Copy the current page from the wikipedia draft file to + TARGET-BUFFER, this buffer is named something like mozex.textarea. +Check the variable wikipedia-draft-send-archive. If it is t, then +additionally the text will be archived in the draft.wiki file. Check +longlines-mode, it might be better if it is set off." + (interactive "bTarget buffer: ") + (let ((src-buf (current-buffer))) + (wikipedia-draft-copy-page-to-register) + (switch-to-buffer target-buffer) + (end-of-line 1) + (newline 1) + (wikipedia-draft-yank-page-to-register) + (message "The page has been sent (copied) to the mozex file!") + (switch-to-buffer "*Wikipedia-Draft*") + (when wikipedia-draft-send-archive ;Version:1.56 + (let ((text (buffer-string)) ;Version:1.59 + (desc (wikipedia-draft-buffer-desc))) + (with-temp-buffer + (insert "\n\n") + (insert wikipedia-draft-leader-text) + (insert-register wikipedia-draft-reply-register 1) + (insert " ") + (insert (current-time-string)) + (insert " ") + (insert wikipedia-draft-leader-text) + (insert "\n\n") + (insert " ") + (insert "\n\n") + (insert text) + (insert "\n") + (insert " ") + (insert "\n") + (if (not (bolp)) + (insert "\n\n")) + (if (find-buffer-visiting wikipedia-draft-data-file) + (let ((wikipedia-draft-text (buffer-string))) + (set-buffer (get-file-buffer wikipedia-draft-data-file)) + (save-excursion + (goto-char (point-max)) + (insert "\n") + (insert wikipedia-draft-text) + (insert "\n") + (save-buffer))) + (append-to-file (point-min) (point-max) wikipedia-draft-data-file))))) + (when (equal wikipedia-draft-buffer (buffer-name)) + (kill-buffer (current-buffer))) + (switch-to-buffer target-buffer))) + + +;;Apr_22_2006 +(defvar wikipedia-reply-with-hline nil + "*Whether to use a hline as a header seperator in the reply.") + +(defvar wikipedia-reply-with-quote nil ;Version:1.60 + "*Whether to use a quotation tempalate or not.") + +(defvar wikipedia-user-simplify-signature t + "*Simple varible in order to threat complicated signatures of users, which uses +fonts and other makeup.") + +(defun wikipedia-reply-at-signature () ;Version:1.40 + "Very simple function to add the reply prefix to the signature, +sorrounded by the boldface makeup. You have to set the point BEFORE +the signature, then the functions inserts the following +:'''Re: [[User:foo]]'''." + (interactive) + (beginning-of-line 1) + (search-forward "[[") + (mark-word 3) + (yank) + (end-of-line 1) + (wikipedia-terminate-paragraph) + (insert ":'''Re: ") + (insert "[[") + (yank) + (insert "]]") + (insert "'''")) + + + + +(defun wikipedia-draft-reply () ;Version:1.62 + "Open a temporary buffer in wikipedia mode for editing an wikipedia +draft, with an arbitrary piece of data. After finishing the editing +|]]:either use \"C-c C-k\" \\[wikipedia-draft-buffer] to send the data into +the wikipedia-draft-data-file, or send the buffer \"C-c\C-c\", +\\[wikipedia-draft-send-to-mozex] to the current wikipedia article via +mozex. Check the varibale wikipedia-draft-send-archive." + (interactive) + (wikipedia-reply-at-point-simple) + (beginning-of-line 1) + (kill-line nil) + (save-excursion + (window-configuration-to-register wikipedia-draft-register) + (let ((buf (get-buffer-create wikipedia-draft-buffer))) + (switch-to-buffer-other-window buf) + (wikipedia-mode) + (if (functionp 'pabbrev-mode) + (pabbrev-mode)) + (when (not wikipedia-reply-with-quote) + (when wikipedia-reply-with-hline + (insert "----") + (newline 1)) + (yank) + (end-of-line 1)) + (when wikipedia-reply-with-quote + (insert "{{Quotation|") + (yank) + (insert "'''Re: ") + (insert-register wikipedia-draft-reply-register 1) + (insert "''' |~~~~}}") + (backward-char 7)) + (message " C-c C-k sends to draft, C-c C-c sends to org buffer.")))) + +(defun wikipedia-reply-at-point-simple () ;Version:1.65 + "Reply to posts in discussion forums. +You have to put the region around the signature, then the +functions inserts the following +:'''Re: [[User:foo]]'''." + (interactive) + (beginning-of-line 1) + (search-forward (get-lang-string wikipedia-lang 'wikip-utc)) + (search-backward (get-lang-string wikipedia-lang 'wikip-user-mark)) + (when (not wikipedia-user-simplify-signature) + (mark-word 3)) + (when wikipedia-user-simplify-signature + (mark-word 2)) + (copy-to-register wikipedia-draft-reply-register (region-beginning) (region-end) nil) + (end-of-line 1) + (wikipedia-terminate-paragraph-and-indent) + (insert ":'''Re: ") + (insert-register wikipedia-draft-reply-register 1) + (when wikipedia-user-simplify-signature + (insert "|]]''' ")) + (when (not wikipedia-user-simplify-signature) + (insert "]]''' "))) + +;;}}} + +;;{{{ Optional private stuff: + +;; (defun wikipedia-insert-quotation-with-signature () ;Version:1.60 +;; "Insert quotation with signature. +;; When mark is active, surrounds region." +;; (interactive) +;; (wikipedia-insert-around-region "{{Quotation|" "}}{{~~~~}}")) + +;; (defun wikipedia-insert-quotation () ;Version:1.60 +;; "Insert quotation box. +;; When mark is active, surrounds region." +;; (interactive) +;; ;; Fix-me: This uses a template, is that really always available??? +;; (wikipedia-insert-around-region "{{Quotation|" "}}")) + +;; (define-key wikipedia-mode-map "\C-c\C-fv" 'wikipedia-insert-bible-verse-template) +;; +;; (defun wikipedia-insert-bible-verse-template () +;; "Insert a template for the quotation of bible verses." +;; (interactive) +;; (insert "({{niv|") +;; (let ((name (read-string "Name: "))) +;; (insert (concat name "|")) +;; (let ((verse (read-string "Verse: "))) +;; (insert (concat verse "|" name " " verse "}})"))))) + +;;}}} + +(provide 'wikipedia-mode) +;;; wikipedia-mode.el ends here. + + -- cgit v1.2.3-54-g00ecf