Merge lp:~tag-biostat/mediawiki-el/tag into lp:mediawiki-el

Proposed by Thomas Alexander Gerds
Status: Needs review
Proposed branch: lp:~tag-biostat/mediawiki-el/tag
Merge into: lp:mediawiki-el
Diff against target: 247 lines (+129/-18) (has conflicts)
1 file modified
mediawiki.el (+129/-18)
Text conflict in mediawiki.el
To merge this branch: bzr merge lp:~tag-biostat/mediawiki-el/tag
Reviewer Review Type Date Requested Status
Mark A. Hershberger Pending
Review via email: mp+158270@code.launchpad.net

Description of the change

New feature for interactive selection of namespaces and pages from active mediawiki-site.

To post a comment you must log in.

Unmerged revisions

41. By Thomas Alexander Gerds

New functions: mediawiki-find-page and mediawiki-insert-page-list

40. By Thomas Alexander Gerds

** Changes

 - mediawiki-page-at-point now also recognizes {{PAGE}}
 - new user option `mediawiki-save-ask-for-summary' used by `mediawiki-save'
 - new user option `mediawiki-make-api-url-ext' used by mediawiki-make-api-url
 - new user option `mediawiki-open-prefer-existing-buffer' used by `mediawiki-open'
 - new user option `mediawiki-buffer-pop-dont-pop used by `mediawiki-pop-to-buffer'
 - new function mediawiki-open-page-at-point-other-window, useful only for those who set mediawiki-buffer-pop-dont-pop.

** Todo

 - somehow "replace" `save-buffer' by `mediawiki-save', so that `save-some-buffers' and `save-buffers-kill-emacs' will offer save
 - extract completion list of existing pages from mediawiki server (API)
 - let `mediawiki-open' check if page has changed on the mediawiki engine, e.g by comparing the current emacs buffer with a temp buffer showing the page as it is in mediawiki engine.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'mediawiki.el'
