让 hugo 能把 attach 方式导入的资源发布到 public

说明 重写 ox-hugo/ox-hugo.el 中的 org-hugo--attachment-rewrite-maybe 方法(大约在3189行) 1 2 3 4 5 6 7 ;;... (let* ((file-name-relative-path ;; ... ;; ... ((string-match (regexp-quote default-directory) path-true) (substring path-true (match-end 0))) ;; ... 把 (substring path-true (match-end 0)) (大约 3267 行) 修改为: 1 2 3 4 5 6 (let* ((attach-path (substring path-true (match-end 0))) ;; 如果 以 ~org-attach-directory~ 开头,通常是: ~xxxxx/.attach/xx/xxxxxx/xxxx. (rewrite-attach-path (if (string-match (regexp-quote (file-truename org-attach-directory)) path-true) (concat "attach/" (file-name-nondirectory attach-path)) attach-path))) ;;(message "[ox-hugo DBG attch rewrite BUNDLE 2] attch along with Org content: %s" rewrite-attach-path) rewrite-attach-path) 完整内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 (defun org-hugo--attachment-rewrite-maybe (path info) "Copy local images and pdfs to the static/bundle directory if needed. Also update the link paths to match those. PATH is the path to the image or any other attachment. INFO is a plist used as a communication channel." ;;(message "[ox-hugo attachment DBG] The Hugo section is: %s" (plist-get info :hugo-section)) ;;(message "[ox-hugo attachment DBG] The Hugo base dir is: %s" (plist-get info :hugo-base-dir)) ; (let* ((pub-dir (org-hugo--get-pub-dir info)) ;This needs to happen first so that the check for HUGO_BASE_DIR happens. (hugo-base-dir (file-name-as-directory (plist-get info :hugo-base-dir))) (path-unhexified (url-unhex-string path)) (path-true (file-truename path-unhexified)) (exportables org-hugo-external-file-extensions-allowed-for-copying) (bundle-dir (and (plist-get info :hugo-bundle) pub-dir)) (bundle-name (when bundle-dir (let* ((content-dir (file-truename (file-name-as-directory (expand-file-name "content" hugo-base-dir)))) (is-home-branch-bundle (string= bundle-dir content-dir))) (cond (is-home-branch-bundle "_home") (t ;`bundle-dir'="/foo/bar/" -> `bundle-name'="bar" (file-name-base (directory-file-name bundle-dir))))))) (static-dir (file-truename (file-name-as-directory (expand-file-name "static" hugo-base-dir)))) (dest-dir (or bundle-dir static-dir)) ret) (unless (file-directory-p static-dir) (user-error "Please create the %s directory" static-dir)) ;; (message "[ox-hugo DBG attch rewrite] Image export dir is: %s" static-dir) ;; (message "[ox-hugo DBG attch rewrite] path: %s" path) ;; (message "[ox-hugo DBG attch rewrite] path-true: %s" path-true) ;; (message "[ox-hugo DBG attch rewrite] bundle-dir: %s" bundle-dir) ;; (message "[ox-hugo DBG attch rewrite] bundle-name: %s" bundle-name) ;; (message "[ox-hugo DBG attch rewrite] default-dir: %s" default-directory) ;; (message "[ox-hugo DBG attch rewrite] dest-dir: %s" dest-dir) (if (and (file-exists-p path-true) (member (file-name-extension path-unhexified) exportables) (file-directory-p dest-dir)) (progn ;; Check if `path-true' is already inside `dest-dir'. (if (string-match (regexp-quote dest-dir) path-true) (progn ;; If so, return *only* the path considering the ;; destination directory as root. (setq ret (concat "/" (substring path-true (match-end 0))))) (let* ((file-name-relative-path (cond ((string-match "/static/" path-true) ;; `path-true' is "/foo/static/bar/baz.png", ;; return "bar/baz.png". ;;(message "[ox-hugo DBG attch rewrite] path contains static") ;; If path-true contains "/static/", set the ;; `dest-dir' to `static-dir' (even if this is a ;; page bundle). (setq dest-dir static-dir) (substring path-true (match-end 0))) (bundle-dir (cond ((string-match (concat "/" (regexp-quote bundle-name) "/") path-true) ;; This is a page bundle. `bundle-name' is ;; "<BUNDLE_NAME>", `path-true' is ;; "<ORG_FILE_DIR>/bar/<BUNDLE_NAME>/zoo/baz.png", ;; return "zoo/baz.png". ;; (message "[ox-hugo DBG attch rewrite BUNDLE 1] bundle-name: %s" bundle-name) ;; (message "[ox-hugo DBG attch rewrite BUNDLE 1] attch along with Org content: %s" (substring path-true (match-end 0))) (substring path-true (match-end 0))) ((string-match (regexp-quote default-directory) path-true) ;; This is a page bundle. `default-path' is ;; "<ORG_FILE_DIR>/", `path-true' is ;; "<ORG_FILE_DIR>/bar/baz.png", return ;; "bar/baz.png". ;; ;; 修复 =org-mode= 附件格式以 =attach= 保存时,附件能正常复制到 ~content/~ 文件夹下,但不能正常发布的问题; (let* ((attach-path (substring path-true (match-end 0))) ;; 如果 以 ~org-attach-directory~ 开头,通常是: ~xxxxx/.attach/xx/xxxxxx/xxxx. (rewrite-attach-path (if (string-match (regexp-quote (file-truename org-attach-directory)) path-true) (concat "attach/" (file-name-nondirectory attach-path)) attach-path))) ;;(message "[ox-hugo DBG attch rewrite BUNDLE 2] attch along with Org content: %s" rewrite-attach-path) rewrite-attach-path)) (t ;; This is a page bundle. `default-path' is ;; "<ORG_FILE_DIR>/", `path-true' is ;; "/foo/bar/baz.png", return "baz.png". ;;(message "[ox-hugo DBG attch rewrite BUNDLE 3] attch neither in static nor in Org file dir") (file-name-nondirectory path-unhexified)))) (t ;; Else, `path-true' is "/foo/bar/baz.png", ;; return "ox-hugo/baz.png". "ox-hugo" is the ;; default value of ;; `org-hugo-default-static-subdirectory-for-externals'. ;;(message "[ox-hugo DBG attch rewrite] neither BUNDLE nor contains static") (concat (file-name-as-directory org-hugo-default-static-subdirectory-for-externals) (file-name-nondirectory path-unhexified))))) (dest-path (concat dest-dir file-name-relative-path)) (dest-path-dir (file-name-directory dest-path))) ;; The `dest-dir' would already exist. But if ;; `file-name-relative-path' is "images/image.png" or ;; "foo/bar.txt", it's likely that "`dest-dir'/images" ;; or "`dest-dir'/foo" might not exist. So create those ;; if needed below. (unless (file-exists-p dest-path-dir) (mkdir dest-path-dir :parents)) ;; (message "[ox-hugo DBG attch rewrite] file-name-relative-path: %s" file-name-relative-path) ;; (message "[ox-hugo DBG attch rewrite] dest-path: %s" dest-path) ;; (message "[ox-hugo DBG attch rewrite] dest-path-dir: %s" dest-path-dir) ;; Do the copy only if the file to be copied is newer or ;; doesn't exist in the static dir. (when (file-newer-than-file-p path-true dest-path) (message "[ez-ox-hugo] Copied %S to %S" path-true dest-path) (copy-file path-true dest-path :ok-if-already-exists)) (setq ret (if (and bundle-dir (string= bundle-dir dest-dir)) ;; If attachments are copied to the bundle ;; directory, don't prefix the path as "/" ;; as those paths won't exist at the site ;; base URL. file-name-relative-path (concat "/" file-name-relative-path)))))) (setq ret path)) ;;(message "[ox-hugo DBG attch rewrite] returned path: %s" ret) ret))

2024-07-05 · 2 分钟 · 七二十洞天