Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
;;; eev-pdfpages.el --- tools to create hyperlinks to pages of PDF files ;; Load with: (load "eev-template.el") ;; (load "eev-pafpages.el") ;; Copyright (C) 2012 Free Software Foundation, Inc. ;; ;; This file is part of GNU eev. ;; ;; GNU eev 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, or (at your option) ;; any later version. ;; ;; GNU eev 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; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;; Author: Eduardo Ochs <[email protected]> ;; Maintainer: Eduardo Ochs <[email protected]> ;; Version: 2012apr15 ;; Keywords: e-scripts, help, hyperlinks, hypertext ;;; Commentary: ;; First version: 2012jan31. ;; This is very new & experimental... ;; ;; This file implements: ;; ;; 1) a variant of ee-goto-position, `ee-goto-position-page', that ;; behaves differently when its first argument is a number - ;; instead of jumping to the beginning of the n-th line of the ;; file it jumps to the beginning of the n-th "page", where ;; "pages" are sequences of characters separated by formfeeds, ;; just as lines are sequences of characters separated by ;; newlines; ;; ;; 2) a drop-in replacement (!) for `find-pdftotext' that interprets ;; a numerical argument in the beginning of the pos-spec as the ;; number of a page, instead of the number of a line; ;; ;; 3) the function `current-page', that tells in which "page" we are ;; in the current buffer; ;; ;; 4) the command `find-page-links', bound to M-h M-p, that ;; generates links to the current page of a pdf file converted to ;; text with find-pdftotext; it also works for PDF or DVI files ;; being viewed in an external viewer, but then we have to enter ;; the page number by hand. ;; (find-efunction 'count-lines) ;; (defun count-formfeeds (start end) (save-excursion (save-restriction (narrow-to-region start end) (goto-char (point-min)) (save-match-data (let ((done 0)) (while (re-search-forward "[\f]" nil t 1) (setq done (+ 1 done))) done))))) (defun current-page () (+ 1 (count-formfeeds (point-min) (point)))) (defun forward-formfeeds (n) (re-search-forward "[\f]" nil nil n)) (defun ee-goto-position-page (&optional pos-spec &rest rest) (when pos-spec (cond ((numberp pos-spec) (goto-char (point-min)) (forward-formfeeds (1- pos-spec))) ((stringp pos-spec) (goto-char (save-excursion ; This used to be just: (goto-char (point-min)) ; (goto-char (point-min)) (search-forward pos-spec) ; (search-forward pos-spec) (point)))) ; (t (error "This is not a valid pos-spec: %S" pos-spec))) (if rest (ee-goto-rest rest)))) (defun find-sh-page (command &rest pos-spec-list) (interactive "sShell command: ") (find-eoutput-reuse command `(insert (shell-command-to-string ,command))) (apply 'ee-goto-position-page pos-spec-list)) (defun find-pdftotext (fname &rest rest) (apply 'find-sh-page (format "pdftotext -layout %s -" fname) rest)) (defun find-pdftotext (fname &rest rest) (apply 'find-sh-page (format "pdftotext -layout -enc Latin1 %s -" fname) rest)) (defun find-djvutotext (fname &rest rest) (apply 'find-sh-page (format "djvutxt %s" fname) rest)) ;; ---------------------------------------- ;; 2012apr15 (defun ee-code-page-parameters (code offset) (if offset (format " (setq find-%spage '(ee-page-parameters \"%s\" %d)) (setq find-%stext '(ee-page-parameters \"%s\" %d))" code code offset code code offset) "")) (defun ee-code-pdftotext (code pdffile &optional offset) (format " (defun find-%stext (&rest rest) (interactive) (apply 'find-pdftotext %S rest))%s " code pdffile (ee-code-page-parameters code offset))) (defun code-pdftotext (c f &optional offset) (eval (ee-read (ee-code-pdftotext c f offset)))) (defun ee-code-djvutotext (code djvufile &optional offset) (format " (defun find-%stext (&rest rest) (interactive) (apply 'find-djvutotext %S rest))%s " code djvufile (ee-code-page-parameters code offset))) (defun code-djvutotext (c f &optional offset) (eval (ee-read (ee-code-djvutotext c f offset)))) ;; ---------------------------------------- ;; (find-angg ".emacs.papers" "coetzee") (setq ee-page-stem "livesofanimals") (setq ee-page-offset -110) (defun ee-page-parameters (stem offset) (setq ee-page-stem stem) (setq ee-page-offset offset)) (defun ee-find-xxxpage (&optional stem) (intern (format "find-%spage" (or stem ee-page-stem)))) (defun ee-find-xxxtext (&optional stem) (intern (format "find-%stext" (or stem ee-page-stem)))) (defun find-page-links (&optional stem offset page &rest rest) "Visit a temporary buffer containing hyperlinks for page." (interactive) (setq stem (or stem ee-page-stem)) (setq offset (or offset ee-page-offset)) (setq page (or page (current-page))) (let* ((find-xxxpage (intern (format "find-%spage" stem))) (find-xxxtext (intern (format "find-%stext" stem))) (kill (or (ee-last-kill) "")) ) (apply 'find-elinks `( (find-page-links ,stem ,offset ,page ,@rest) (setq ee-page-stem ,stem) (setq ee-page-offset ,offset) (ee-page-parameters ,stem ,offset) (find-efunction 'find-page-links) "" (,find-xxxpage ,page) (,find-xxxtext ,page) (,find-xxxpage (+ ,offset ,(- page offset))) (,find-xxxtext (+ ,offset ,(- page offset))) "" (,find-xxxpage ,page ,kill) (,find-xxxtext ,page ,kill) (,find-xxxpage (+ ,offset ,(- page offset)) ,kill) (,find-xxxtext (+ ,offset ,(- page offset)) ,kill) "" (find-books "__cats/__cats.el" "awodey") (ee-page-parameters "awodeyct" 10) "" (find-angg ".emacs" "unilog-current") (ee-page-parameters "unilogcurr" 0) (setq ee-page-stem "854") "" (find-angg ".emacs.papers" "tesemestr") (ee-page-parameters "tesemestr" 7) ) rest))) (define-key eev-mode-map "\M-h\M-p" 'find-page-links) (defun ee-wrap-page () "Try this example:\n \(toggle-read-only 0) \(buffer-enable-undo) \(ee-page-parameters \"livesofanimals\" -110) \(eek \"2*<down> <<ee-wrap-page>>\")\n 134 woke up haggard in the mornings\n" (interactive) (ee-wrapc '(n str) '(insert (ee-links-to-string `((,(ee-find-xxxpage) (+ ,ee-page-offset ,(string-to-int n)) ,str) (,(ee-find-xxxtext) (+ ,ee-page-offset ,(string-to-int n)) ,str)))))) ;; (find-efunctiondescr 'ee-wrap-page) (defun ee-wrap-page () "Try this example:\n \(toggle-read-only 0) \(buffer-enable-undo) \(ee-page-parameters \"livesofanimals\" -110) \(eek \"2*<down> 2*<<ee-wrap-page>>\")\n 134 woke up haggard in the mornings 134 woke up haggard in the mornings\n" (interactive) (ee-wrapc '(n str) '(insert (ee-links-to-string `((,(ee-find-xxxpage) (+ ,ee-page-offset ,(string-to-int n)) ,str) (,(ee-find-xxxtext) (+ ,ee-page-offset ,(string-to-int n)) ,str)) )))) (define-key eev-mode-map "\M-P" 'ee-wrap-page) (provide 'eev-pdfpages) ;; Local Variables: ;; coding: raw-text-unix ;; ee-anchor-format: "defun %s " ;; no-byte-compile: t ;; End: