diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml index 5f743f2a0..feb00e8d1 100644 --- a/.github/workflows/generate.yml +++ b/.github/workflows/generate.yml @@ -81,7 +81,7 @@ jobs: run: | cd work # Create html documents - make html + make -j4 html2 cd .. - name: Lock mutex diff --git a/Makefile b/Makefile index cf726c639..823424165 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,10 @@ +SRC_JAX := $(wildcard doc/*.jax vim_faq/*.jax) +OUT_JAX := $(addprefix target/html/doc/,$(notdir $(SRC_JAX))) +TAGS_JAX := target/html/doc/tags.jax +HTML := $(OUT_JAX:.jax=.html) $(TAGS_JAX:.jax=.html) + .PHONY: all check replace html clean +.PHONY: html2 tags all: @@ -15,5 +21,25 @@ html: cp doc/*.jax vim_faq/*.jax target/html/doc -cd target/html/doc ; vim -eu ../../../tools/buildhtml.vim -c "qall!" +html2: $(HTML) + +tags: $(TAGS_JAX) + +target/html/doc/%.jax: doc/%.jax + -@mkdir -p target/html/doc + cp $< $@ + +target/html/doc/%.jax: vim_faq/%.jax + -@mkdir -p target/html/doc + cp $< $@ + +$(TAGS_JAX): $(OUT_JAX) + rm -f $@ + -cd target/html/doc ; vim -eu ../../../tools/build_tag.vim -c "qall!" + +target/html/doc/%.html: target/html/doc/%.jax $(TAGS_JAX) + -@mkdir -p target/html/doc + -cd target/html/doc ; vim -eu ../../../tools/build_html.vim $(notdir $(:h/tag_aliases.vim +source :h/untranslated.vim +source :h/makehtml.vim + +let s:tools_dir = expand(':p:h') +let s:proj_dir = expand(':p:h:h') + +function! s:main() + " for the lastest help syntax + let &runtimepath = s:tools_dir . ',' . &runtimepath + " for ja custom syntax + let &runtimepath .= ',' . s:proj_dir + if argc() != 2 + echoerr "require two arguments" + finish + endif + call s:BuildHtml(argv(0), argv(1)) +endfunction + +function! s:BuildHtml(src, dst) + call MakeHtml2(a:src, a:dst, 1) + call s:ToJekyll(a:dst) +endfunction + +function! s:ToJekyll(file) + set nomodeline + execute "edit! " . a:file + set fileformat=unix + + let helpname = expand('%:t:r') + if helpname == 'index' + let helpname = 'help' + endif + + " remove header + silent 1,/^
/delete _ + " remove footer + silent /^
/,$delete _ + + " escape jekyll tags + silent %s/{\{2,}\|{%/{{ "\0" }}/ge + + " YAML front matter + call append(0, [ + \ '---', + \ 'layout: vimdoc', + \ printf("helpname: '%s'", helpname), + \ '---', + \ ]) + + update! +endfunction + +call s:main() diff --git a/tools/build_tag.vim b/tools/build_tag.vim new file mode 100644 index 000000000..2559d0561 --- /dev/null +++ b/tools/build_tag.vim @@ -0,0 +1,40 @@ +set nocompatible +set nomore +set encoding=utf-8 +set fileencodings=utf-8 +syntax on +colorscheme delek +let g:html_no_progress = 1 + +if has('windows') && !has('gui_running') + set t_ti= +endif + +enew! + +source :h/tag_aliases.vim +source :h/untranslated.vim +source :h/makehtml.vim + +let s:tools_dir = expand(':p:h') +let s:proj_dir = expand(':p:h:h') + +function! s:main() + " for the lastest help syntax + let &runtimepath = s:tools_dir . ',' . &runtimepath + " for ja custom syntax + let &runtimepath .= ',' . s:proj_dir + call s:BuildTag() +endfunction + +function! s:BuildTag() + " generate tags + try + helptags . + catch + echo v:exception + endtry + call MakeTagsFile() +endfunction + +call s:main() diff --git a/tools/makehtml.vim b/tools/makehtml.vim index 2d3f8fb9e..8c394dc27 100644 --- a/tools/makehtml.vim +++ b/tools/makehtml.vim @@ -38,6 +38,10 @@ function! MakeHtmlAll(...) endif endfunction +function! s:JsonName(lang) + return a:lang == "" ? "tags.json" : printf("tags-%s.json", a:lang) +endfunction + function! MakeTagsFile() let files = split(glob('tags'), '\n') let files += split(glob('tags-??'), '\n') @@ -50,7 +54,7 @@ function! MakeTagsFile() endif silent new `=fname` silent %delete _ - let tags = s:GetTags(lang) + let tags = s:LoadTags(lang) for tagname in sort(keys(tags)) if tagname == "help-tags" continue @@ -60,6 +64,8 @@ function! MakeTagsFile() call append('$', ' vim:ft=help:') silent 1delete _ silent wq! + " save JSON tag cache + call writefile([js_encode(tags)], s:JsonName(lang), "s") endfor endfunction @@ -216,26 +222,36 @@ endfunction function! s:GetTags(lang) if !exists("s:tags_" . a:lang) - let &l:tags = (a:lang == "") ? "./tags" : "./tags-" . a:lang - let tags = {} - for item in taglist(".*") - let item["html"] = s:HtmlName(item["filename"]) - let tags[item["name"]] = item - endfor - " for help-tags - let item = {} - let item["name"] = "help-tags" - if s:IsSingleMode() - let item["html"] = "tags.html" + " try to load JSON tag cache + let jsonname = s:JsonName(a:lang) + if filereadable(jsonname) + let s:tags_{a:lang} = js_decode(readfile(jsonname)[0]) else - let item["html"] = printf("tags%s.html", (a:lang == "") ? "" : "." . a:lang) + let s:tags_{a:lang} = s:LoadTags(a:lang) endif - let tags[item["name"]] = item - let s:tags_{a:lang} = tags endif return s:tags_{a:lang} endfunction +func s:LoadTags(lang) + let &l:tags = (a:lang == "") ? "./tags" : "./tags-" . a:lang + let tags = {} + for item in taglist(".*") + let item["html"] = s:HtmlName(item["filename"]) + let tags[item["name"]] = item + endfor + " for help-tags + let item = {} + let item["name"] = "help-tags" + if s:IsSingleMode() + let item["html"] = "tags.html" + else + let item["html"] = printf("tags%s.html", (a:lang == "") ? "" : "." . a:lang) + endif + let tags[item["name"]] = item + return tags +endfunction + function! s:IsSingleMode() " if there is one language files, do not append language identifier " (use "help.html" instead of "help.ab.html").