--- pukiwiki-mode.el.old 2004-09-09 07:27:41.000000000 +0900 +++ pukiwiki-mode.el 2004-09-10 19:13:57.000000000 +0900 @@ -1213,17 +1213,35 @@ (http-url-hexify-string pagename (pukiwiki-site-coding-system))))))) -(defun pukiwiki-replace-regexp (regexp replacement parm start end) - "pukiwiki-mode 用の replace-regexp." +(defun pukiwiki-replace-regexp (regexp replacement delimited start end) + "pukiwiki-mode 用の replace-regexp. + +start で指定された位置から end で指定された位置までに出現する全ての regexp +にマッチする文字列を replacement に置換します。 +delimited は互換のためだけに引数として存在し、指定された内容は無視されます。" + (let ((top start) (bottom end)) (goto-char top) (catch 'range-over - (while (re-search-forward regexp nil t) - (replace-match replacement nil nil)) - (if (>= (point) bottom) (throw 'range-over t))))) + (while (setq result (re-search-forward regexp bottom t)) + (replace-match replacement nil nil) + (setq bottom (+ bottom (- (point) result))) + (if (>= (point) bottom) ; replace-match で point が bottom + ; よりも先に進んだ時も 'range-over. + (throw 'range-over t))) + (cond ((>= (point) bottom) ; point が bottom を越えた。 + (throw 'range-over t)) + ((eq result nil) ; もう match しなかった。 + (throw 'range-over t)))))) + +(defun pukiwiki-replace-string (regexp replacement delimited start end) + "pukiwiki-mode 用の replace-string. + +start で指定された位置から (point-max) までに出現する全ての regexp にマッチ +する文字列を replacement に置換します。 +delimited, end は互換のためだけに引数として存在し、指定された内容は無視 +されます。" -(defun pukiwiki-replace-string (regexp replacement parm start end) - "pukiwiki-mode 用の replace-string." (let ((top start) (bottom end)) (goto-char top) (if (and (featurep 'xemacs) (region-active-p)) @@ -2805,10 +2823,19 @@ "表示の時に読みやすいように適当なところで折り返すなどの処理を行う" (let ((pt) (end-pt) (reg "^[^ *->#\n\r]+[^\n\r]*$") str) (goto-char (point-min)) - (while (re-search-forward "[ ]*[~]+[ ]*$" nil t) - (delete-region (match-beginning 0) - (match-end 0)) - (insert "\n")) + (while (re-search-forward "^\\(.\\).*\\(\\s-*[~]+\\s-*[\n\r]\\)" nil t) + (delete-region (match-beginning 2) + (match-end 2)) + (setq line-beginning-char + (buffer-substring-no-properties (match-beginning 1) (match-end 1))) + (cond + ((string-match "[-+>]" line-beginning-char) + (insert "\n~")) + ((string-match "[ |*#]" line-beginning-char) + (insert "\n")) + (t + (insert inner-line-feed-mark))) + (beginning-of-line)) ;; 定義を読みやすく処理 (goto-char (point-min)) @@ -2864,17 +2891,53 @@ ;; 行を適当なところで折り返す (goto-char (point-min)) (while (re-search-forward - "^[^ |*->#~\n\r]+[^\n\r]*$" nil t) - ;;(beginning-of-line) - ;;(setq pt (point)) - (setq pt (line-beginning-position)) - (if (re-search-forward - "^[ |*->#~]+[^\n\r]*$" nil t) - ;;(setq end-pt (point)) - (setq end-pt (line-beginning-position)) ;;(line-end-position)) - (setq end-pt (point-max)) - (goto-char (point-max))) - (fill-region pt end-pt)))) + "^\\([^-+ |*>#\n\r]+\\)[^\n\r]*$" nil t) + (let ((str (match-string 1)) + (pos nil)) + ;; fill-region を行なう間は行頭の `~' を削除しておく。 + (if (string-match "^~" str) + (save-excursion + (beginning-of-line) + (re-search-forward "^~\\s-*" nil t) + (delete-region (match-beginning 0) (match-end 0)) + (insert "\n") + (setq pos (point)))) + (setq pt (line-beginning-position)) + (if (re-search-forward + "^[-+ |*>#~]+[^\n\r]*$" nil t) + (setq end-pt (line-beginning-position)) ;;(line-end-position)) + (setq end-pt (point-max)) + (goto-char (point-max))) + (pukiwiki-fill-region-paragraph pt end-pt) + ;; 行頭の `~' を復元。 + (if pos (save-excursion (goto-char pos) (insert "~"))))))) + +(defvar inner-line-feed-mark "%%%INNER-LINE-FEED%%%") +(defun pukiwiki-fill-region-paragraph (top bottom &optional delimited) + (let ((regexp (concat (or delimited inner-line-feed-mark) "\\s-*[\n\r]?")) + (fill-start-point top) + (fill-limit-point (make-marker)) + (limit bottom)) + (set-marker fill-limit-point limit) + (goto-char fill-start-point) + (catch 'range-over + (while (setq result (re-search-forward regexp fill-limit-point t)) + (setq fill-end-point (match-beginning 0)) + (delete-region fill-end-point (match-end 0)) + ;; (setq fill-limit-point + ;; (- fill-limit-point (- (match-end 0) fill-end-point))) + (fill-region fill-start-point fill-end-point) + (if (>= (point) fill-limit-point) + (throw 'range-over t) + (setq fill-start-point (point)))) + (cond ((>= (point) fill-limit-point) + (throw 'range-over t)) + ((eq result nil) + (if (not (= (point) fill-limit-point)) + (fill-region (point) fill-limit-point) + (goto-char fill-limit-point)) + (throw 'range-over t)))) + (set-marker fill-limit-point nil))) (defun pukiwiki-insert-attach-file-list () (when pukiwiki-index-attach-list @@ -2998,6 +3061,7 @@ (fill-paragraph nil) (error ()))))) +(defvar pukiwiki-view-list-face 'font-lock-keyword-face) ; 外から指定可能に。 (defun pukiwiki-insert-list () (goto-char (point-min)) (let ((str nil) (level 1) (num 1)) @@ -3018,29 +3082,32 @@ (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)))))) - )))) + (insert "-"))) + (let ((fill-individual-varying-indent t) + (margin 2) + (paragraph-start "^\\($\\|[ ]*[-+]+\\)") + (paragraph-separate "^[ ]*[-+ <\t\n\f]") + (fill-end-position (make-marker))) + ;; filling. + (save-excursion + (unless (re-search-forward "^[ ]*[-+ <\t\n\f]" nil t nil) + ;; 以降に段落相当が無いので、これが最後のリスト項目と看倣す。 + (goto-char (point-max))) + (set-marker fill-end-position (line-beginning-position))) + (save-excursion + ;; overlay set. + (setq ovr (make-overlay (line-beginning-position) fill-end-position)) + (overlay-put ovr 'face pukiwiki-view-list-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))))) + (set-marker fill-end-position nil))))) (defun pukiwiki-insert-paragraph () "段落書式を整形する。 @@ -3069,7 +3136,7 @@ (save-excursion (forward-line 1) (if (string-match - "^[ |*->#~]" + "^[-+ |*>#~]" (buffer-substring (line-beginning-position) (+ (line-beginning-position) 1))) (progn