diff options
| author | Chong Yidong | 2011-03-12 22:50:33 -0500 |
|---|---|---|
| committer | Chong Yidong | 2011-03-12 22:50:33 -0500 |
| commit | 8d9101d850b5ad006ce41a231f294ea6de93986a (patch) | |
| tree | 9873c1925a2f085c972d1cde617496c49e5bec1b /admin/admin.el | |
| parent | 9d05d1ba20797a7478a7ed68ff88452cb4f8c4c8 (diff) | |
| download | emacs-8d9101d850b5ad006ce41a231f294ea6de93986a.tar.gz emacs-8d9101d850b5ad006ce41a231f294ea6de93986a.zip | |
admin/admin.el: Add some code for deploying web manuals.
Diffstat (limited to 'admin/admin.el')
| -rw-r--r-- | admin/admin.el | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/admin/admin.el b/admin/admin.el index 717bfee702d..70958ce1a76 100644 --- a/admin/admin.el +++ b/admin/admin.el | |||
| @@ -212,6 +212,236 @@ Root must be the root of an Emacs source tree." | |||
| 212 | "\\\\def\\\\year{") | 212 | "\\\\def\\\\year{") |
| 213 | "\\([0-9]\\{4\\}\\)}.+%.+copyright year")))))) | 213 | "\\([0-9]\\{4\\}\\)}.+%.+copyright year")))))) |
| 214 | 214 | ||
| 215 | ;;; Various bits of magic for generating the web manuals | ||
| 216 | |||
| 217 | (defun make-manuals (root) | ||
| 218 | "Generate the web manuals for the Emacs webpage." | ||
| 219 | (interactive "DEmacs root directory: ") | ||
| 220 | (let* ((dest (expand-file-name "manual" root)) | ||
| 221 | (html-node-dir (expand-file-name "html_node" dest)) | ||
| 222 | (html-mono-dir (expand-file-name "html_mono" dest)) | ||
| 223 | (txt-dir (expand-file-name "text" dest)) | ||
| 224 | (dvi-dir (expand-file-name "dvi" dest)) | ||
| 225 | (ps-dir (expand-file-name "ps" dest))) | ||
| 226 | (when (file-directory-p dest) | ||
| 227 | (if (y-or-n-p (format "Directory %s exists, delete it first?" dest)) | ||
| 228 | (delete-directory dest t) | ||
| 229 | (error "Aborted"))) | ||
| 230 | (make-directory dest) | ||
| 231 | (make-directory html-node-dir) | ||
| 232 | (make-directory html-mono-dir) | ||
| 233 | (make-directory txt-dir) | ||
| 234 | (make-directory dvi-dir) | ||
| 235 | (make-directory ps-dir) | ||
| 236 | ;; Emacs manual | ||
| 237 | (let ((texi (expand-file-name "doc/emacs/emacs.texi" root))) | ||
| 238 | (manual-html-node texi (expand-file-name "emacs" html-node-dir)) | ||
| 239 | (manual-html-mono texi (expand-file-name "emacs.html" html-mono-dir)) | ||
| 240 | (manual-txt texi (expand-file-name "emacs.txt" txt-dir)) | ||
| 241 | (manual-pdf texi (expand-file-name "emacs.pdf" dest)) | ||
| 242 | (manual-dvi texi (expand-file-name "emacs.dvi" dvi-dir) | ||
| 243 | (expand-file-name "emacs.ps" ps-dir))) | ||
| 244 | ;; Lisp manual | ||
| 245 | (let ((texi (expand-file-name "doc/lispref/elisp.texi" root))) | ||
| 246 | (manual-html-node texi (expand-file-name "elisp" html-node-dir)) | ||
| 247 | (manual-html-mono texi (expand-file-name "elisp.html" html-mono-dir)) | ||
| 248 | (manual-txt texi (expand-file-name "elisp.txt" txt-dir)) | ||
| 249 | (manual-pdf texi (expand-file-name "elisp.pdf" dest)) | ||
| 250 | (manual-dvi texi (expand-file-name "elisp.dvi" dvi-dir) | ||
| 251 | (expand-file-name "elisp.ps" ps-dir))) | ||
| 252 | (message "Manuals created in %s" dest))) | ||
| 253 | |||
| 254 | (defconst manual-doctype-string | ||
| 255 | "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" | ||
| 256 | \"http://www.w3.org/TR/html4/loose.dtd\">\n\n") | ||
| 257 | |||
| 258 | (defconst manual-meta-string | ||
| 259 | "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"> | ||
| 260 | <link rev=\"made\" href=\"mailto:webmasters@gnu.org\"> | ||
| 261 | <link rel=\"icon\" type=\"image/png\" href=\"/graphics/gnu-head-mini.png\"> | ||
| 262 | <meta name=\"ICBM\" content=\"42.256233,-71.006581\"> | ||
| 263 | <meta name=\"DC.title\" content=\"gnu.org\">\n\n") | ||
| 264 | |||
| 265 | (defconst manual-style-string "<style type=\"text/css\"> | ||
| 266 | @import url('/style.css');\n</style>\n") | ||
| 267 | |||
| 268 | (defun manual-html-mono (texi-file dest) | ||
| 269 | "Run Makeinfo on TEXI-FILE, emitting mono HTML output to DEST. | ||
| 270 | This function also edits the HTML files so that they validate as | ||
| 271 | HTML 4.01 Transitional, and pulls in the gnu.org stylesheet using | ||
| 272 | the @import directive." | ||
| 273 | (call-process "makeinfo" nil nil nil | ||
| 274 | "--html" "--no-split" texi-file "-o" dest) | ||
| 275 | (with-temp-buffer | ||
| 276 | (insert-file-contents dest) | ||
| 277 | (setq buffer-file-name dest) | ||
| 278 | (manual-html-fix-headers) | ||
| 279 | (manual-html-fix-index-1) | ||
| 280 | (manual-html-fix-index-2 t) | ||
| 281 | (manual-html-fix-node-div) | ||
| 282 | (goto-char (point-max)) | ||
| 283 | (re-search-backward "</body>[\n \t]*</html>") | ||
| 284 | (insert "</div>\n\n") | ||
| 285 | (save-buffer))) | ||
| 286 | |||
| 287 | (defun manual-html-node (texi-file dir) | ||
| 288 | "Run Makeinfo on TEXI-FILE, emitting per-node HTML output to DIR. | ||
| 289 | This function also edits the HTML files so that they validate as | ||
| 290 | HTML 4.01 Transitional, and pulls in the gnu.org stylesheet using | ||
| 291 | the @import directive." | ||
| 292 | (unless (file-exists-p texi-file) | ||
| 293 | (error "Manual file %s not found" texi-file)) | ||
| 294 | (call-process "makeinfo" nil nil nil | ||
| 295 | "--html" texi-file "-o" dir) | ||
| 296 | ;; Loop through the node files, fixing them up. | ||
| 297 | (dolist (f (directory-files dir nil "\\.html\\'")) | ||
| 298 | (let (opoint) | ||
| 299 | (with-temp-buffer | ||
| 300 | (insert-file-contents (expand-file-name f dir)) | ||
| 301 | (setq buffer-file-name (expand-file-name f dir)) | ||
| 302 | (if (looking-at "<meta http-equiv") | ||
| 303 | ;; Ignore those HTML files that are just redirects. | ||
| 304 | (set-buffer-modified-p nil) | ||
| 305 | (manual-html-fix-headers) | ||
| 306 | (if (equal f "index.html") | ||
| 307 | (let (copyright-text) | ||
| 308 | (manual-html-fix-index-1) | ||
| 309 | ;; Move copyright notice to the end. | ||
| 310 | (re-search-forward "[ \t]*<p>Copyright ©") | ||
| 311 | (setq opoint (match-beginning 0)) | ||
| 312 | (re-search-forward "</blockquote>") | ||
| 313 | (setq copyright-text (buffer-substring opoint (point))) | ||
| 314 | (delete-region opoint (point)) | ||
| 315 | (manual-html-fix-index-2) | ||
| 316 | (insert copyright-text "\n</div>\n")) | ||
| 317 | ;; For normal nodes, give the header div a blue bg. | ||
| 318 | (manual-html-fix-node-div)) | ||
| 319 | (save-buffer)))))) | ||
| 320 | |||
| 321 | (defun manual-txt (texi-file dest) | ||
| 322 | "Run Makeinfo on TEXI-FILE, emitting plaintext output to DEST." | ||
| 323 | (call-process "makeinfo" nil nil nil | ||
| 324 | "--plaintext" "--no-split" texi-file "-o" dest) | ||
| 325 | (shell-command (concat "gzip -c " dest " > " (concat dest ".gz")))) | ||
| 326 | |||
| 327 | (defun manual-pdf (texi-file dest) | ||
| 328 | "Run texi2pdf on TEXI-FILE, emitting plaintext output to DEST." | ||
| 329 | (call-process "texi2pdf" nil nil nil texi-file "-o" dest)) | ||
| 330 | |||
| 331 | (defun manual-dvi (texi-file dest ps-dest) | ||
| 332 | "Run texi2dvi on TEXI-FILE, emitting dvi output to DEST. | ||
| 333 | Also generate postscript output in PS-DEST." | ||
| 334 | (call-process "texi2dvi" nil nil nil texi-file "-o" dest) | ||
| 335 | (call-process "dvips" nil nil nil dest "-o" ps-dest) | ||
| 336 | (call-process "gzip" nil nil nil dest) | ||
| 337 | (call-process "gzip" nil nil nil ps-dest)) | ||
| 338 | |||
| 339 | (defun manual-html-fix-headers () | ||
| 340 | "Fix up HTML headers for the Emacs manual in the current buffer." | ||
| 341 | (let (opoint) | ||
| 342 | (insert manual-doctype-string) | ||
| 343 | (search-forward "<head>\n") | ||
| 344 | (insert manual-meta-string) | ||
| 345 | (search-forward "<meta") | ||
| 346 | (setq opoint (match-beginning 0)) | ||
| 347 | (re-search-forward "<!--") | ||
| 348 | (goto-char (match-beginning 0)) | ||
| 349 | (delete-region opoint (point)) | ||
| 350 | (insert manual-style-string) | ||
| 351 | (search-forward "<meta http-equiv=\"Content-Style") | ||
| 352 | (setq opoint (match-beginning 0)) | ||
| 353 | (search-forward "</head>") | ||
| 354 | (delete-region opoint (match-beginning 0)))) | ||
| 355 | |||
| 356 | (defun manual-html-fix-node-div () | ||
| 357 | "Fix up HTML \"node\" divs in the current buffer." | ||
| 358 | (let (opoint div-end) | ||
| 359 | (while (search-forward "<div class=\"node\">" nil t) | ||
| 360 | (replace-match | ||
| 361 | "<div class=\"node\" style=\"background-color:#DDDDFF\">" | ||
| 362 | t t) | ||
| 363 | (setq opoint (point)) | ||
| 364 | (re-search-forward "</div>") | ||
| 365 | (setq div-end (match-beginning 0)) | ||
| 366 | (goto-char opoint) | ||
| 367 | (if (search-forward "<hr>" div-end 'move) | ||
| 368 | (replace-match "" t t))))) | ||
| 369 | |||
| 370 | (defun manual-html-fix-index-1 () | ||
| 371 | (let (opoint) | ||
| 372 | (re-search-forward "<body>\n\\(<h1 class=\"settitle\\)") | ||
| 373 | (setq opoint (match-beginning 1)) | ||
| 374 | (search-forward "<h2 class=\"unnumbered") | ||
| 375 | (goto-char (match-beginning 0)) | ||
| 376 | (delete-region opoint (point)) | ||
| 377 | (insert "<div id=\"content\" class=\"inner\">\n\n"))) | ||
| 378 | |||
| 379 | (defun manual-html-fix-index-2 (&optional table-workaround) | ||
| 380 | "Replace the index list in the current buffer with a HTML table." | ||
| 381 | (let (done open-td tag desc) | ||
| 382 | ;; Convert the list that Makeinfo made into a table. | ||
| 383 | (search-forward "<ul class=\"menu\">") | ||
| 384 | (replace-match "<table style=\"float:left\" width=\"100%\">") | ||
| 385 | (forward-line 1) | ||
| 386 | (while (not done) | ||
| 387 | (cond | ||
| 388 | ((or (looking-at "<li>\\(<a.+</a>\\):[ \t]+\\(.*\\)$") | ||
| 389 | (looking-at "<li>\\(<a.+</a>\\)$")) | ||
| 390 | (setq tag (match-string 1)) | ||
| 391 | (setq desc (match-string 2)) | ||
| 392 | (replace-match "" t t) | ||
| 393 | (when open-td | ||
| 394 | (save-excursion | ||
| 395 | (forward-char -1) | ||
| 396 | (skip-chars-backward " ") | ||
| 397 | (delete-region (point) (line-end-position)) | ||
| 398 | (insert "</td>\n </tr>"))) | ||
| 399 | (insert " <tr>\n ") | ||
| 400 | (if table-workaround | ||
| 401 | ;; This works around a Firefox bug in the mono file. | ||
| 402 | (insert "<td bgcolor=\"white\">") | ||
| 403 | (insert "<td>")) | ||
| 404 | (insert tag "</td>\n <td>" (or desc "")) | ||
| 405 | (setq open-td t)) | ||
| 406 | ((eq (char-after) ?\n) | ||
| 407 | (delete-char 1) | ||
| 408 | ;; Negate the following `forward-line'. | ||
| 409 | (forward-line -1)) | ||
| 410 | ((looking-at "<!-- ") | ||
| 411 | (search-forward "-->")) | ||
| 412 | ((looking-at "<p>[- ]*The Detailed Node Listing[- \n]*") | ||
| 413 | (replace-match " </td></tr></table>\n | ||
| 414 | <h3>Detailed Node Listing</h3>\n\n" t t) | ||
| 415 | (search-forward "<p>") | ||
| 416 | (search-forward "<p>") | ||
| 417 | (goto-char (match-beginning 0)) | ||
| 418 | (skip-chars-backward "\n ") | ||
| 419 | (setq open-td nil) | ||
| 420 | (insert "</p>\n\n<table style=\"float:left\" width=\"100%\">")) | ||
| 421 | ((looking-at "</li></ul>") | ||
| 422 | (replace-match "" t t)) | ||
| 423 | ((looking-at "<p>") | ||
| 424 | (replace-match "" t t) | ||
| 425 | (when open-td | ||
| 426 | (insert " </td></tr>") | ||
| 427 | (setq open-td nil)) | ||
| 428 | (insert " <tr> | ||
| 429 | <th colspan=\"2\" align=\"left\" style=\"text-align:left\">") | ||
| 430 | (re-search-forward "</p>[ \t\n]*<ul class=\"menu\">") | ||
| 431 | (replace-match " </th></tr>")) | ||
| 432 | ((looking-at "[ \t]*</ul>[ \t]*$") | ||
| 433 | (replace-match | ||
| 434 | (if open-td | ||
| 435 | " </td></tr>\n</table>" | ||
| 436 | "</table>") t t) | ||
| 437 | (setq done t)) | ||
| 438 | (t | ||
| 439 | (if (eobp) | ||
| 440 | (error "Parse error in %s" f)) | ||
| 441 | (unless open-td | ||
| 442 | (setq done t)))) | ||
| 443 | (forward-line 1)))) | ||
| 444 | |||
| 215 | (provide 'admin) | 445 | (provide 'admin) |
| 216 | 446 | ||
| 217 | ;;; admin.el ends here | 447 | ;;; admin.el ends here |