1c5f01b2fSopenharmony_ciSHELL=/usr/bin/env bash
2c5f01b2fSopenharmony_ciSED ?= $(shell which gsed 2>/dev/null || which sed)
3c5f01b2fSopenharmony_ci
4c5f01b2fSopenharmony_ciMKDOCS_PAGES=$(shell cd ../mkdocs/docs/ && find * -type f -name '*.md' | sort)
5c5f01b2fSopenharmony_ci
6c5f01b2fSopenharmony_ci.PHONY: all
7c5f01b2fSopenharmony_ciall: JSON_for_Modern_C++.tgz
8c5f01b2fSopenharmony_ci
9c5f01b2fSopenharmony_cidocSet.dsidx: docSet.sql
10c5f01b2fSopenharmony_ci	# generate index
11c5f01b2fSopenharmony_ci	sqlite3 docSet.dsidx <docSet.sql
12c5f01b2fSopenharmony_ci
13c5f01b2fSopenharmony_ciJSON_for_Modern_C++.docset: Info.plist docSet.dsidx
14c5f01b2fSopenharmony_ci	rm -fr JSON_for_Modern_C++.docset JSON_for_Modern_C++.tgz
15c5f01b2fSopenharmony_ci	mkdir -p JSON_for_Modern_C++.docset/Contents/Resources/Documents/
16c5f01b2fSopenharmony_ci	cp icon*.png JSON_for_Modern_C++.docset
17c5f01b2fSopenharmony_ci	cp Info.plist JSON_for_Modern_C++.docset/Contents
18c5f01b2fSopenharmony_ci	# build and copy documentation
19c5f01b2fSopenharmony_ci	$(MAKE) build -C ../mkdocs
20c5f01b2fSopenharmony_ci	cp -r ../mkdocs/site/* JSON_for_Modern_C++.docset/Contents/Resources/Documents
21c5f01b2fSopenharmony_ci	# patch CSS to hide navigation items
22c5f01b2fSopenharmony_ci	echo -e "\n\nheader, footer, nav.md-tabs, nav.md-tabs--active, div.md-sidebar--primary, a.md-content__button { display: none; }" >> "$$(ls JSON_for_Modern_C++.docset/Contents/Resources/Documents/assets/stylesheets/main.*.min.css)"
23c5f01b2fSopenharmony_ci	# fix spacing
24c5f01b2fSopenharmony_ci	echo -e "\n\ndiv.md-sidebar div.md-sidebar--secondary, div.md-main__inner { top: 0; margin-top: 0 }" >> "$$(ls JSON_for_Modern_C++.docset/Contents/Resources/Documents/assets/stylesheets/main.*.min.css)"
25c5f01b2fSopenharmony_ci	# remove "JSON for Modern C++" from page titles (fallback)
26c5f01b2fSopenharmony_ci	find JSON_for_Modern_C++.docset/Contents/Resources/Documents -type f -exec $(SED) -i 's| - JSON for Modern C++</title>|</title>|' {} +
27c5f01b2fSopenharmony_ci	# replace page titles with name from index, if available
28c5f01b2fSopenharmony_ci	for page in $(MKDOCS_PAGES); do \
29c5f01b2fSopenharmony_ci		case "$$page" in \
30c5f01b2fSopenharmony_ci			*/index.md) path=$${page/\/index.md/} ;; \
31c5f01b2fSopenharmony_ci			*)          path=$${page/.md/}        ;; \
32c5f01b2fSopenharmony_ci		esac; \
33c5f01b2fSopenharmony_ci		title=$$(sqlite3 docSet.dsidx "SELECT name FROM searchIndex WHERE path='$$path/index.html'" | tr '\n' ',' | $(SED) -e 's/,/, /g' -e 's/, $$/\n/'); \
34c5f01b2fSopenharmony_ci		if [ "x$$title" != "x" ]; then \
35c5f01b2fSopenharmony_ci			$(SED) -i "s%<title>.*</title>%<title>$$title</title>%" "JSON_for_Modern_C++.docset/Contents/Resources/Documents/$$path/index.html"; \
36c5f01b2fSopenharmony_ci		fi \
37c5f01b2fSopenharmony_ci	done
38c5f01b2fSopenharmony_ci	# clean up
39c5f01b2fSopenharmony_ci	rm JSON_for_Modern_C++.docset/Contents/Resources/Documents/sitemap.*
40c5f01b2fSopenharmony_ci	# copy index
41c5f01b2fSopenharmony_ci	cp docSet.dsidx JSON_for_Modern_C++.docset/Contents/Resources/
42c5f01b2fSopenharmony_ci
43c5f01b2fSopenharmony_ciJSON_for_Modern_C++.tgz: JSON_for_Modern_C++.docset
44c5f01b2fSopenharmony_ci	tar --exclude='.DS_Store' -cvzf JSON_for_Modern_C++.tgz JSON_for_Modern_C++.docset
45c5f01b2fSopenharmony_ci
46c5f01b2fSopenharmony_ci# install docset for Zeal documentation browser (https://zealdocs.org/)
47c5f01b2fSopenharmony_ci.PHONY: install_docset_zeal
48c5f01b2fSopenharmony_ciinstall_docset_zeal: JSON_for_Modern_C++.docset
49c5f01b2fSopenharmony_ci	docset_root=$${XDG_DATA_HOME:-$$HOME/.local/share}/Zeal/Zeal/docsets; \
50c5f01b2fSopenharmony_ci	rm -rf $$docset_root/JSON_for_Modern_C++.docset; \
51c5f01b2fSopenharmony_ci	mkdir -p $$docset_root; \
52c5f01b2fSopenharmony_ci	cp -r JSON_for_Modern_C++.docset $$docset_root/
53c5f01b2fSopenharmony_ci
54c5f01b2fSopenharmony_ci# list mkdocs pages missing from the docset index
55c5f01b2fSopenharmony_ci.PHONY: list_missing_pages
56c5f01b2fSopenharmony_cilist_missing_pages: docSet.dsidx
57c5f01b2fSopenharmony_ci	@for page in $(MKDOCS_PAGES); do \
58c5f01b2fSopenharmony_ci		case "$$page" in \
59c5f01b2fSopenharmony_ci			*/index.md) path=$${page/\/index.md/} ;; \
60c5f01b2fSopenharmony_ci			*)          path=$${page/.md/}        ;; \
61c5f01b2fSopenharmony_ci		esac; \
62c5f01b2fSopenharmony_ci		if [ "x$$page" != "xindex.md" -a "x$$(sqlite3 docSet.dsidx "SELECT COUNT(*) FROM searchIndex WHERE path='$$path/index.html'")" = "x0" ]; then \
63c5f01b2fSopenharmony_ci			echo $$page; \
64c5f01b2fSopenharmony_ci		fi \
65c5f01b2fSopenharmony_ci	done
66c5f01b2fSopenharmony_ci
67c5f01b2fSopenharmony_ci# list paths in the docset index without a corresponding mkdocs page
68c5f01b2fSopenharmony_ci.PHONY: list_removed_paths
69c5f01b2fSopenharmony_cilist_removed_paths: docSet.dsidx
70c5f01b2fSopenharmony_ci	@for path in $$(sqlite3 docSet.dsidx "SELECT path FROM searchIndex"); do \
71c5f01b2fSopenharmony_ci		page=$${path/\/index.html/.md}; \
72c5f01b2fSopenharmony_ci		page_index=$${path/index.html/index.md}; \
73c5f01b2fSopenharmony_ci		page_found=0; \
74c5f01b2fSopenharmony_ci		for p in $(MKDOCS_PAGES); do \
75c5f01b2fSopenharmony_ci			if [ "x$$p" = "x$$page" -o "x$$p" = "x$$page_index" ]; then \
76c5f01b2fSopenharmony_ci				page_found=1; \
77c5f01b2fSopenharmony_ci			fi \
78c5f01b2fSopenharmony_ci		done; \
79c5f01b2fSopenharmony_ci		if [ "x$$page_found" = "x0" ]; then \
80c5f01b2fSopenharmony_ci			echo $$path; \
81c5f01b2fSopenharmony_ci		fi \
82c5f01b2fSopenharmony_ci	done
83c5f01b2fSopenharmony_ci
84c5f01b2fSopenharmony_ci.PHONY: clean
85c5f01b2fSopenharmony_ciclean:
86c5f01b2fSopenharmony_ci	rm -f docSet.dsidx
87c5f01b2fSopenharmony_ci	rm -fr JSON_for_Modern_C++.docset JSON_for_Modern_C++.tgz
88