; ; github-wiki.l ; 5 July 2020, by Teruyoshi FUJIWARA ; ; This script makes a TOC (table of content) for Github Wiki. ; Functions: ; (github-wiki-make-toc) Makes a table of contents from wiki document. ; (github-convert-from-hiki) Converts a Hiki text to a Github Wiki format. ; (github-set-baseurl) Set a base url of git repository to support github-convert-from-hiki function. (defvar *gh-base-name* "https://github.com/your_account/project/wiki/") (defun github-wiki-make-toc () (interactive) (let* ((buf-name (buffer-name (selected-buffer))) (wikiname buf-name)) (when (string-match "^\\(.+\\)\\(\.md\\)$" wikiname) (setq wikiname (substitute-string (string-replace-match wikiname "\\1") " " "-"))) ; pickup headings (grep-buffer "\\(^#+[ ]*.*\\)$") (goto-char (point-min)) (foreach-line-buffer 'process-region wikiname) (goto-char (point-min)) (insert "# 目次\n") (copy-region-as-kill (point-min) (point-max)) (set-buffer buf-name))) (defun filter-buffer (func buffunc) (let ((s (make-buffer-stream (selected-buffer))) (stack nil) line) (while (setq line (read-line s nil)) (if (setq res (funcall func line)) (push res stack))) (if buffunc (funcall buffunc)) (delete-region (point-min) (point-max)) (insert (format nil "~{~A~%~}" (reverse stack))))) (defun make-tmpbuf (bufname) (set-buffer (switch-to-buffer bufname)) (make-local-variable 'need-not-save) (setq need-not-save t)) (defun grep-buffer (regexp) "Filter buffer with a regular expression. This command edits current buffer directly." ; (interactive "sRegular Expression: ") (filter-buffer (lambda (l) (if (string-match regexp l) (string-replace-match l "\\1") nil)) (lambda () (make-tmpbuf "*github-wiki-tmp*")))) (defun end-line-of-file-p () ; (interactive) (if (next-line) (progn (previous-line) nil) t)) (defun foreach-line-buffer (func wikiname) ; (interactive) (if (eq (buffer-size) 0) nil (save-excursion (loop (let ((bol) (eol)) (beginning-of-line) (setq bol (point)) (goto-eol) (setq eol (point)) (narrow-to-region bol eol) (funcall func wikiname) (widen)) (next-line) (if (end-line-of-file-p) (return))) t))) (defun process-region (wikiname) (let ((str-orig (buffer-substring (point-min) (point-max))) (level) (title) (str)) (string-match "^\\(#+[ ]+\\)\\(.+\\)$" str-orig) (setq level (string-replace-match str-orig "\\1")) (setq title (string-replace-match str-orig "\\2")) ; markdown 記述を除去 (goto-char (point-min)) (replace-buffer "^#+[ ]+" "" :regexp t) ; URLエンコードの際に除外する文字 (goto-char (point-min)) (replace-buffer "[・〜()()?\"\.,.,。、\+\/:\?]" "" :regexp t) ; " " は "-" に置き換える (goto-char (point-min)) (replace-buffer " " "-" :regexp t) ; (goto-char (point-min)) (let ((from (point-min)) (to (point-max))) (downcase-region from to) (setq str (buffer-substring from to)) (kill-region from to)) (insert (convert-level level) " ") (insert "[" title "](") (insert *gh-base-name*) (insert (si:www-url-encode (map-internal-to-utf-8 wikiname))) (insert "#") (insert (si:www-url-encode (map-internal-to-utf-8 str))) (insert ")") )) (defun convert-level (md) (string-match "^\\(#+\\)" md) (setq md (string-replace-match md "\\1")) (if (eq (length md) 1) "*" (concat (repeat-string "\t" (- (length md) 1)) "*"))) (defun github-convert-from-hiki () (interactive) (goto-char (point-min)) (replace-buffer "{{toc}}" "") (goto-char (point-min)) (replace-buffer "<<<\\|>>>" "```" :regexp t) ;(goto-char (point-min)) ;(replace-buffer "^###[ ]*" "\t\t1. " :regexp t) ;(goto-char (point-min)) ;(replace-buffer "^##[ ]*" "\t1. " :regexp t) ;(goto-char (point-min)) ;(replace-buffer "^#[ ]*" "1. " :regexp t) (goto-char (point-min)) (replace-buffer "^!!![ ]*" "### " :regexp t) (goto-char (point-min)) (replace-buffer "^!![ ]*" "## " :regexp t) (goto-char (point-min)) (replace-buffer "^![ ]*" "# " :regexp t) ) (defun github-set-baseurl (url) (interactive "sBase URL: ") (let ((s (subseq url (- (length url) 1)))) (if (string/= s "/") (setq *gh-base-name* (concat url "/")) (setq *gh-base-name* url))))