--- pukiwiki-mode.el.old 2004-09-08 06:36:05.000000000 +0900 +++ pukiwiki-mode.el 2004-09-08 15:32:37.000000000 +0900 @@ -265,6 +265,11 @@ :group 'pukiwiki :type '(integer :size 0)) +(defcustom pukiwiki-diff-using-ediff nil + "*Non-nil means using `Ediff' package for diff process." + :group 'pukiwiki + :type 'boolean) + ;;; 汎用関数 (defun pukiwiki-mode-version () @@ -1221,8 +1226,62 @@ "pukiwiki-mode 用の replace-string." (let ((top start) (bottom end)) (goto-char top) + (if (and (featurep 'xemacs) (region-active-p)) + (zmacs-deactivate-region)) (perform-replace regexp replacement nil nil nil))) +(defun pukiwiki-index-show-diff-ediff (url pagename site-info &optional day) + (message "Ediff session...") + + ;; 最新バックアップのソースを取得し、バッファを生成。 + (setq backup-buffername (concat "*pukiwiki backup tmp*")) + (let* ((backup t) + (url (progn (string-match "nowdiff" url) + (replace-match "source" nil nil url)))) + (pukiwiki-diff-ediff-create-buffer + url pagename site-info backup-buffername backup)) + + ;; 現在のソースを取得し、バッファを生成。 + (setq current-buffername (concat "*pukiwiki current tmp*")) + (let* ((url (progn + (string-match + "cmd=backup\\(.*\\)&age=[0-9]*&action=nowdiff" url) + (replace-match "cmd=edit\\1" nil nil url)))) + (pukiwiki-diff-ediff-create-buffer + url pagename site-info current-buffername)) + + (ediff-buffers backup-buffername current-buffername) + (message "Ediff session... done.")) + +(defun pukiwiki-diff-ediff-create-buffer (url pagename site-info + buffername + &optional backup day) + (let ((raw backup)) + (setq contents (pukiwiki-fetch-source + pagename url + (pukiwiki-site-coding-system site-info) raw)) + (setq buf (get-buffer-create buffername)) + (switch-to-buffer buf) + (setq buffer-read-only nil) + (erase-buffer) + (insert (cdr (assoc 'body contents))) + + (pukiwiki-view-delete-html-tag) + (pukiwiki-replace-entity-refs) + (pukiwiki-view-mode) + + (when pukiwiki-auto-insert ; 整形ありのとき。 + (pukiwiki-text-reformating) + (pukiwiki-insert-paragraph) + (pukiwiki-insert-cite) + (pukiwiki-insert-list) + (pukiwiki-insert-ls2) + (pukiwiki-set-auto-face) + (pukiwiki-delete-blank-line) + (pukiwiki-view-renumber)) + + (setq buffer-read-only t))) + (defun pukiwiki-index-show-diff (arg &optional day) "現在のバッファとサーバのデータを比較し、表示する。" (interactive "P") @@ -1297,33 +1356,39 @@ (http-url-hexify-string pagename (pukiwiki-site-coding-system site-info)) age)) - (message "Creating diff...") - (setq diff-contents (pukiwiki-fetch-source - pagename url - (pukiwiki-site-coding-system site-info) t)) - (setq buf (generate-new-buffer "*pukiwiki tmp*")) - (switch-to-buffer buf) - (pukiwiki-edit-rename-buffer - site-name pagename (format "diff-to-%s" age) nil) - (insert (cdr (assoc 'body diff-contents))) - (pukiwiki-replace-regexp - "^ $" "" nil (point-min) (point-max)) - (pukiwiki-replace-string - "" "+" nil (point-min) (point-max)) - (pukiwiki-replace-string - "" "-" nil (point-min) (point-max)) - (pukiwiki-replace-string - "" "" nil (point-min) (point-max)) - (goto-char (point-min)) - (pukiwiki-replace-entity-refs) - (setq pukiwiki-prev-buffer cbuf) - (pukiwiki-diff-mode) - (set-buffer-modified-p nil) - ;;(view-mode) - (delete-other-windows) - (goto-char (point-min)) - (message "Creating diff... done!") - )) + + (if (and (eq day nil) + pukiwiki-diff-using-ediff + (condition-case nil (require 'ediff) (error nil))) + ;; Ediff があれば。 + (pukiwiki-index-show-diff-ediff url pagename site-info) + + (message "Creating diff...") + (setq diff-contents (pukiwiki-fetch-source + pagename url + (pukiwiki-site-coding-system site-info) t)) + (setq buf (generate-new-buffer "*pukiwiki tmp*")) + (switch-to-buffer buf) + (pukiwiki-edit-rename-buffer + site-name pagename (format "diff-to-%s" age) nil) + (insert (cdr (assoc 'body diff-contents))) + (pukiwiki-replace-regexp + "^ $" "" nil (point-min) (point-max)) + (pukiwiki-replace-string + "" "+" nil (point-min) (point-max)) + (pukiwiki-replace-string + "" "-" nil (point-min) (point-max)) + (pukiwiki-replace-string + "" "" nil (point-min) (point-max)) + (goto-char (point-min)) + (pukiwiki-replace-entity-refs) + (setq pukiwiki-prev-buffer cbuf) + (pukiwiki-diff-mode) + (set-buffer-modified-p nil) + ;;(view-mode) + (delete-other-windows) + (goto-char (point-min)) + (message "Creating diff... done!")))) (defun pukiwiki-index-end-of-buffer () (interactive) @@ -2933,36 +2998,47 @@ (error ()))))) (defun pukiwiki-insert-list () - (message "list...") (goto-char (point-min)) (let ((str nil) (level 1) (num 1)) (while (re-search-forward "\\(^[-+]+\\)" nil t) (setq str (length (buffer-substring-no-properties (match-beginning 0) (match-end 0)))) - (delete-region (match-beginning 0) - (match-end 0)) - (while (not (= str 1)) - (insert " ") - (setq str (- str 1))) - (insert "-") - (let* ((fill-individual-varying-indent t) - (margin 2) - (paragraph-start "^\\($\\|[ ]*[+-]+\\)") - (paragraph-separate "^[ ]*[-+ <\t\n\f]")) - ;; filling. - (save-excursion - (re-search-forward "^[ ]*[-+ <\t\n\f]" nil t nil) - (setq fill-end-position (line-beginning-position))) - (save-excursion - ;; overlay set. - (setq ovr (make-overlay (- (point) 2) fill-end-position)) - (overlay-put ovr 'face 'font-lock-keyword-face) - (overlay-put ovr 'priority 1) - - (set-left-margin (point) fill-end-position margin) - (fill-individual-paragraphs (line-beginning-position) - fill-end-position t)) + (cond + ((> str 4) + ;; 何もしない。 + (ignore)) + ((and (= str 4) (= (line-end-position) (match-end 0))) + ;; 水平線に。 + (delete-region (match-beginning 0) (match-end 0)) + (insert-char ?\055 fill-column)) + (t + (delete-region (match-beginning 0) (match-end 0)) + (while (not (= str 1)) + (insert " ") + (setq str (- str 1))) + (insert "-")) + (let* ((fill-individual-varying-indent t) + (margin 2) + (paragraph-start "^\\($\\|[ ]*[+-]+\\)") + (paragraph-separate "^[ ]*[-+ <\t\n\f]")) + ;; filling. + (save-excursion + (re-search-forward "^[ ]*[-+ <\t\n\f]" nil t nil) + (setq fill-end-position (line-beginning-position))) + (save-excursion + ;; overlay set. + (setq ovr (make-overlay (- (point) 2) fill-end-position)) + (overlay-put ovr 'face 'font-lock-keyword-face) + (overlay-put ovr 'priority 1) + + (set-left-margin (point) fill-end-position margin) + (condition-case err + (fill-individual-paragraphs (line-beginning-position) + fill-end-position t) + (error + (message "Error fill-individual-paragraphs: %s" + (error-message-string err)))))) )))) (defun pukiwiki-insert-paragraph ()