所有文章阅读量
UP | HOME

org-publish用org批量导出来建一个静态博客系统

1. 导出的html使用头文件调取本地css文件(安全稳定可定制不依赖网络)

  1. C-c C-e 然后选择相应的格式,就可以导出对应的文件了。
  2. 导出到HTML教程
    1. 头文件,就是一个编辑好的文本,里面编写好了具体的拼配置 我放到了=.emacs.d/org-other-file/=文件夹内

       1: # Turn off default internal styles
       2: #+OPTIONS: html-style:nil html5-fancy:t
       3: 
       4: # Exporting to HTML5
       5: #+HTML_DOCTYPE: html5
       6: #+HTML_HEAD: <meta http-equiv="X-UA-Compatible" content="IE=edge">
       7: #+HTML_HEAD: <meta name="viewport" content="width=device-width, initial-scale=1">
       8: #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../css/org.css" />
       9: 
      10: 
      11: #+HTML_LINK_UP: ../index.html
      12: #+HTML_LINK_HOME: ../index.html
      13: 
      14: 
      15: #+STARTUP: showall
      16: 
      17: #+HTML_HEAD: <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
      18: #+HTML_HEAD: <span id="busuanzi_container_page_pv">所有文章阅读量<span id="busuanzi_value_page_pv"></span>次</span>
      
    2. 然后在所要编写的org文件的头部添加上加载头文件的语句就可以了

      #+SETUPFILE: ~/.emacs.d/org-other-file/org-level-1.org
      
  1. 直接css嵌入文件内部(我没有使用,作为备用选项) 当然,如果只是想生成供本地阅读的 html 也可以采用把 CSS 内容直接内嵌到 html 页面里的方式 首先设置好一个变量,把 CSS 属性导入:

     1: ;; set the stylesheet string
     2: (setq waterstyle "<style>
     3:  body {
     4:      padding: 50px 150px 50px 150px;
     5:      border-style: solid;
     6:      border-width: 20pt;
     7:      border-color: #790000;
     8:  }
     9: 
    10:  body, p, li {
    11: 	 /*font-family: monospace;*/
    12: 	     font-family: \"Microsoft YaHei\" ! important;
    13: 	 font-size: 1em;
    14:  }
    15:  /* more CSS style */
    16: 	      </style>")
    

    然后在 org 工程设置里有关添加 CSS 的地方使用该变量,可以使用如下方式来直接把 CSS 内容加进去

    :style , waterstyle
    

    这样,本地使用 html 页面就会变得非常舒服了

2. 批量导出文件

教程直接就是配置文件

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; -*- coding: utf-8; lexical-binding: t -*-
;;pengshao-org-publish.el---org-publish相关的配置
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'ox-publish)
(setq org-publish-project-alist
      '(
	 ("psnote-org"
	     :base-directory "~/public_note/"
	     :base-extension "org"
	     :publishing-directory "~/public_site/"
	     :recursive t     ;是否递归
	     :publishing-function org-html-publish-to-html  ;使用哪个函数来进行publish(注:org 7与8在这个地方有区别)
	     :headline-levels 2   ;由于大纲结构也用于列表和任务,因此只有前4个级别用作标题更深的级别会被看作项目列表,我设置的2
	     :auto-preamble t     ;自动前言
	     :section-numbers t ;章节数字是否显示
	     :author "pengshao"   ;作者
	     :email "pengshao58@gmail.com"   ;邮箱
	     :auto-sitemap t                  ; 自动生成 sitemap.org 文件
	     :sitemap-filename "sitemap.org"  ; ... call it sitemap.org (it's the default)...
	     :sitemap-title "PengShao's BLOG!"         ; ... with title
	     ;;:sitemap-file-entry-format "%d %t"   ;这里采用时间+标题的方式生成sitemap 
	     :style-include-default nil  ;禁用默认 css 样式,使用自定义css

	     ;作为一个字符串给予 html-head 变量并插入到生成的 html 文件的head部
	     ;因此里面的某些字符必须避免转义,比如双引号必须加上反斜杠
	     ;href 的赋值不会做如何转换,因此必须确保是在生成的 html 文件能够访问的绝对路径。
	     ;html-home/up-format"<div id=\"org-div-home-and-up\"> <a accesskey=\"h\" href=\"/home/index.html\"> UP </a> | <a accesskey=\"H\" href=\"/home/index.html\"> HOME </a></div>"
	     ;html-head "<link rel=\"stylesheet\" type=\"text/css\" href=\"/home/css/org.css\"/>"
	     ;html-postamble "<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-164487790-1\"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-164487790-1'); </script>"
	     ;HTML_EXPORT_POSTamble: "<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"> </script>

	 )



	 ("psnote-static"
	     :base-directory "~/public_note/"
	     :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|sh\\|el\\|jpeg\\|html"
	     :publishing-directory "~/public_site/"
	     :recursive t
	     :publishing-function org-publish-attachment
	  )


	 ("psnote" :components ("psnote-org" "psnote-static"))


	))


(define-key global-map "\C-cp" 'org-publish)




(provide 'pengshao-org-publish)

3. 批量导出跳过旧文件导出的情况

  1. 本来认为org只发布修改过的文件是它对比了org文件和导出文件的时间戳。 后来我把导出文件删除,又重新发布。发现都跳过了, 并没有重新导出文件,可见它并没有对比org文件和导出文件的时间戳 后来在家目录下发现了一个目录.org-timestamps 原来所有的记录的东西都在这里放着 想不改变org文件而重新导出html等文件可以把这个目录删除,然后现重新发布。
  2. 或者直接暴力的 C-u M-x org-purblish 这样也是可以的
  3. Orgmode 发布项目缓存说明(一直也没弄明白,用不到,懒得了解放在这吧) 在使用 Orgmode 进行 M-x org-publish-project 来进行将 org 文件导出为项目时, 发现它会有缓存,即如果 org 文件没有再修改过,它就不会再生成该文件相应的 HTML 文件了。

    参数

    1. org-publish-use-timestamps-flag 1 (可通过 C-h v 变量名 来查看变量的说明及设置) 这个在第一次时可以看到,设置过之后就看不到了. 它显示是否使用时间戳来埋发布。 即对应的文件的的修改时间戳要比旧文件新才会进行发布。
    2. org-publish-timestamp-directory 这个就是保存时间戳文件的缓存目录的函数 (删除.org-timestamps下的所有文件,即可进行全部重新发布)

4. 清除上下标的设置

导出时如果需要目录(类似本文开头), 要在org文件的开头出添加metadata. 默认情况下org-mode会把^, _, []等字符当做latex中的上标,下标和脚注 如果不想让org-mode误会, 也要在metadata中注明. 于是, 每次写笔记时, 开头就要加一行

#+OPTIONS: ^:nil _:nil f:nil toc:t

5. 导出的html不显示目录

导出html文章不显示目录,

#+OPTIONS: toc:nil

6. 主页的设置

  1. 配置文件选项设置

    ;自动导航主页模式
     auto-sitemap t
    ;主页文件的名称
    sitemap-filename "sitemap.org"
    ;标题
    sitemap-title "我的网站"
    
  2. 然后每次发布这个工程的时候,就会生成一个 sitemap.org 的文件. 这个文件会递归地遍历你工程里的所有文件并生成链接, 并会生成一个名叫 sitemap.html 的文件。
  3. 然后,我们只要在我们的 index.org 里 include 这个文件 系统会自动导出index.html了就.

    #+INCLUDE: sitemap.org
    

    这样我们就再也不用手动添加页面的索引链接了。

  4. 我们可以在每个页面的页脚里把这个 sitemap.org 的链接给加上,方便随手访问这个索引。

7. 在 Org 模式中将图片导出为 HTML 时设置尺寸大小

  1. 使用 #+attr_html 属性设置具体尺寸 可以通过 #+attr_html 属性为图片指定固定的宽度和高度。

    #+attr_html: :width 400px :height 300px
    [[file:your_image.jpg]]
    

    解释: "#+attr_html" 专门用于控制导出为 HTML 时图片的属性。 :width 400px 将图片宽度设置为 400 像素,你可以修改此值,也能使用百分比(如 60%)设置相对宽度。 :height 300px 将图片高度设置为 300 像素,同样可按需调整。

  2. 使用 CSS 样式设置图片尺寸 可以在 Org 文件头部添加 CSS 样式来控制图片尺寸。

    #+HTML_HEAD: <style>
    #+HTML_HEAD:   img.custom - image {
    #+HTML_HEAD:     width: 70%;
    #+HTML_HEAD:     height: auto;
    #+HTML_HEAD:   }
    #+HTML_HEAD: </style>
    
    #+attr_html: :class custom - image
    [[file:your_image.jpg]]
    
    
    

    解释: "#+HTML_HEAD:"用于在导出的 HTML 文件 <head> 部分添加内容。 img.custom - image 是 CSS 选择器,选择带有 custom - image 类的图片。 width: 70%; 将图片宽度设置为其父元素宽度的 70%。 height: auto; 保持图片原始宽高比,根据宽度自动调整高度。 "#+attr_html:" :class custom - image 为图片添加 custom - image 类。

  3. 按比例缩放图片 使用 :scale 属性按比例缩放图片。

    #+attr_html: :scale 0.8
    [[file:your_image.jpg]]
    

    解释: :scale 0.8 将图片按 0.8 的比例缩放,即缩小为原来的 80%。

  4. 动态调整图片大小 利用 CSS 的 max - width 属性让图片根据浏览器窗口大小动态调整。

    #+attr_html: :style "max-width: 100%; height: auto;"
    [[file:your_image.jpg]]
    

    解释: max - width: 100%; 确保图片最大宽度不超过其父元素宽度。 height: auto; 保持图片原始宽高比,根据宽度自动调整高度。

    通过上述方法,你能够灵活控制 Org 模式中图片导出为 HTML 时的尺寸大小。

8. 自动删除已经删除掉org原始文件的html文件(不如手动稳定,也懒得去弄了)

虽然有这个功能,我也想用 但是还是临时先用手动添加和删除吧. 虽然有git但是,弄坏了好麻烦的.

 1: ;;; 自动清理无对应 Org 文件的 HTML 文件配置
 2: 
 3: ;; 定义配置变量(可按需修改路径)
 4: (defvar my/org-source-dir "~/public_note/" 
 5:   "Org 源文件目录路径,必须以斜杠结尾")
 6: (defvar my/html-output-dir "~/boxmaking.github.io/"
 7:   "HTML 输出目录路径,必须以斜杠结尾")
 8: 
 9: ;; 主清理函数
10: (defun delete-missing-org-html-files (&rest _)
11:   "自动删除没有对应 Org 文件的 HTML 文件
12: 支持递归子目录检查,处理特殊字符文件名"
13:   (interactive)
14:   (let* ((org-dir (expand-file-name my/org-source-dir))
15: 	 (html-dir (expand-file-name my/html-output-dir))
16: 	 ;; 递归获取所有 org/html 文件
17: 	 (org-files (directory-files-recursively org-dir "\\.org$"))
18: 	 (html-files (directory-files-recursively html-dir "\\.html$")))
19: 
20:     (dolist (html-file html-files)
21:       (let* ((rel-path (file-relative-name html-file html-dir))
22: 	     (base-name (file-name-sans-extension rel-path))
23: 	     (org-file (expand-file-name (concat base-name ".org") org-dir)))
24: 
25: 	;; 跳过索引文件(about.html 等)
26: 	(unless (string-match-p "index\\|about\\|contact" base-name)
27: 	  ;; 检查 Org 文件是否存在
28: 	  (unless (file-exists-p org-file)
29: 	    ;; 安全删除(先移到废纸篓)
30: 	    (if (fboundp 'move-file-to-trash)
31: 		(progn
32: 		  (move-file-to-trash html-file)
33: 		  (message "▷ 已安全删除: %s" html-file))
34: 	      (delete-file html-file)
35: 	      (message "▷ 已永久删除: %s" html-file))))))))
36: 
37: ;; 配置钩子(根据使用场景选择)
38: ;; 场景 1: 手动导出后清理
39: (add-hook 'org-export-after-export-hook #'delete-missing-org-html-files)
40: 
41: ;; 场景 2: 发布项目后清理
42: (add-hook 'org-publish-after-export-hook #'delete-missing-org-html-files)
43: 
44: ;; 场景 3: 保存 Org 文件时自动清理(谨慎使用)
45: ;; (add-hook 'after-save-hook 
46: ;;           (lambda ()
47: ;;             (when (eq major-mode 'org-mode)
48: ;;               (delete-missing-org-html-files))))

日期: <2025-02-11/Tuesday 16:29:10>

作者: pengshao

Created: 2025-02-17 Mon 23:20

Validate