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
=== modified file 'mediawiki.el'
--- mediawiki.el 2013-02-23 19:41:34 +0000
+++ mediawiki.el 2013-04-11 05:03:20 +0000
@@ -6,13 +6,25 @@
6;; Chong Yidong <cyd at stupidchicken com> for wikipedia.el,6;; Chong Yidong <cyd at stupidchicken com> for wikipedia.el,
7;; Uwe Brauer <oub at mat.ucm.es> for wikimedia.el7;; Uwe Brauer <oub at mat.ucm.es> for wikimedia.el
8;; Author: Mark A. Hershberger <mah@everybody.org>8;; Author: Mark A. Hershberger <mah@everybody.org>
9<<<<<<< TREE
9;; Version: 2.2.4.210;; Version: 2.2.4.2
11=======
12;; Version: 2.2.5
13>>>>>>> MERGE-SOURCE
10;; Created: Sep 17 200414;; Created: Sep 17 2004
11;; Keywords: mediawiki wikipedia network wiki15;; Keywords: mediawiki wikipedia network wiki
12;; URL: http://launchpad.net/mediawiki-el16;; URL: http://launchpad.net/mediawiki-el
17<<<<<<< TREE
13;; Last Modified: <2013-02-23 14:41:05 mah>18;; Last Modified: <2013-02-23 14:41:05 mah>
19=======
20;; Last Modified: <2012-10-11 Thu 8:05 am>
21>>>>>>> MERGE-SOURCE
1422
23<<<<<<< TREE
15(defconst mediawiki-version "2.2.4.2"24(defconst mediawiki-version "2.2.4.2"
25=======
26(defconst mediawiki-version "2.2.5"
27>>>>>>> MERGE-SOURCE
16 "Current version of mediawiki.el")28 "Current version of mediawiki.el")
1729
18;; This file is NOT (yet) part of GNU Emacs.30;; This file is NOT (yet) part of GNU Emacs.
@@ -538,6 +550,32 @@
538 :type 'hook550 :type 'hook
539 :group 'mediawiki)551 :group 'mediawiki)
540552
553
554(defcustom mediawiki-make-api-url-ext "php"
555 "Extension for constructing the mediawiki-make-api-url."
556 :type 'string
557 :group 'mediawiki)
558
559(defcustom mediawiki-save-ask-for-summary t
560 "If nil save pages with blank summary, otherwise prompt for summary."
561 :type 'boolean
562 :group 'mediawiki)
563
564(defcustom mediawiki-open-prefer-existing-buffer t
565 "If non-nil and there is a buffer visiting the page, return that one.
566
567If set to nil opening a page will always open the version of the page
568from the mediawiki engine. This may overwrite unsaved edits of the
569 current session."
570 :type 'boolean
571 :group 'mediawiki)
572
573(defcustom mediawiki-buffer-pop-dont-pop nil
574"If set to non-nil mediawiki-pop-to-buffer will switch-to rather
575than pop-to buffer."
576 :type 'boolean
577 :group 'mediawiki)
578
541(defvar mediawiki-page-history '()579(defvar mediawiki-page-history '()
542 "Assoc list of visited pages on this MW site.")580 "Assoc list of visited pages on this MW site.")
543581
@@ -551,6 +589,7 @@
551 "*Simple varible in order to threat complicated signatures of users, which uses589 "*Simple varible in order to threat complicated signatures of users, which uses
552fonts and other makeup.")590fonts and other makeup.")
553591
592
554(defgroup mediawiki-draft nil593(defgroup mediawiki-draft nil
555 "A mode to mediawiki-draft information."594 "A mode to mediawiki-draft information."
556 :group 'mediawiki)595 :group 'mediawiki)
@@ -608,6 +647,7 @@
608 :type 'string647 :type 'string
609 :group 'mediawiki-draft)648 :group 'mediawiki-draft)
610649
650
611(defvar mediawiki-reply-with-hline nil651(defvar mediawiki-reply-with-hline nil
612"*Whether to use a hline as a header seperator in the reply.")652"*Whether to use a hline as a header seperator in the reply.")
613653
@@ -653,7 +693,6 @@
653693
654(defvar mediawiki-page-title nil694(defvar mediawiki-page-title nil
655 "The title of the page corresponding to the current buffer")695 "The title of the page corresponding to the current buffer")
656
657(defvar mediawiki-edittoken nil696(defvar mediawiki-edittoken nil
658 "The edit token for this page.")697 "The edit token for this page.")
659(defvar mediawiki-starttimestamp nil698(defvar mediawiki-starttimestamp nil
@@ -931,7 +970,7 @@
931970
932(defun mediawiki-make-api-url (&optional sitename)971(defun mediawiki-make-api-url (&optional sitename)
933 (format (concat (mediawiki-site-url (or sitename mediawiki-site))972 (format (concat (mediawiki-site-url (or sitename mediawiki-site))
934 "api.php")))973 "api." mediawiki-make-api-url-ext)))
935974
936(defun mediawiki-api-call (sitename action args)975(defun mediawiki-api-call (sitename action args)
937 (let* ((raw (url-http-post (mediawiki-make-api-url sitename)976 (let* ((raw (url-http-post (mediawiki-make-api-url sitename)
@@ -971,14 +1010,19 @@
971 action))1010 action))
9721011
973(defun mediawiki-open (name)1012(defun mediawiki-open (name)
974 "Open a wiki page specified by NAME from the mediawiki engine"1013 "Open a wiki page specified by NAME from the mediawiki engine.
1014If a buffer exists visiting this page, return that one."
975 (interactive1015 (interactive
976 (let ((hist (cdr (assoc-string mediawiki-site mediawiki-page-history))))1016 (let ((hist (cdr (assoc-string mediawiki-site mediawiki-page-history))))
977 (list (read-string "Wiki Page: " nil 'hist))))1017 (list (read-string "Wiki Page: " nil 'hist))))
978 (when (or (not (stringp name))1018 (when (or (not (stringp name))
979 (string-equal "" name))1019 (string-equal "" name))
980 (error "Need to specify a name"))1020 (error "Need to specify a name"))
981 (mediawiki-edit mediawiki-site name))1021 (if (and mediawiki-open-prefer-existing-buffer
1022 ;; check if there is a buffer for this page (to not loose unsaved edits)
1023 (get-buffer (concat mediawiki-site ": " name)))
1024 (switch-to-buffer (concat mediawiki-site ": " name))
1025 (mediawiki-edit mediawiki-site name)))
9821026
983(defun mediawiki-reload ()1027(defun mediawiki-reload ()
984 (interactive)1028 (interactive)
@@ -987,6 +1031,59 @@
987 (mediawiki-open title)1031 (mediawiki-open title)
988 (error "Error: %s is not a mediawiki document" (buffer-name)))))1032 (error "Error: %s is not a mediawiki document" (buffer-name)))))
9891033
1034
1035(defun mediawiki-get-namespaces (sitename limit)
1036 "Query mediawiki-site SITENAME for the first LIMIT namespaces."
1037 (let ((namespaces (mediawiki-api-call
1038 sitename "query"
1039 (list (cons "meta" "siteinfo")
1040 (cons "siprop" "namespaces|namespacealiases")
1041 (cons "aplimit" (mediawiki-api-param (or limit "100"))))))
1042 ns)
1043 (delq nil (mapcar (lambda (x) (when (and (listp x) x)
1044 (cons (or (caddr x) "main") (cdr (assq 'id (cadr x))))))
1045 (caddr namespaces)))))
1046
1047(defun mediawiki-get-page-list (sitename namespace limit)
1048 "Query mediawiki-site SITENAME for the first LIMIT pages in NAMESPACE."
1049 (let ((pages (mediawiki-api-call
1050 sitename "query"
1051 (list (cons "list" "allpages")
1052 (when namespace
1053 (cons "apnamespace" (mediawiki-api-param namespace)))
1054 (cons "aplimit" (mediawiki-api-param (or limit "5"))))))
1055 page)
1056 (delq nil (mapcar (lambda (x)
1057 (when (and (listp x) x)
1058 (let ((el (cdr (assq 'title (cadr x)))))
1059 (cons (cadr (split-string el ":"))
1060 el))))
1061 (caddr pages)))))
1062
1063(defun mediawiki-find-page (&optional limit)
1064 "Interactively select a namespace and then select
1065a page with completion from the list of pages in the namespace.
1066If LIMIT is an integer restrict the completion list. Default is 1000."
1067 (interactive "p")
1068 (let* ((namespaces (mediawiki-get-namespaces mediawiki-site 1000))
1069 (ns (cdr (assoc (completing-read "Find in namespace: " namespaces) namespaces)))
1070 (page-list (mediawiki-get-page-list
1071 mediawiki-site ns (if (> limit 1) limit 1000)))
1072 (page (completing-read "Page name: " page-list)))
1073 (mediawiki-open (cdr (assoc page page-list)))))
1074
1075(defun mediawiki-insert-page-list (&optional limit)
1076 "Interactively select a namespace and write the names of the pages
1077in the namespace to the current buffer.
1078If LIMIT is an integer restrict the page list. Default is 1000."
1079 (interactive "p")
1080 (let* ((namespaces (mediawiki-get-namespaces mediawiki-site 1000))
1081 (ns (cdr (assoc (completing-read "Find in namespace: " namespaces) namespaces)))
1082 (pages (mediawiki-get-page-list mediawiki-site ns 1000)))
1083 (while pages
1084 (insert (caar pages) "\n")
1085 (setq pages (cdr pages)))))
1086
990(defun mediawiki-add-page-history (site title)1087(defun mediawiki-add-page-history (site title)
991 (let ((hist (cdr (assoc-string site mediawiki-page-history))))1088 (let ((hist (cdr (assoc-string site mediawiki-page-history))))
992 (unless hist1089 (unless hist
@@ -1086,9 +1183,12 @@
1086 (url-filename urlobj)1183 (url-filename urlobj)
1087 (equal "https" (url-type urlobj)))))1184 (equal "https" (url-type urlobj)))))
10881185
1089(defun mediawiki-pop-to-buffer (bufname)1186(defun mediawiki-pop-to-buffer (bufname &optional dont-pop)
1090 "Pop to buffer and then execute a hook."1187 "If dont-pop is non-nil pop-to-buffer, else switch-to-buffer BUFNAME,
1091 (pop-to-buffer bufname)1188 Then execute a hook."
1189 (if (or dont-pop mediawiki-buffer-pop-dont-pop)
1190 (switch-to-buffer bufname)
1191 (pop-to-buffer bufname))
1092 (run-hooks 'mediawiki-pop-buffer-hook))1192 (run-hooks 'mediawiki-pop-buffer-hook))
10931193
1094(defun mediawiki-api-param (v)1194(defun mediawiki-api-param (v)
@@ -1164,14 +1264,18 @@
1164 (mediawiki-page-get-metadata page 'starttimestamp)))1264 (mediawiki-page-get-metadata page 'starttimestamp)))
11651265
1166(defun mediawiki-save (&optional summary)1266(defun mediawiki-save (&optional summary)
1167 (interactive "sSummary: ")1267 (interactive)
1168 (if mediawiki-page-title1268 (let ((summary
1169 (mediawiki-save-page1269 (or summary
1170 mediawiki-site1270 (when mediawiki-save-ask-for-summary (read-string "Summary: "))
1171 mediawiki-page-title1271 "")))
1172 summary1272 (if mediawiki-page-title
1173 (buffer-substring-no-properties (point-min) (point-max)))1273 (mediawiki-save-page
1174 (error "Error: %s is not a mediawiki document" (buffer-name))))1274 mediawiki-site
1275 mediawiki-page-title
1276 summary
1277 (buffer-substring-no-properties (point-min) (point-max)))
1278 (error "Error: %s is not a mediawiki document" (buffer-name)))))
11751279
1176(defun mediawiki-prompt-for-page ()1280(defun mediawiki-prompt-for-page ()
1177 (let* ((prompt (concat "Page"1281 (let* ((prompt (concat "Page"
@@ -1337,16 +1441,23 @@
1337 (interactive)1441 (interactive)
1338 (mediawiki-open (mediawiki-page-at-point)))1442 (mediawiki-open (mediawiki-page-at-point)))
13391443
1444(defun mediawiki-open-page-at-point-other-window ()
1445 "Open a new buffer with the page at point in a different window also
1446if `mediawiki-buffer-pop-dont-pop' is set."
1447 (interactive)
1448 (let ((mediawiki-buffer-pop-dont-pop nil))
1449 (mediawiki-open (mediawiki-page-at-point))))
1450
1340(defun mediawiki-page-at-point ()1451(defun mediawiki-page-at-point ()
1341 "Return the page name under point. Typically, this means1452 "Return the page name under point. Typically, this means
1342anything enclosed in [[PAGE]]."1453anything enclosed in [[PAGE]] or {{PAGE}}."
1343 (let ((pos (point))1454 (let ((pos (point))
1344 (eol (point-at-eol))1455 (eol (point-at-eol))
1345 (bol (point-at-bol)))1456 (bol (point-at-bol)))
1346 (save-excursion1457 (save-excursion
1347 (let* ((start (when (search-backward "[[" bol t)1458 (let* ((start (when (or (search-backward "[[" bol t) (search-backward "{{" bol t))
1348 (+ (point) 2)))1459 (+ (point) 2)))
1349 (end (when (search-forward "]]" eol t)1460 (end (when (or (search-forward "]]" eol t) (search-forward "}}" eol t))
1350 (- (point) 2)))1461 (- (point) 2)))
1351 (middle (progn1462 (middle (progn
1352 (goto-char start)1463 (goto-char start)

Subscribers

People subscribed via source and target branches