2--- mediawiki.el 2013-02-23 19:41:34 +0000
3+++ mediawiki.el 2013-04-11 05:03:20 +0000
4@@ -6,13 +6,25 @@
5 ;; Chong Yidong <cyd at stupidchicken com> for wikipedia.el,
6 ;; Uwe Brauer <oub at mat.ucm.es> for wikimedia.el
7 ;; Author: Mark A. Hershberger <mah@everybody.org>
8+<<<<<<< TREE
9 ;; Version: 2.2.4.2
10+=======
11+;; Version: 2.2.5
12+>>>>>>> MERGE-SOURCE
13 ;; Created: Sep 17 2004
14 ;; Keywords: mediawiki wikipedia network wiki
15 ;; URL: http://launchpad.net/mediawiki-el
16+<<<<<<< TREE
17 ;; Last Modified: <2013-02-23 14:41:05 mah>
18+=======
19+;; Last Modified: <2012-10-11 Thu 8:05 am>
20+>>>>>>> MERGE-SOURCE
21
22+<<<<<<< TREE
23 (defconst mediawiki-version "2.2.4.2"
24+=======
25+(defconst mediawiki-version "2.2.5"
26+>>>>>>> MERGE-SOURCE
27 "Current version of mediawiki.el")
28
29 ;; This file is NOT (yet) part of GNU Emacs.
30@@ -538,6 +550,32 @@
31 :type 'hook
32 :group 'mediawiki)
33
34+
35+(defcustom mediawiki-make-api-url-ext "php"
36+ "Extension for constructing the mediawiki-make-api-url."
37+ :type 'string
38+ :group 'mediawiki)
39+
40+(defcustom mediawiki-save-ask-for-summary t
41+ "If nil save pages with blank summary, otherwise prompt for summary."
42+ :type 'boolean
43+ :group 'mediawiki)
44+
45+(defcustom mediawiki-open-prefer-existing-buffer t
46+ "If non-nil and there is a buffer visiting the page, return that one.
47+
48+If set to nil opening a page will always open the version of the page
49+from the mediawiki engine. This may overwrite unsaved edits of the
50+ current session."
51+ :type 'boolean
52+ :group 'mediawiki)
53+
54+(defcustom mediawiki-buffer-pop-dont-pop nil
55+"If set to non-nil mediawiki-pop-to-buffer will switch-to rather
56+than pop-to buffer."
57+ :type 'boolean
58+ :group 'mediawiki)
59+
60 (defvar mediawiki-page-history '()
61 "Assoc list of visited pages on this MW site.")
62
63@@ -551,6 +589,7 @@
64 "*Simple varible in order to threat complicated signatures of users, which uses
65 fonts and other makeup.")
66
67+
68 (defgroup mediawiki-draft nil
69 "A mode to mediawiki-draft information."
70 :group 'mediawiki)
71@@ -608,6 +647,7 @@
72 :type 'string
73 :group 'mediawiki-draft)
74
75+
76 (defvar mediawiki-reply-with-hline nil
77 "*Whether to use a hline as a header seperator in the reply.")
78
79@@ -653,7 +693,6 @@
80
81 (defvar mediawiki-page-title nil
82 "The title of the page corresponding to the current buffer")
83-
84 (defvar mediawiki-edittoken nil
85 "The edit token for this page.")
86 (defvar mediawiki-starttimestamp nil
87@@ -931,7 +970,7 @@
88
89 (defun mediawiki-make-api-url (&optional sitename)
90 (format (concat (mediawiki-site-url (or sitename mediawiki-site))
91- "api.php")))
92+ "api." mediawiki-make-api-url-ext)))
93
94 (defun mediawiki-api-call (sitename action args)
95 (let* ((raw (url-http-post (mediawiki-make-api-url sitename)
96@@ -971,14 +1010,19 @@
97 action))
98
99 (defun mediawiki-open (name)
100- "Open a wiki page specified by NAME from the mediawiki engine"
101+ "Open a wiki page specified by NAME from the mediawiki engine.
102+If a buffer exists visiting this page, return that one."
103 (interactive
104 (let ((hist (cdr (assoc-string mediawiki-site mediawiki-page-history))))
105 (list (read-string "Wiki Page: " nil 'hist))))
106 (when (or (not (stringp name))
107 (string-equal "" name))
108 (error "Need to specify a name"))
109- (mediawiki-edit mediawiki-site name))
110+ (if (and mediawiki-open-prefer-existing-buffer
111+ ;; check if there is a buffer for this page (to not loose unsaved edits)
112+ (get-buffer (concat mediawiki-site ": " name)))
113+ (switch-to-buffer (concat mediawiki-site ": " name))
114+ (mediawiki-edit mediawiki-site name)))
115
116 (defun mediawiki-reload ()
117 (interactive)
118@@ -987,6 +1031,59 @@
119 (mediawiki-open title)
120 (error "Error: %s is not a mediawiki document" (buffer-name)))))
121
122+
123+(defun mediawiki-get-namespaces (sitename limit)
124+ "Query mediawiki-site SITENAME for the first LIMIT namespaces."
125+ (let ((namespaces (mediawiki-api-call
126+ sitename "query"
127+ (list (cons "meta" "siteinfo")
128+ (cons "siprop" "namespaces|namespacealiases")
129+ (cons "aplimit" (mediawiki-api-param (or limit "100"))))))
130+ ns)
131+ (delq nil (mapcar (lambda (x) (when (and (listp x) x)
132+ (cons (or (caddr x) "main") (cdr (assq 'id (cadr x))))))
133+ (caddr namespaces)))))
134+
135+(defun mediawiki-get-page-list (sitename namespace limit)
136+ "Query mediawiki-site SITENAME for the first LIMIT pages in NAMESPACE."
137+ (let ((pages (mediawiki-api-call
138+ sitename "query"
139+ (list (cons "list" "allpages")
140+ (when namespace
141+ (cons "apnamespace" (mediawiki-api-param namespace)))
142+ (cons "aplimit" (mediawiki-api-param (or limit "5"))))))
143+ page)
144+ (delq nil (mapcar (lambda (x)
145+ (when (and (listp x) x)
146+ (let ((el (cdr (assq 'title (cadr x)))))
147+ (cons (cadr (split-string el ":"))
148+ el))))
149+ (caddr pages)))))
150+
151+(defun mediawiki-find-page (&optional limit)
152+ "Interactively select a namespace and then select
153+a page with completion from the list of pages in the namespace.
154+If LIMIT is an integer restrict the completion list. Default is 1000."
155+ (interactive "p")
156+ (let* ((namespaces (mediawiki-get-namespaces mediawiki-site 1000))
157+ (ns (cdr (assoc (completing-read "Find in namespace: " namespaces) namespaces)))
158+ (page-list (mediawiki-get-page-list
159+ mediawiki-site ns (if (> limit 1) limit 1000)))
160+ (page (completing-read "Page name: " page-list)))
161+ (mediawiki-open (cdr (assoc page page-list)))))
162+
163+(defun mediawiki-insert-page-list (&optional limit)
164+ "Interactively select a namespace and write the names of the pages
165+in the namespace to the current buffer.
166+If LIMIT is an integer restrict the page list. Default is 1000."
167+ (interactive "p")
168+ (let* ((namespaces (mediawiki-get-namespaces mediawiki-site 1000))
169+ (ns (cdr (assoc (completing-read "Find in namespace: " namespaces) namespaces)))
170+ (pages (mediawiki-get-page-list mediawiki-site ns 1000)))
171+ (while pages
172+ (insert (caar pages) "\n")
173+ (setq pages (cdr pages)))))
174+
175 (defun mediawiki-add-page-history (site title)
176 (let ((hist (cdr (assoc-string site mediawiki-page-history))))
177 (unless hist
178@@ -1086,9 +1183,12 @@
179 (url-filename urlobj)
180 (equal "https" (url-type urlobj)))))
181
182-(defun mediawiki-pop-to-buffer (bufname)
183- "Pop to buffer and then execute a hook."
184- (pop-to-buffer bufname)
185+(defun mediawiki-pop-to-buffer (bufname &optional dont-pop)
186+ "If dont-pop is non-nil pop-to-buffer, else switch-to-buffer BUFNAME,
187+ Then execute a hook."
188+ (if (or dont-pop mediawiki-buffer-pop-dont-pop)
189+ (switch-to-buffer bufname)
190+ (pop-to-buffer bufname))
191 (run-hooks 'mediawiki-pop-buffer-hook))
192
193 (defun mediawiki-api-param (v)
194@@ -1164,14 +1264,18 @@
195 (mediawiki-page-get-metadata page 'starttimestamp)))
196
197 (defun mediawiki-save (&optional summary)
198- (interactive "sSummary: ")
199- (if mediawiki-page-title
200- (mediawiki-save-page
201- mediawiki-site
202- mediawiki-page-title
203- summary
204- (buffer-substring-no-properties (point-min) (point-max)))
205- (error "Error: %s is not a mediawiki document" (buffer-name))))
206+ (interactive)
207+ (let ((summary
208+ (or summary
209+ (when mediawiki-save-ask-for-summary (read-string "Summary: "))
210+ "")))
211+ (if mediawiki-page-title
212+ (mediawiki-save-page
213+ mediawiki-site
214+ mediawiki-page-title
215+ summary
216+ (buffer-substring-no-properties (point-min) (point-max)))
217+ (error "Error: %s is not a mediawiki document" (buffer-name)))))
218
219 (defun mediawiki-prompt-for-page ()
220 (let* ((prompt (concat "Page"
221@@ -1337,16 +1441,23 @@
222 (interactive)
223 (mediawiki-open (mediawiki-page-at-point)))
224
225+(defun mediawiki-open-page-at-point-other-window ()
226+ "Open a new buffer with the page at point in a different window also
227+if `mediawiki-buffer-pop-dont-pop' is set."
228+ (interactive)
229+ (let ((mediawiki-buffer-pop-dont-pop nil))
230+ (mediawiki-open (mediawiki-page-at-point))))
231+
232 (defun mediawiki-page-at-point ()
233 "Return the page name under point. Typically, this means
234-anything enclosed in [[PAGE]]."
235+anything enclosed in [[PAGE]] or {{PAGE}}."
236 (let ((pos (point))
237 (eol (point-at-eol))
238 (bol (point-at-bol)))
239 (save-excursion
240- (let* ((start (when (search-backward "[[" bol t)
241+ (let* ((start (when (or (search-backward "[[" bol t) (search-backward "{{" bol t))
242 (+ (point) 2)))
243- (end (when (search-forward "]]" eol t)
244+ (end (when (or (search-forward "]]" eol t) (search-forward "}}" eol t))
245 (- (point) 2)))
246 (middle (progn
247 (goto-char start)

Subscribers

People subscribed via source and target branches