;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix 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 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix 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 GNU Guix. If not, see . (define-module (test-texlive) #:use-module (gnu packages tex) #:use-module (guix import texlive) #:use-module (guix tests) #:use-module (guix tests http) #:use-module (guix build utils) #:
aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu build locale)
  #:use-module (guix build utils)
  #:use-module (srfi srfi-1)
  #:use-module (ice-9 rdelim)
  #:use-module (ice-9 match)
  #:use-module (ice-9 regex)
  #:export (build-locale
            normalize-codeset
            locale->name+codeset
            read-supported-locales))

(define locale-rx
  ;; Regexp matching a locale line in 'localedata/SUPPORTED'.
  (make-regexp
   "^[[:space:]]*([[:graph:]]+)/([[:graph:]]+)[[:space:]]*\\\\$"))

(define (read-supported-locales port)
  "Read the 'localedata/SUPPORTED' file from PORT.  That file is actually a
makefile snippet, with one locale per line, and a header that can be
discarded."
  (let loop ((locales '()))
    (define line
      (read-line port))

    (cond ((eof-object? line)
           (reverse locales))
          ((string-prefix? "#" (string-trim line)) ;comment
           (loop locales))
          ((string-contains line "=")            ;makefile variable assignment
           (loop locales))
          (else
           (match (regexp-exec locale-rx line)
             (#f
              (loop locales))
             (m
              (loop (alist-cons (match:substring m 1)
                                (match:substring m 2)
                                locales))))))))

(define (normalize-codeset codeset)
  "Compute the \"normalized\" variant of CODESET."
  ;; info "(libc) Using gettextized software", for the algorithm used to
  ;; compute the normalized codeset.
  (letrec-syntax ((-> (syntax-rules ()
                        ((_ proc value)
                         (proc value))
                        ((_ proc rest ...)
                         (proc (-> rest ...))))))
    (-> (lambda (str)
          (if (string-every char-set:digit str)
              (string-append "iso" str)
              str))
        string-downcase
        (lambda (str)
          (string-filter char-set:letter+digit str))
        codeset)))

(define* (build-locale locale
                       #:key
                       (localedef "localedef")
                       (directory ".")
                       (codeset "UTF-8")
                       (name (string-append locale "." codeset)))
  "Compute locale data for LOCALE and CODESET--e.g., \"en_US\" and
\"UTF-8\"--with LOCALEDEF, and store it in DIRECTORY under NAME."
  (format #t "building locale '~a'...~%" name)
  (invoke localedef "--no-archive" "--prefix" directory
          "-i" locale "-f" codeset
          (string-append directory "/" name)))

(define (locale->name+codeset locale)
  "Split a locale name such as \"aa_ER@saaho.UTF-8\" into two values: the
language/territory/modifier part, and the codeset."
  (match (string-rindex locale #\.)
    (#f  (values locale #f))
    (dot (values (string-take locale dot)
                 (string-drop locale (+ dot 1))))))
" "texmf-dist/tex/texsis/base/CVformat.txs" "texmf-dist/tex/texsis/base/Elsevier.txs" "texmf-dist/tex/texsis/base/Exam.txs" "texmf-dist/tex/texsis/base/Formletr.txs" "texmf-dist/tex/texsis/base/IEEE.txs" "texmf-dist/tex/texsis/base/PhysRev.txs" "texmf-dist/tex/texsis/base/Spanish.txs" "texmf-dist/tex/texsis/base/Swedish.txs" "texmf-dist/tex/texsis/base/TXSconts.tex" "texmf-dist/tex/texsis/base/TXSdcol.tex" "texmf-dist/tex/texsis/base/TXSenvmt.tex" "texmf-dist/tex/texsis/base/TXSeqns.tex" "texmf-dist/tex/texsis/base/TXSfigs.tex" "texmf-dist/tex/texsis/base/TXSfmts.tex" "texmf-dist/tex/texsis/base/TXSfonts.tex" "texmf-dist/tex/texsis/base/TXShead.tex" "texmf-dist/tex/texsis/base/TXSinit.tex" "texmf-dist/tex/texsis/base/TXSletr.tex" "texmf-dist/tex/texsis/base/TXSmacs.tex" "texmf-dist/tex/texsis/base/TXSmemo.tex" "texmf-dist/tex/texsis/base/TXSprns.tex" "texmf-dist/tex/texsis/base/TXSrefs.tex" "texmf-dist/tex/texsis/base/TXSruled.tex" "texmf-dist/tex/texsis/base/TXSsects.tex" "texmf-dist/tex/texsis/base/TXSsite.tex" "texmf-dist/tex/texsis/base/TXSsymb.tex" "texmf-dist/tex/texsis/base/TXStags.tex" "texmf-dist/tex/texsis/base/TXStitle.tex" "texmf-dist/tex/texsis/base/Tablebod.txs" "texmf-dist/tex/texsis/base/WorldSci.txs" "texmf-dist/tex/texsis/base/color.txs" "texmf-dist/tex/texsis/base/nuclproc.txs" "texmf-dist/tex/texsis/base/printfont.txs" "texmf-dist/tex/texsis/base/spine.txs" "texmf-dist/tex/texsis/base/texsis.tex" "texmf-dist/tex/texsis/base/thesis.txs" "texmf-dist/tex/texsis/base/twin.txs" "texmf-dist/tex/texsis/config/texsis.ini")) (catalogue-license . "lppl"))))) (test-assert "texlive->guix-package" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "texsis" #:package-database (lambda _ %fake-tlpdb)))) (match result (('package ('inherit ('simple-texlive-package "texlive-texsis" ('list "bibtex/bst/texsis/" "doc/man/man1/" "doc/otherformats/texsis/base/" "tex/texsis/base/" "tex/texsis/config/") ('base32 (? string? hash)) #:trivial? #t)) ('propagated-inputs ('list 'texlive-cm 'texlive-hyphen-base 'texlive-knuth-lib 'texlive-plain 'texlive-tex)) ('home-page "https://www.tug.org/texlive/") ('synopsis "Plain TeX macros for Physicists") ('description (? string? description)) ('license 'lppl)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-end "texlive")