如何在 Common Lisp 中写入 zip 文件?

发布于 2024-10-02 12:57:33 字数 1354 浏览 8 评论 0原文

我可以打开 zip 条目并调整内容,但我不知道如何保存它们。

需要 CL ZIP 的 API

规格:

ZIP

Quicklisp

MacPorts CLISP 2.49

Aquamacs 2.1 (Emacs 23.2)

Mac OS X 10.6.4

MacBook Pro 5,1

; Removes newlines at the beginning of PRE tags in Sigil-edited ePub files.
;
; See http://code.google.com/p/sigil/issues/detail?id=655
;
; Andrew Pennebaker
; 16 Nov 2010

; Requires Quicklisp.
; http://www.quicklisp.org/
(ql:quickload "zip")
(ql:quickload "cl-ppcre")

(defvar *epub* nil)
(defvar *epub-contents* nil)
(defvar *epub-out* nil)

(defun load-epub (filename)
  (setq *epub* (zip:open-zipfile filename)))

(defun close-epub ()
  (zip:close-zipfile *epub*)
  (setq *epub* nil)
  (setq *epub-contents* nil))

(defun gather-epub-contents ()
    (zip:do-zipfile-entries (name entry *epub*)
      (push name *epub-contents*)))

(defun is-html-file (name)
  (if (cl-ppcre:scan ".+\\.htm[l]?$" name) t nil))

(defun entry-name-to-html (name)
  (flexi-streams:octets-to-string
   (zip:zipfile-entry-contents
    (zip:get-zipfile-entry name *epub*))))

(defun clean (html)
  (values
   (cl-ppcre:regex-replace-all
    "<pre[^>]*>(\\s)*"
    (cl-ppcre:regex-replace-all "\\s+</pre>" html "</pre>")
    "<pre>")))

I'm able to open a zip entry and tweak the contents, but I can't figure out how to save them.

The API for CL ZIP is wanting.

Specs:

ZIP

Quicklisp

MacPorts CLISP 2.49

Aquamacs 2.1 (Emacs 23.2)

Mac OS X 10.6.4

MacBook Pro 5,1

; Removes newlines at the beginning of PRE tags in Sigil-edited ePub files.
;
; See http://code.google.com/p/sigil/issues/detail?id=655
;
; Andrew Pennebaker
; 16 Nov 2010

; Requires Quicklisp.
; http://www.quicklisp.org/
(ql:quickload "zip")
(ql:quickload "cl-ppcre")

(defvar *epub* nil)
(defvar *epub-contents* nil)
(defvar *epub-out* nil)

(defun load-epub (filename)
  (setq *epub* (zip:open-zipfile filename)))

(defun close-epub ()
  (zip:close-zipfile *epub*)
  (setq *epub* nil)
  (setq *epub-contents* nil))

(defun gather-epub-contents ()
    (zip:do-zipfile-entries (name entry *epub*)
      (push name *epub-contents*)))

(defun is-html-file (name)
  (if (cl-ppcre:scan ".+\\.htm[l]?$" name) t nil))

(defun entry-name-to-html (name)
  (flexi-streams:octets-to-string
   (zip:zipfile-entry-contents
    (zip:get-zipfile-entry name *epub*))))

(defun clean (html)
  (values
   (cl-ppcre:regex-replace-all
    "<pre[^>]*>(\\s)*"
    (cl-ppcre:regex-replace-all "\\s+</pre>" html "</pre>")
    "<pre>")))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凡间太子 2024-10-09 12:57:33

根据 Common Lisp ZIP 库的文档,您必须获取单独的句柄才能写入 zip 文件。也许您可以将内容提取到文件夹中,调整内容并通过一次调用(zip路径名源文件夹)来压缩整个文件夹。

As per the documentation of the Common Lisp ZIP library, you have to obtain a separate handle to write to the zip file. Probably you can extract the contents to a folder, tweak the contents and compress the whole folder with a single call to (zip path-name source-folder).

江湖彼岸 2024-10-09 12:57:33

使用临时文件,您可以解压缩、修改和重新压缩。

请参阅 sigil-clean.cl

Using a temp file, you're able to unzip, modify, and rezip.

See sigil-clean.cl

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文