;;; annotate.el --- annotation helper functions.
;; Copyright 2007 by Martin Howse " nil t)
;; (setq st (point))
;; (re-search-forward "
" nil t) (setq ppp (point)) (re-search-forward "[0-9]+;" nil t) (re-search-backward " \\|>") (goto-char (+ (point) 1)) (matcherz))) (begin_word category_list) (end_word " ") (text (progn ;; (setq st (+ (point) 2)) (re-search-forward "
") (buffer-substring ppp (- (point) 5))))) (palm_annotate page text type category_list begin_word end_word) (switch-to-buffer (other-buffer))))) (defun annotate_wiki () (interactive) (goto-char (point-min)) (while (re-search-forward "Page " nil t) ;; but what of sub-pages/end page (let ((page (matcherz)) ;; (while (re-search-forward "^ \\([0-9]+\\)\\.\\([0-9]+\\)") ;; number.number[space] - can not exist (type "text-wiki") (category_list "") (begin_word (progn (next-line 1) (re-search-forward "\\([0-9]+\\)\\.\\([0-9-]+\\)" nil t) ;; number.number[space] ;;(re-search-forward "[^0-9]" nil t) (setq pt (point)) (end-of-line) (substring (buffer-substring pt (point)) 1))) (end_word " ") (text (progn ;; (next-line 1) ;; may not be next line ???? (setq pt (point)) (if (re-search-forward "Page "nil t) (setq ptr (point)) (setq ptr (point-max))) (previous-line 1) (buffer-substring pt (point)))));; to end of next page (palm_annotate page text type category_list begin_word end_word) (switch-to-buffer (other-buffer))))) (defun page-exists (page) (if (re-search-forward (format "Page: %s " page) nil t) t nil)) (defun format-text (unburden heading-level category_list type page begin_word end_word text) (if unburden (jump-to-end)) ;; inheritance and tags/links for org-mode - do in formatting (insert (format "\n")) (let ((x 0)) (while (< x heading-level) (insert (format "*")) (setq x (+ x 1)))) (insert (format " page: %s :%s:\n:PROPERTIES:\n:cat:%s\n:type:%s\n:END:\n" page (mapconcat (lambda (x) (subseq x 1)) (split-string (concat " " category_list) ",") ":") category_list type)) (insert (format "\n\\\[Type: %s ] \n\\\[Page: %s ] \n\\\[First: %s ] \n\\\[Last: %s ] \n\\\[Categories: %s ] \n\\\[text: %s ] \n" type page begin_word end_word category_list text)) ;; (insert (format "\n\\\[Page: %s ] \n\\\[First: %s ] \n\\\[text: %s ] \n" page begin_word end_word text)) ;; remove leading white space ;;(setq end (point)) (progn (re-search-backward "\\[text:") (setq pnt (+ (point) 7)) (goto-char pnt) (re-search-forward "[^ \n]" nil t) (delete-and-extract-region pnt (- (point) 2)) (re-search-forward " ] \n" nil t) ;; remove trailing white space (re-search-backward "[]]" nil t) (setq pt (point)) (re-search-backward "[^ \n]" nil t) (delete-and-extract-region (+ (point) 1) pt) (re-search-forward "[]]" nil t) (next-line 1)) ;; format the region (fill-region pnt (point) nil t) (deletefront pnt (point)) ;; as property list - spaces in category list ;;process - add link to source. (insert-link page begin_word end_word)) (defun palm_annotate (page text type category_list begin_word end_word) ;; main annotation function ;;(set-buffer (get-buffer-create "*annotate__*")) ;;(erase-buffer) ;; ;; place in correct place according only to page number - also maybe ;; goto start and jump page numbers till we can insert (switch-to-buffer (find-file-noselect default-annotation-file-name)) (goto-char (point-min)) ;; check page exists already// in which case???? - line number question? ;; just return existence as 1 or 2 from search rather than searching twice ;;(format-text 2 category_list type page begin_word end_word text) ;;(while (find-next-number page) (setq x (+ x 1))) ;; first page (if (and (search-forward "Page: " nil t) (< (string-to-number page) (setq mmmm (matcher)))) ;; first (progn (goto-char (point-min)) (format-text nil 1 category_list type page begin_word end_word text)) ;; page exists // doesn't exist (format-text t (find-next-number page) category_list type page begin_word end_word text))) (defun deletefront (start end) (save-excursion (save-restriction (narrow-to-region start end) (goto-char (point-min)) (while (not (eobp)) (setq ppp (point)) (skip-chars-forward " ") (delete-region ppp (point)) (forward-line))))) (defun find-next-number (page) (while (and (search-forward "Page: " nil t) (>= (string-to-number page) (setq mmmm (matcher)))) (progn (setq mmmmm mmmm) (setq pt (point)))) (if (= (string-to-number page) mmmmm) (progn (goto-char pt) 2) (progn (goto-char pt) 1))) (defun matcher () (let (string) (if (looking-at number-regexp) (goto-char (match-end 0))) (setq string (buffer-substring (match-beginning 0) (point))) (string-to-number string))) (defun matcherz () (let (string) (if (looking-at number-regexp) (goto-char (match-end 0))) (setq string (buffer-substring (match-beginning 0) (point))) string)) (defun jump-to-end () ;; jump to end of text block - how? (if (re-search-forward "Link:" (point-max) t) (next-line) t)) (defun insert-link (page begin_word end-word) ;; lookup page and place (let ((realpoint (find-page default-file-name page begin_word end_word))) ;; insert link to this LINE NUMBER in the default file - org-mode ;; eg. [[file:~/code/main.c::255]] (set-buffer (get-file-buffer default-annotation-file-name)) (insert (format "\\\Link: [[file:%s::%d][page:%s]]\n" default-file-name realpoint page)))) (defvar range 200) (defun find-page (file page begin_word end_word) ;; open file/buffer (set-buffer (find-file-noselect file)) ;; goto-approx line number ;; (goto-line 0) (goto-line (line-calc page)) (while (and (setq startpoint (search-forward begin_word nil t)) (setq endpoint (search-forward end_word nil t)) (< endpoint startpoint) (< range (- endpoint startpoint))) (goto-char startpoint)) (if (and startpoint endpoint) ;; return line number (progn ;; (set-buffer (get-file-buffer default-annotation-file-name)) (line-number startpoint)) 0)) (defun line-number (pointy) (line-number-at-pos pointy)) (defun line-calc (page) (truncate (* (string-to-number page) default-ratio))) (defun make-regex (word) (regexp-quote word)) ;;(find-page default-file-name "536" "Osbie has" "is waiting") ;;(find-page default-file-name "457" "On shore," "own substance.") ;;(find-page default-file-name "348" "Results have" "desire it.") ;;(palm_annotate "15" "____xxxxx" "text" "none" "He watches" "low hill")