« プログラミングを始めるには(28) | Main | プログラミングを始めるには(30) »

August 25, 2014

プログラミングを始めるには(29)

このシリーズの記事を書くようになってから、文章にタグをたくさん入れる必要が出てきた。そろそろ面倒臭くなってきたので、簡單なコマンドを書いて少し樂をしようと思う。

一つは英數字を太斜體にするタグを埋め込むコマンド。もう一つは行閒を變更するタグを埋め込むコマンドである。

(defun htm-insert-strong (beg end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (and (re-search-forward "<\\(strong\\|em\\|span\\)" nil t)
	   (if (y-or-n-p "Continue? ")
	       (goto-char (point-min))
	     (goto-char (point-max))))
      (while (re-search-forward "[0-9A-Za-z-]+" nil t)
	(goto-char (match-beginning 0))
	(insert-before-markers "<strong><em>")
	(forward-char (length (match-string 0)))
	(insert-before-markers "</em></strong>")))))

(defun htm-insert-span (beg end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (insert-before-markers "<span style=\"line-height:200%\">")
      (goto-char (point-max))
      (insert-before-markers "</span><br>\n<br>"))))

こんな23分もあれば書けそうなしょうもないコマンドでも使ってみると割と便利なものだ。

ちなみに、前の記事でletを使わないプログラムなんて普段書かないと言いつつ書いているし、23分で書けそうなのにデバグまでさせられた。

特に氣を付ける必要があるのはhtm-insert-strongの方。最初はre-search-forwardreplace-matchの組み合わせで簡單に濟まそうと思ったのに、大文字をリプレースするとタグまで大文字になるのが氣になって、マッチ文字列の先頭と終端にそれぞれタグの文字列をinsertする方法に變えたのがアダになった。match-beginningの方は良いとして、match-endが返すポイントはマッチした文字列に對するものなので、タグをインサートした後は意味のないポイントになってしまう。ということで、文字列は普段あまり使わないinsert-before-markersで行ない、その後でマッチした文字列の長さ分forward-charしている。

こんな姑息なことをするくらいなら、マーカを使ってマッチ文字列の先頭と終端のポイントを先に押さえておく、つまりちゃんとletを使えば良かったのだった。

(defun htm-insert-strong (beg end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (and (re-search-forward "<\\(strong\\|em\\|span\\)" nil t)
	   (if (y-or-n-p "Continue? ")
	       (goto-char (point-min))
	     (goto-char (point-max))))
      (while (re-search-forward "[0-9A-Za-z-]+" nil t)
	(let ((mark1 (set-marker (make-marker) (match-beginning 0)))
	      (mark2 (set-marker (make-marker) (match-end 0))))
	  (goto-char (marker-position mark1))
	  (insert-before-markers "<strong><em>")
	  (goto-char (marker-position mark2))
	  (insert-before-markers "</em></strong>"))))))

最初からこう書けばよかったのだ(笑)

|

« プログラミングを始めるには(28) | Main | プログラミングを始めるには(30) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/60208719

Listed below are links to weblogs that reference プログラミングを始めるには(29):

« プログラミングを始めるには(28) | Main | プログラミングを始めるには(30) »