Someone asked me if there was a good way to annotate the changes of an HTML file. It sounded like the person had to maintain some legacy, HTML-hell, home-brewed, template files for some business Web site.
I suggested using the ChangeLog support of Emacs, and using HTML comments to organize sections of an HTML source file. Here's a simple, made-up example of such an HTML file.
<html> <head> <title>Sample only</title> </head> <body> <!-- begin header --> <p>[ <a id="top" href="#bottom">bottom</a> ]</p> <!-- end header --> <h1>Sample title</h1> <!-- BEGIN: PAGE_CONTENT --> <div> <p>Testing.</p> </div> <!-- END: PAGE_CONTENT -- -- footer-bottom start --> <p>[ <a id="bottom" href="#top">top</a> ]</p> <!-- footer-bottom end --> </body> </html>
Unfortunately, support for either the above sectioning style, or even another alternative, is not provided by the HTML mode that ships with Emacs. This is understandable because there is no consistent standard of doing this, and people use other variations than even those covered in the example. Not to mention, HTML comments are used for other reasons than naming regions of the file.
Regardless, I've put together the following regular expression for
add-log-current-defun-header-regexp. It handles the cases in the example above. It is set for all buffers using HTML mode. Just put the following in your .emacs file.
(add-hook 'html-mode-hook (lambda () (make-local-variable 'add-log-current-defun-header-regexp) (setq add-log-current-defun-header-regexp (concat "^[ \t]*<?!?--[ \t]*\\(?:begin\\|BEGIN\\|start\\)?" "[ \t:]*\\([-_[:alnum:]]+\\)" "[ \t]*\\(?:begin\\|BEGIN\\|start\\)?[ \t]*--"))))
Use it by typing `C-x 4 a' (add-change-log-entry-other-window). An entry like the following will be added in a nearby ChangeLog file:
2009-05-05 Aaron S. Hawley <firstname.lastname@example.org> * file.html (PAGE_CONTENT): Add a test paragraph. (footer-bottom): Added link to "#top".
This setup will work for most cases except for scenarios where there is nested sectioning or where you've run `C-x 4 a' from a point outside of a "section" and get a false-positive.