org-publish用org批量导出来建一个静态博客系统
1. 导出的html使用头文件调取本地css文件(安全稳定可定制不依赖网络)
- C-c C-e 然后选择相应的格式,就可以导出对应的文件了。
- 导出到HTML教程
头文件,就是一个编辑好的文本,里面编写好了具体的拼配置 我放到了=.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>
然后在所要编写的org文件的头部添加上加载头文件的语句就可以了
#+SETUPFILE: ~/.emacs.d/org-other-file/org-level-1.org
直接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. 批量导出跳过旧文件导出的情况
- 本来认为org只发布修改过的文件是它对比了org文件和导出文件的时间戳。 后来我把导出文件删除,又重新发布。发现都跳过了, 并没有重新导出文件,可见它并没有对比org文件和导出文件的时间戳 后来在家目录下发现了一个目录.org-timestamps 原来所有的记录的东西都在这里放着 想不改变org文件而重新导出html等文件可以把这个目录删除,然后现重新发布。
- 或者直接暴力的 C-u M-x org-purblish 这样也是可以的
Orgmode 发布项目缓存说明(一直也没弄明白,用不到,懒得了解放在这吧) 在使用 Orgmode 进行 M-x org-publish-project 来进行将 org 文件导出为项目时, 发现它会有缓存,即如果 org 文件没有再修改过,它就不会再生成该文件相应的 HTML 文件了。
参数
- org-publish-use-timestamps-flag 1 (可通过 C-h v 变量名 来查看变量的说明及设置) 这个在第一次时可以看到,设置过之后就看不到了. 它显示是否使用时间戳来埋发布。 即对应的文件的的修改时间戳要比旧文件新才会进行发布。
- 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. 主页的设置
配置文件选项设置
;自动导航主页模式 auto-sitemap t ;主页文件的名称 sitemap-filename "sitemap.org" ;标题 sitemap-title "我的网站"
- 然后每次发布这个工程的时候,就会生成一个 sitemap.org 的文件. 这个文件会递归地遍历你工程里的所有文件并生成链接, 并会生成一个名叫 sitemap.html 的文件。
然后,我们只要在我们的 index.org 里 include 这个文件 系统会自动导出index.html了就.
#+INCLUDE: sitemap.org
这样我们就再也不用手动添加页面的索引链接了。
- 我们可以在每个页面的页脚里把这个 sitemap.org 的链接给加上,方便随手访问这个索引。
7. 在 Org 模式中将图片导出为 HTML 时设置尺寸大小
使用 #+attr_html 属性设置具体尺寸 可以通过 #+attr_html 属性为图片指定固定的宽度和高度。
#+attr_html: :width 400px :height 300px [[file:your_image.jpg]]
解释: "#+attr_html" 专门用于控制导出为 HTML 时图片的属性。 :width 400px 将图片宽度设置为 400 像素,你可以修改此值,也能使用百分比(如 60%)设置相对宽度。 :height 300px 将图片高度设置为 300 像素,同样可按需调整。
使用 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 类。
按比例缩放图片 使用 :scale 属性按比例缩放图片。
#+attr_html: :scale 0.8 [[file:your_image.jpg]]
解释: :scale 0.8 将图片按 0.8 的比例缩放,即缩小为原来的 80%。
动态调整图片大小 利用 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))))