summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolpeon <git@volpeon.ink>2021-01-10 13:24:21 +0100
committerVolpeon <git@volpeon.ink>2021-01-10 13:24:21 +0100
commit3ad6bd151364a3278618e3a26e21918d17680d24 (patch)
tree507d5de22d1e57ab86d4d3321d50cab86a3b38e8
parentAdded ream journal entry 1 (diff)
downloadvolpeon.ink-3ad6bd151364a3278618e3a26e21918d17680d24.tar.gz
volpeon.ink-3ad6bd151364a3278618e3a26e21918d17680d24.tar.bz2
volpeon.ink-3ad6bd151364a3278618e3a26e21918d17680d24.zip
Moved output filename handling into Pandoc filter, implemented path rewriting
-rw-r--r--content/personal_blog/2021-01-09-infinite-skyscrapers.md (renamed from content/3jF85da/2021-01-09-infinite-skyscrapers/index.md)6
-rw-r--r--content/personal_blog/index.md (renamed from content/3jF85da/index.md)0
-rw-r--r--metadata/metadata.yaml12
-rwxr-xr-xscripts/build_content.sh73
-rw-r--r--scripts/metadata_filter.lua79
-rwxr-xr-xscripts/watch_content.sh3
-rw-r--r--templates/layouts/page.html6
7 files changed, 102 insertions, 77 deletions
diff --git a/content/3jF85da/2021-01-09-infinite-skyscrapers/index.md b/content/personal_blog/2021-01-09-infinite-skyscrapers.md
index a0831c0..909ecce 100644
--- a/content/3jF85da/2021-01-09-infinite-skyscrapers/index.md
+++ b/content/personal_blog/2021-01-09-infinite-skyscrapers.md
@@ -16,11 +16,11 @@ It dares us to escape from this situation, and as soon as it said that, the room
16 16
17I suddenly realize I'm a cat and the other person an even smaller critter, I don't know what. It was obvious that the creature was just playing with us, watching our futile efforts to escape for its amusement. 17I suddenly realize I'm a cat and the other person an even smaller critter, I don't know what. It was obvious that the creature was just playing with us, watching our futile efforts to escape for its amusement.
18 18
19The other person tries to get the door to open by working on its circuitry, and I do my best to block the creature's view. 19The other person tries to get the door to open again by messing with its circuitry, and I do my best to block the creature's view from what was going on without looking suspicious.
20 20
21After a while, I start exploring the room and notice that there's a hallway in front of it, also separated by a glass wall and a door. However, the wall is broken on one place and has a hole large enough for me to jump through. So that's what I do. I land in a bunch of glass disks lying on the floor, breaking them, but I'm unharmed. 21After a while, I start exploring the room and notice that there's a hallway in front of it, also separated by a glass wall and a door. However, the wall is broken in one place and has a hole large enough for me to jump through. So that's what I do. I land in a bunch of glass disks lying on the floor, breaking them, but I'm unharmed.
22 22
23Now being a human again, I take a glass shard with me and run through a door which leads to a staircase. It's a large round room with stairs along the wall, so I can see all the floors coming before and after. It looks like there's an infinite number of floors. 23Now being a human again, I take a glass shard with me and run through a door which leads to a staircase. It is huge, having the shape of a pill with stairs going along the edge. The center is empty so I can see all the floors coming before and after. It looks like the number of floors is endless.
24I know the creature will come after me soon and so I run upwards as fast as I can. 24I know the creature will come after me soon and so I run upwards as fast as I can.
25 25
26I made it about 5 floors when I hear a door burst open and I quickly enter the room next to me, hoping that the creature hasn't seen me. 26I made it about 5 floors when I hear a door burst open and I quickly enter the room next to me, hoping that the creature hasn't seen me.
diff --git a/content/3jF85da/index.md b/content/personal_blog/index.md
index 8f4484b..8f4484b 100644
--- a/content/3jF85da/index.md
+++ b/content/personal_blog/index.md
diff --git a/metadata/metadata.yaml b/metadata/metadata.yaml
index 5c39f19..0cf5db8 100644
--- a/metadata/metadata.yaml
+++ b/metadata/metadata.yaml
@@ -14,9 +14,10 @@ menus:
14 - id: blog 14 - id: blog
15 label: Blog 15 label: Blog
16 url: /blog/ 16 url: /blog/
17 - id: 3jF85da 17 - id: personal_blog
18 label: Personal 18 label: Personal
19 url: /3jF85da/ 19 label_long: Personal Blog
20 url: /personal_blog/
20 hidden: true 21 hidden: true
21 22
22feeds: 23feeds:
@@ -27,5 +28,10 @@ categories:
27 blog: 28 blog:
28 tes: Testing 29 tes: Testing
29 per: Personal 30 per: Personal
30 3jF85da: 31 personal_blog:
31 dre: Dream Journal 32 dre: Dream Journal
33
34rewrites:
35 path:
36 - from: ^/personal_blog
37 to: /3jF85da
diff --git a/scripts/build_content.sh b/scripts/build_content.sh
index 63bc525..97f57a3 100755
--- a/scripts/build_content.sh
+++ b/scripts/build_content.sh
@@ -26,29 +26,16 @@ FILTERS=$(get_filters)
26get_filename_out() { 26get_filename_out() {
27 local filename=$1 27 local filename=$1
28 filename=${filename#"$CONTENT_DIR"} 28 filename=${filename#"$CONTENT_DIR"}
29 if [ "${filename##*.}" = "md" ]; then
30 filename="${filename%.md}.html"
31 fi
32 if [ "${filename##*/}" != "index.html" ]; then
33 filename="${filename%.html}/index.html"
34 fi
35 echo "$OUTPUT_DIR$filename" 29 echo "$OUTPUT_DIR$filename"
36} 30}
37 31
38get_metadata() { 32get_metadata() {
39 local file_out=$(get_filename_out "$1")
40 local base_file_out="$2"
41
42 if [ -z "$2" ]; then
43 base_file_out="$file_out"
44 fi
45
46 pandoc "$1" \ 33 pandoc "$1" \
47 -f markdown \ 34 -f markdown \
48 -t plain \ 35 -t plain \
36 --metadata content_dir="$CONTENT_DIR" \
49 --metadata output_dir="$OUTPUT_DIR" \ 37 --metadata output_dir="$OUTPUT_DIR" \
50 --metadata base_file_out="$base_file_out" \ 38 --metadata file_in="$1" \
51 --metadata file_out="$file_out" \
52 --metadata-file metadata/metadata.yaml \ 39 --metadata-file metadata/metadata.yaml \
53 --no-highlight \ 40 --no-highlight \
54 --template scripts/metadata_tpl.json \ 41 --template scripts/metadata_tpl.json \
@@ -56,19 +43,12 @@ get_metadata() {
56} 43}
57 44
58get_content() { 45get_content() {
59 local file_out=$(get_filename_out "$1")
60 local base_file_out="$2"
61
62 if [ -z "$2" ]; then
63 base_file_out="$file_out"
64 fi
65
66 pandoc "$1" \ 46 pandoc "$1" \
67 -f markdown \ 47 -f markdown \
68 -t markdown \ 48 -t markdown \
49 --metadata content_dir="$CONTENT_DIR" \
69 --metadata output_dir="$OUTPUT_DIR" \ 50 --metadata output_dir="$OUTPUT_DIR" \
70 --metadata base_file_out="$base_file_out" \ 51 --metadata file_in="$1" \
71 --metadata file_out="$file_out" \
72 --metadata-file metadata/metadata.yaml \ 52 --metadata-file metadata/metadata.yaml \
73 --no-highlight \ 53 --no-highlight \
74 --lua-filter scripts/metadata_filter.lua 54 --lua-filter scripts/metadata_filter.lua
@@ -84,9 +64,7 @@ get_subpages_basedir() {
84} 64}
85 65
86get_subpages_metadata() { 66get_subpages_metadata() {
87 local base_file_in=$1 67 local base_dir_in=$(get_subpages_basedir "$1")
88 local base_file_out=$2
89 local base_dir_in=$(get_subpages_basedir "$base_file_in")
90 local child_pages=() 68 local child_pages=()
91 69
92 if [ -d "$base_dir_in" ]; then 70 if [ -d "$base_dir_in" ]; then
@@ -103,10 +81,10 @@ get_subpages_metadata() {
103 local pages="[]" 81 local pages="[]"
104 82
105 for file_in in "${child_pages[@]}"; do 83 for file_in in "${child_pages[@]}"; do
106 local content=$(get_content "$file_in" "$base_file_out" | sed -z 's/\\/\\\\/g;s/\n/\\n/g;s/"/\"/g') 84 local content=$(get_content "$file_in" | sed -z 's/\\/\\\\/g;s/\n/\\n/g;s/"/\"/g')
107 85
108 local metadata=$(get_metadata "$file_in" "$base_file_out" | jq "{ \ 86 local metadata=$(get_metadata "$file_in" | jq "{ \
109 url: .url, \ 87 file_out: .file_out, \
110 author: .author, \ 88 author: .author, \
111 title: .title, \ 89 title: .title, \
112 date: .date, \ 90 date: .date, \
@@ -122,19 +100,18 @@ get_subpages_metadata() {
122} 100}
123 101
124handle () { 102handle () {
125 local file_out=$(get_filename_out "$1") 103 if [ "${1#*.}" = "md" ]; then
104 local included_metadata=$(get_metadata "$1")
105 local file_out=$(echo "$included_metadata" | jq -r .file_out)
106 local create_feed=$(echo "$included_metadata" | jq -r .create_feed)
126 107
127 mkdir -p $(dirname "$file_out") 108 mkdir -p $(dirname "$file_out")
128 109
129 if [ "${1#*.}" = "md" ]; then
130 echo -e "\033[0;32m[COMPILE ]\033[0m $1 -> $file_out" 110 echo -e "\033[0;32m[COMPILE ]\033[0m $1 -> $file_out"
131 111
132 echo -e "\033[0;90m[COMPILE ]\033[0m Getting metadata" 112 echo -e "\033[0;90m[COMPILE ]\033[0m Getting subpages"
133
134 local included_metadata=$(get_metadata "$1")
135 local added_metadata=$(get_subpages_metadata "$1" "$file_out")
136 113
137 local create_feed=$(echo "$included_metadata" | jq -r .create_feed) 114 local added_metadata=$(get_subpages_metadata "$1")
138 115
139 local meta_file=$(mktemp) 116 local meta_file=$(mktemp)
140 117
@@ -143,16 +120,15 @@ handle () {
143 if [ "$create_feed" = "true" ]; then 120 if [ "$create_feed" = "true" ]; then
144 echo -e "\033[0;90m[COMPILE ]\033[0m Creating feed" 121 echo -e "\033[0;90m[COMPILE ]\033[0m Creating feed"
145 122
146 local feed_file_out="${file_out%.html}.xml"
147
148 pandoc "$1" \ 123 pandoc "$1" \
149 -f markdown \ 124 -f markdown \
150 -t html5 \ 125 -t html5 \
151 --no-highlight \ 126 --no-highlight \
152 --template "${TEMPLATES_DIR}feed.xml" \ 127 --template "${TEMPLATES_DIR}feed.xml" \
153 -o "$feed_file_out" \ 128 -o "${file_out%.html}.xml" \
129 --metadata content_dir="$CONTENT_DIR" \
154 --metadata output_dir="$OUTPUT_DIR" \ 130 --metadata output_dir="$OUTPUT_DIR" \
155 --metadata file_out="$feed_file_out" \ 131 --metadata file_in="$1" \
156 --metadata page_type=feed \ 132 --metadata page_type=feed \
157 --metadata-file metadata/metadata.yaml \ 133 --metadata-file metadata/metadata.yaml \
158 --metadata-file "$meta_file" \ 134 --metadata-file "$meta_file" \
@@ -167,8 +143,9 @@ handle () {
167 --no-highlight \ 143 --no-highlight \
168 --template "${TEMPLATES_DIR}base.html" \ 144 --template "${TEMPLATES_DIR}base.html" \
169 -o "$file_out" \ 145 -o "$file_out" \
146 --metadata content_dir="$CONTENT_DIR" \
170 --metadata output_dir="$OUTPUT_DIR" \ 147 --metadata output_dir="$OUTPUT_DIR" \
171 --metadata file_out="$file_out" \ 148 --metadata file_in="$1" \
172 --metadata-file metadata/metadata.yaml \ 149 --metadata-file metadata/metadata.yaml \
173 --metadata-file "$meta_file" \ 150 --metadata-file "$meta_file" \
174 --lua-filter scripts/metadata_filter.lua \ 151 --lua-filter scripts/metadata_filter.lua \
@@ -179,8 +156,9 @@ handle () {
179 # -t plain \ 156 # -t plain \
180 # --no-highlight \ 157 # --no-highlight \
181 # --template scripts/metadata_tpl.json \ 158 # --template scripts/metadata_tpl.json \
159 # --metadata content_dir="$CONTENT_DIR" \
182 # --metadata output_dir="$OUTPUT_DIR" \ 160 # --metadata output_dir="$OUTPUT_DIR" \
183 # --metadata file_out="$file_out" \ 161 # --metadata file_in="$1" \
184 # --metadata-file metadata/metadata.yaml \ 162 # --metadata-file metadata/metadata.yaml \
185 # --metadata-file "$meta_file" \ 163 # --metadata-file "$meta_file" \
186 # --lua-filter scripts/metadata_filter.lua \ 164 # --lua-filter scripts/metadata_filter.lua \
@@ -188,11 +166,12 @@ handle () {
188 166
189 rm "$meta_file" 167 rm "$meta_file"
190 168
191 # echo "$included_metadata"
192 # echo "$added_metadata"
193
194 echo -e "\033[0;90m[COMPILE ]\033[0m Done" 169 echo -e "\033[0;90m[COMPILE ]\033[0m Done"
195 else 170 else
171 local file_out=$(get_filename_out "$1")
172
173 mkdir -p $(dirname "$file_out")
174
196 echo -e "\033[0;32m[COPY ]\033[0m $1 -> $file_out" 175 echo -e "\033[0;32m[COPY ]\033[0m $1 -> $file_out"
197 176
198 cp "$1" "$file_out" 177 cp "$1" "$file_out"
diff --git a/scripts/metadata_filter.lua b/scripts/metadata_filter.lua
index 61fe90f..5ed5382 100644
--- a/scripts/metadata_filter.lua
+++ b/scripts/metadata_filter.lua
@@ -92,11 +92,33 @@ function relative_to(dir, target)
92 return path 92 return path
93end 93end
94 94
95function resolve_url(page_type, site_url, output_dir, base_dir_out, cur_file_out) 95function apply_path_rewrites(rewrites, str)
96 local abs = cur_file_out:gsub("^" .. output_dir, ""):gsub("/index.html$", 96 for i = 1, #rewrites.path do
97 "/") 97 local r = rewrites.path[i]
98 str = str:gsub(pandoc.utils.stringify(r.from),
99 pandoc.utils.stringify(r.to))
100 end
101 return str
102end
103
104function get_file_out(rewrites, content_dir, output_dir, file_in)
105 local file_out = file_in:gsub("^" .. content_dir, ""):gsub("%.md$", ".html")
106
107 if file_out:match(".html$") and not file_out:match("/index%.html$") then
108 file_out = file_out:gsub("/(.*)%.html$", "/%1/index.html")
109 end
110
111 file_out = apply_path_rewrites(rewrites, file_out)
112
113 return pandoc.MetaString(output_dir .. file_out)
114end
115
116function resolve_url(site_url, output_dir, ref_file, target_file)
117 local ref_base_dir = ref_file:gsub("^(.*)/.-$", "%1")
118 local abs = target_file:gsub("^" .. output_dir, ""):gsub("/index%.html$",
119 "/")
98 local rel = 120 local rel =
99 relative_to(base_dir_out, cur_file_out):gsub("/index.html$", "/") 121 relative_to(ref_base_dir, target_file):gsub("/index%.html$", "/")
100 122
101 return pandoc.MetaMap({ 123 return pandoc.MetaMap({
102 abs = pandoc.MetaString(abs), 124 abs = pandoc.MetaString(abs),
@@ -115,8 +137,9 @@ function resolve_layout(layout)
115 end 137 end
116end 138end
117 139
118function resolve_section(abs_url) 140function resolve_section(content_dir, file_in)
119 local section = abs_url:match("^/(.-)[/.]") or "index" 141 local section = file_in:gsub("^" .. content_dir, ""):match("^/(.-)[/.]") or
142 "index"
120 return pandoc.MetaMap({ 143 return pandoc.MetaMap({
121 id = pandoc.MetaString(section), 144 id = pandoc.MetaString(section),
122 ["is_" .. section] = pandoc.MetaBool(true) 145 ["is_" .. section] = pandoc.MetaBool(true)
@@ -133,13 +156,15 @@ function resolve_category(categories, category)
133 end 156 end
134end 157end
135 158
136function create_main_menu_state(section, main_menu) 159function prep_main_menu(rewrites, section, main_menu)
137 local active_item = nil 160 local active_item = nil
138 161
139 for i = 1, #main_menu do 162 for i = 1, #main_menu do
140 local item = main_menu[i] 163 local item = main_menu[i]
141 local active = pandoc.utils.stringify(item.id) == section.id 164 local active = pandoc.utils.stringify(item.id) == section.id
142 item.active = pandoc.MetaBool(active) 165 item.active = pandoc.MetaBool(active)
166 item.url = apply_path_rewrites(rewrites,
167 pandoc.utils.stringify(item.url))
143 if active then active_item = item end 168 if active then active_item = item end
144 end 169 end
145 170
@@ -151,7 +176,13 @@ function create_main_menu_state(section, main_menu)
151 }) 176 })
152end 177end
153 178
154function organize_subpages(pages) 179function organize_subpages(site_url, output_dir, ref_file, pages)
180 for i = 1, #pages do
181 local page = pages[i]
182 page.url = resolve_url(site_url, output_dir, ref_file,
183 pandoc.utils.stringify(page.file_out))
184 end
185
155 local grouped_pages = group_by(pages, function(p) return not p.date end) 186 local grouped_pages = group_by(pages, function(p) return not p.date end)
156 187
157 local pages_undated = grouped_pages[true] or pandoc.MetaList({}) 188 local pages_undated = grouped_pages[true] or pandoc.MetaList({})
@@ -201,13 +232,17 @@ function organize_subpages(pages)
201end 232end
202 233
203function Meta(meta) 234function Meta(meta)
235 meta.content_dir = meta.content_dir:gsub("/$", "")
204 meta.output_dir = meta.output_dir:gsub("/$", "") 236 meta.output_dir = meta.output_dir:gsub("/$", "")
205 meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "") 237 meta.site.url = pandoc.utils.stringify(meta.site.url):gsub("/$", "")
206 meta.base_file_out = meta.base_file_out or meta.file_out 238 meta.rewrites = meta.rewrites or
207 meta.base_dir_out = meta.base_file_out:gsub("^(.*)/.-$", "%1") 239 pandoc.MetaMap({path = pandoc.MetaList({})})
208 meta.page_type = meta.page_type or "page" 240 meta.page_type = meta.page_type or "page"
209
210 meta.layout = resolve_layout(meta.layout) 241 meta.layout = resolve_layout(meta.layout)
242 meta.section = resolve_section(meta.content_dir, meta.file_in)
243
244 meta.file_out = get_file_out(meta.rewrites, meta.content_dir,
245 meta.output_dir, meta.file_in)
211 246
212 meta.date = format_date(meta.date) 247 meta.date = format_date(meta.date)
213 if meta.last_update ~= nil then 248 if meta.last_update ~= nil then
@@ -216,26 +251,26 @@ function Meta(meta)
216 meta.last_update = meta.date 251 meta.last_update = meta.date
217 end 252 end
218 253
254 meta.category = resolve_category(meta.categories[meta.section.id],
255 meta.category)
256 meta.categories = nil
257
219 if meta.page_type == "feed" then 258 if meta.page_type == "feed" then
220 meta.page = pandoc.MetaMap({ 259 meta.page = pandoc.MetaMap({
221 url = resolve_url("page", meta.site.url, meta.output_dir, 260 url = resolve_url(meta.site.url, meta.output_dir, meta.file_out,
222 meta.base_dir_out, meta.file_out) 261 meta.file_out:gsub("%.xml$", ".html"))
223 }) 262 })
224 end 263 end
225 264
226 meta.url = resolve_url(meta.page_type, meta.site.url, meta.output_dir,
227 meta.base_dir_out, meta.file_out)
228 meta.section = resolve_section(meta.url.abs)
229 meta.category = resolve_category(meta.categories[meta.section.id],
230 meta.category)
231 meta.categories = nil
232
233 if meta.menus and meta.menus.main then 265 if meta.menus and meta.menus.main then
234 meta.menus.main = create_main_menu_state(meta.section, meta.menus.main) 266 meta.menus.main = prep_main_menu(meta.rewrites, meta.section,
267 meta.menus.main)
235 end 268 end
236 269
237 if meta.pages then 270 if meta.pages then
238 local pages, categories = organize_subpages(meta.pages) 271 local pages, categories = organize_subpages(meta.site.url,
272 meta.output_dir,
273 meta.file_out, meta.pages)
239 meta.pages = pages 274 meta.pages = pages
240 meta.categories = categories 275 meta.categories = categories
241 end 276 end
diff --git a/scripts/watch_content.sh b/scripts/watch_content.sh
index 92719d3..66b726f 100755
--- a/scripts/watch_content.sh
+++ b/scripts/watch_content.sh
@@ -10,7 +10,8 @@ inotifywait -qrme close_write,delete,move --format "%w%f" "${CONTENT_DIR%/}" \
10 | while read file 10 | while read file
11 do 11 do
12 if [ -f "$file" ]; then 12 if [ -f "$file" ]; then
13 scripts/build_content.sh "single" "$file" 13 # scripts/build_content.sh "single" "$file"
14 scripts/build_content.sh "all_md"
14 elif [ ! -d "$file" ]; then 15 elif [ ! -d "$file" ]; then
15 scripts/build_content.sh "delete" "$file" 16 scripts/build_content.sh "delete" "$file"
16 fi 17 fi
diff --git a/templates/layouts/page.html b/templates/layouts/page.html
index ee1a816..61bcacd 100644
--- a/templates/layouts/page.html
+++ b/templates/layouts/page.html
@@ -4,7 +4,11 @@
4 $if(menus.main.active)$ 4 $if(menus.main.active)$
5 <div class="c-page__prefixed c-page__prefixed--backref c-page__header__backlink"> 5 <div class="c-page__prefixed c-page__prefixed--backref c-page__header__backlink">
6 <a class="c-page__header__backlink__link" href="$menus.main.active.url$"> 6 <a class="c-page__header__backlink__link" href="$menus.main.active.url$">
7 $menus.main.active.label$ 7 $if(menus.main.active.label_long)$
8 $menus.main.active.label_long$
9 $else$
10 $menus.main.active.label$
11 $endif$
8 </a> 12 </a>
9 </div> 13 </div>
10 $endif$ 14 $endif$