All checks were successful
/ test (push) Successful in 9s
Safsaf is a Guile web framework, written using Claude Code running Claude Opus 4.6, based off of the Guix Data Service, Nar Herder and Guix Build Coordinator codebases.
73 lines
2 KiB
Scheme
73 lines
2 KiB
Scheme
;;; news-to-texi.scm — Convert a GNU-style NEWS file to Texinfo
|
|
;;;
|
|
;;; Usage: guile news-to-texi.scm NEWS > version-history.texi
|
|
;;;
|
|
;;; The NEWS format is:
|
|
;;;
|
|
;;; Version X.Y (date)
|
|
;;;
|
|
;;; * First item.
|
|
;;; * Second item, possibly
|
|
;;; continued on the next line.
|
|
;;;
|
|
;;; Lines before the first "Version" heading (title, copyright notice)
|
|
;;; are skipped.
|
|
|
|
(use-modules (ice-9 rdelim)
|
|
(ice-9 regex)
|
|
(ice-9 match))
|
|
|
|
(define (news->texi port out)
|
|
(let loop ((line (read-line port))
|
|
(in-version? #f)
|
|
(in-item? #f))
|
|
(cond
|
|
((eof-object? line)
|
|
;; Close any open item/version.
|
|
(when in-item?
|
|
(display "\n" out))
|
|
(when in-version?
|
|
(format out "@end itemize~%~%")))
|
|
|
|
;; Version heading: "Version X.Y ..."
|
|
((string-match "^Version " line)
|
|
;; Close previous version if open.
|
|
(when in-item?
|
|
(display "\n" out))
|
|
(when in-version?
|
|
(format out "@end itemize~%~%"))
|
|
(format out "@item ~a~%" line)
|
|
(format out "@itemize~%" )
|
|
(loop (read-line port) #t #f))
|
|
|
|
;; Bullet item: " * text"
|
|
((string-match "^ \\* (.+)" line)
|
|
=>
|
|
(lambda (m)
|
|
;; Close previous item if open.
|
|
(when in-item?
|
|
(display "\n" out))
|
|
(format out "@item~%")
|
|
(display (match:substring m 1) out)
|
|
(loop (read-line port) in-version? #t)))
|
|
|
|
;; Continuation line: " text" (indented, no bullet)
|
|
((and in-item? (string-match "^ (.+)" line))
|
|
=>
|
|
(lambda (m)
|
|
(display "\n" out)
|
|
(display (match:substring m 1) out)
|
|
(loop (read-line port) in-version? #t)))
|
|
|
|
;; Blank or preamble line — skip.
|
|
(else
|
|
(loop (read-line port) in-version? in-item?)))))
|
|
|
|
(match (command-line)
|
|
((_ news-file)
|
|
(call-with-input-file news-file
|
|
(lambda (in)
|
|
(news->texi in (current-output-port)))))
|
|
((_ . _)
|
|
(format (current-error-port) "Usage: guile news-to-texi.scm NEWS~%")
|
|
(exit 1)))
|