#!/bin/sh
exec rep "$0" "$@"
!#
;; sawfish-xgettext -- extract i18n strings from lisp scripts
;; $Id: sawfish-xgettext,v 1.8 2001/04/20 21:40:50 jsh Exp $
;; This file is part of sawfish.
;; sawfish is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; sawfish is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with sawfish; see the file COPYING. If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
(require 'rep.i18n.xgettext)
(require 'rep.lang.doc)
(defvar *write-c-file* nil)
(define (exit n) (throw 'quit n))
;; random hackery
;; from sawfish.ui.widgets.match-window
(define (beautify-symbol-name symbol)
(cond ((stringp symbol) symbol)
((not (symbolp symbol)) (format "%s" symbol))
(t
(let ((name (copy-sequence (symbol-name symbol))))
(while (string-match "[-:]" name)
(setq name (concat (substring name 0 (match-start))
? (substring name (match-end)))))
(aset name 0 (char-upcase (aref name 0)))
name))))
;; from sawfish.ui.layouts.keymaps
(define (beautify-keymap-name symbol)
(cond ((stringp symbol) symbol)
((not (symbolp symbol)) (format "%s" symbol))
(t
(let ((name (copy-sequence (symbol-name symbol))))
(when (string-match "-keymap" name)
(setq name (substring name 0 (match-start))))
(while (string-match "[-:]" name)
(setq name (concat (substring name 0 (match-start))
? (substring name (match-end)))))
(aset name 0 (char-upcase (aref name 0)))
name))))
;; helper function that groks sawfish specific forms
(define (get-key key args) (and (listp args) (memq key args)))
(define (helper form)
(case (car form)
((defcustom)
(let ((variable (nth 1 form))
(doc (nth 3 form))
(keys (nthcdr 4 form)))
(let ((tooltip (cadr (get-key ':tooltip keys))))
(when tooltip
(setq doc (concat doc "\n\n" tooltip))))
(let ((type* (cadr (get-key ':type* keys))))
(when type*
(scan type*)))
(let ((options (cadr (get-key ':options keys))))
;; extract `:options (foo bar..)' strings
(when (listp options)
(mapc (lambda (s)
(when s
(register (symbol-name s)))) options)))
(let ((type (cadr (get-key ':type keys))))
;; extract `:type (choice foo bar..)' strings
(when (eq (car type) 'choice)
(mapc (lambda (s)
(when (symbolp s)
(register (symbol-name s)))) (cdr type)))
;; extract keymap names
(when (eq type 'keymap)
(register (beautify-keymap-name (symbol-name variable)))))
(when (stringp doc)
(register doc))))
((defgroup)
(let ((real-name (nth 2 form)))
(when (stringp real-name)
(register real-name))))
((define-command)
(let ((name (nth 1 form))
(def (nth 2 form))
(keys (nthcdr 3 form)))
(when (and (eq (car name) 'quote)
(symbolp (cadr name)))
(register (beautify-symbol-name (cadr name))))
(if (get-key #:doc keys)
(register (cadr (get-key #:doc keys)))
(let ((key (or (cadr (get-key #:doc-key keys))
(and (symbolp def)
(doc-file-value-key
def (fluid current-module))))))
(when (stringp key)
(let ((doc (doc-file-ref key)))
(when doc
(register doc))))))
(let ((type (car (cdr (get-key #:type keys)))))
(when type
(scan type)))))
((i18n-defvar i18n-define)
(let ((name (cadr form))
(value (caddr form)))
(case name
((match-window-properties)
(mapc (lambda (x)
(mapc (lambda (y)
(register (beautify-symbol-name (car y)))) (cddr x)))
;; remove a `(backquote X)'
(nth 1 value)))
((match-window-x-properties)
(mapc (lambda (x)
(register (cdr x)))
;; strip a `(quote X)'
(nth 1 value))))
;; always rescan as normal, to be sure not to miss anything
(scan (cons (if (eq (car form) 'i18n-defvar)
'defvar
'define)
(cdr form)))))
(t (scan-list form))))
;; entry point
(when (get-command-line-option "--help")
(write standard-output "\
Usage: sawfish-xgettext [OPTIONS...] FILES...
Program to extract strings from sawfish Lisp files that should be
translated.
--doc-file DOC
--c
--pot\n")
(exit 0))
(when (or (get-command-line-option "-c") (get-command-line-option "--c"))
(setq *write-c-file* t))
(when (or (get-command-line-option "-p") (get-command-line-option "--pot"))
(setq *write-c-file* nil))
(let ((doc-file (get-command-line-option "--doc-file" t)))
(when doc-file
(setq documentation-files (list doc-file))))
(set-helper helper)
(set-included-definers '())
(mapc scan-file command-line-args)
(setq command-line-args '())
(if *write-c-file*
(output-c-file)
(output-pot-file))
;; Local variables:
;; major-mode: lisp-mode
;; End:
syntax highlighted by Code2HTML, v. 0.9.1