mirror of
https://github.com/ldericher/autodoc.git
synced 2025-12-06 15:43:01 +00:00
Compare commits
52 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0612070b66 | |||
| 778e2d79d7 | |||
| 2298ab3365 | |||
| 8375be93c6 | |||
| 5ac0d47553 | |||
| b7e1f15406 | |||
| eda145186d | |||
| c8931beff6 | |||
| a0ee58674a | |||
| e91526f326 | |||
| b5537a78af | |||
| df42f0965d | |||
| 4d4b418e63 | |||
| 5119a9596b | |||
| 2aa936e917 | |||
| 5b8786fb33 | |||
| 91699e95ca | |||
| f3219e9477 | |||
| dd96c4852b | |||
| bca8809396 | |||
| bbec02ddcc | |||
| 49fe0ebda0 | |||
| e485a4fe67 | |||
| 667b3fde95 | |||
| 7009b2f634 | |||
| 9128c11796 | |||
| ebabff7725 | |||
| ea086a6a3a | |||
| 5ee2197f18 | |||
| da0c61dd92 | |||
| 7cc5d4a2c4 | |||
| 9103180c36 | |||
| b2d93d7283 | |||
| b67d392fff | |||
| c8228dd312 | |||
| f3421123af | |||
| 1d6ee3bb79 | |||
| d48fa8563e | |||
| e47e37de4e | |||
| e32e0b2ce9 | |||
| 4d7f1b14c3 | |||
| 0a1abf90a7 | |||
| e309f12ea8 | |||
| e0e51d4b8d | |||
| 18958c3448 | |||
| 56db54e11a | |||
| 661e94aa13 | |||
| 0022106d97 | |||
| 76aa31c0c6 | |||
| 078cafdc39 | |||
| 1c8ef992f1 | |||
| f9d0075f12 |
26 changed files with 565 additions and 190 deletions
35
.drone.yml
Normal file
35
.drone.yml
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: default
|
||||
image: plugins/docker
|
||||
settings:
|
||||
repo: ldericher/autodoc
|
||||
username:
|
||||
from_secret: DOCKER_USERNAME
|
||||
password:
|
||||
from_secret: DOCKER_PASSWORD
|
||||
auto_tag: true
|
||||
dockerfile: Dockerfile.alpine
|
||||
target: stage-base
|
||||
|
||||
- name: diagram
|
||||
image: plugins/docker
|
||||
settings:
|
||||
repo: ldericher/autodoc
|
||||
username:
|
||||
from_secret: DOCKER_USERNAME
|
||||
password:
|
||||
from_secret: DOCKER_PASSWORD
|
||||
auto_tag: true
|
||||
auto_tag_suffix: diagram
|
||||
dockerfile: Dockerfile.ubuntu
|
||||
target: stage-diagram
|
||||
|
||||
- name: parallelism provider
|
||||
image: alpine
|
||||
depends_on:
|
||||
- default
|
||||
- diagram
|
||||
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
*.icc filter=lfs diff=lfs merge=lfs -text
|
||||
57
Dockerfile.alpine
Normal file
57
Dockerfile.alpine
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
FROM pandoc/extra:latest AS stage-base
|
||||
|
||||
RUN set -ex; \
|
||||
\
|
||||
apk add --no-cache \
|
||||
bash \
|
||||
ghostscript \
|
||||
inotify-tools \
|
||||
make \
|
||||
patch \
|
||||
; \
|
||||
\
|
||||
tlmgr update --self; \
|
||||
\
|
||||
tlmgr install \
|
||||
kpfonts \
|
||||
lastpage \
|
||||
latexmk \
|
||||
twemojis \
|
||||
;
|
||||
|
||||
COPY src/usr /usr
|
||||
|
||||
RUN set -ex; \
|
||||
\
|
||||
cp /usr/share/ghostscript/lib/PDFA_def.ps /usr/local/share/autodoc/; \
|
||||
patch -d /usr/local/share/autodoc < /usr/local/share/autodoc/PDFA_def.ps.patch; \
|
||||
rm /usr/local/share/autodoc/PDFA_def.ps.patch;
|
||||
|
||||
WORKDIR /docs
|
||||
ENTRYPOINT ["autodoc"]
|
||||
CMD ["-bw"]
|
||||
|
||||
FROM stage-base AS stage-diagram
|
||||
|
||||
ENV PUPPETEER_CACHE_DIR="/usr/local/share/puppeteer/cache" \
|
||||
PUPPETEER_EXECUTABLE_PATH="/usr/bin/chromium-browser" \
|
||||
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"
|
||||
|
||||
COPY src/diagram.lua.patch /usr/local/src/autodoc/diagram.lua.patch
|
||||
|
||||
RUN set -ex; \
|
||||
\
|
||||
apk add --no-cache \
|
||||
chromium \
|
||||
npm \
|
||||
; \
|
||||
\
|
||||
npm install --global @mermaid-js/mermaid-cli; \
|
||||
# rm -rf /root/.cache/puppeteer; \
|
||||
\
|
||||
wget \
|
||||
--output-document='/usr/local/share/pandoc/filters/diagram.lua' \
|
||||
'https://raw.githubusercontent.com/pandoc-ext/diagram/refs/heads/main/_extensions/diagram/diagram.lua' \
|
||||
; \
|
||||
patch /usr/local/share/pandoc/filters/diagram.lua < /usr/local/src/autodoc/diagram.lua.patch; \
|
||||
rm /usr/local/src/autodoc/diagram.lua.patch;
|
||||
64
Dockerfile.ubuntu
Normal file
64
Dockerfile.ubuntu
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
FROM pandoc/extra:latest-ubuntu AS stage-base
|
||||
|
||||
RUN set -ex; \
|
||||
\
|
||||
deluser --remove-home ubuntu; \
|
||||
\
|
||||
apt-get update; apt-get install --no-install-recommends --yes \
|
||||
ghostscript \
|
||||
inotify-tools \
|
||||
make \
|
||||
patch \
|
||||
; rm -rf /var/lib/apt/lists/*; \
|
||||
\
|
||||
tlmgr update --self; \
|
||||
\
|
||||
tlmgr install \
|
||||
kpfonts \
|
||||
lastpage \
|
||||
latexmk \
|
||||
twemojis \
|
||||
;
|
||||
|
||||
COPY src/usr /usr
|
||||
|
||||
RUN set -ex; \
|
||||
\
|
||||
cp /usr/share/ghostscript/10.02.1/lib/PDFA_def.ps /usr/local/share/autodoc/; \
|
||||
patch -d /usr/local/share/autodoc < /usr/local/share/autodoc/PDFA_def.ps.patch; \
|
||||
rm /usr/local/share/autodoc/PDFA_def.ps.patch;
|
||||
|
||||
WORKDIR /docs
|
||||
ENTRYPOINT ["autodoc"]
|
||||
CMD ["-bw"]
|
||||
|
||||
FROM stage-base AS stage-diagram
|
||||
|
||||
ENV PUPPETEER_CACHE_DIR="/usr/local/share/puppeteer/cache"
|
||||
|
||||
COPY src/diagram.lua.patch /usr/local/src/autodoc/diagram.lua.patch
|
||||
|
||||
RUN set -ex; \
|
||||
\
|
||||
apt-get update; apt-get install --no-install-recommends --yes \
|
||||
libasound2t64 \
|
||||
libatk1.0-0t64 \
|
||||
libatk-bridge2.0-0t64 \
|
||||
libgbm1 \
|
||||
libnss3 \
|
||||
libxcomposite1 \
|
||||
libxdamage1 \
|
||||
libxfixes3 \
|
||||
libxkbcommon0 \
|
||||
libxrandr2 \
|
||||
npm \
|
||||
; rm -rf /var/lib/apt/lists/*; \
|
||||
\
|
||||
npm install --global @mermaid-js/mermaid-cli; \
|
||||
\
|
||||
wget \
|
||||
--output-document='/usr/local/share/pandoc/filters/diagram.lua' \
|
||||
'https://raw.githubusercontent.com/pandoc-ext/diagram/refs/heads/main/_extensions/diagram/diagram.lua' \
|
||||
; \
|
||||
patch /usr/local/share/pandoc/filters/diagram.lua < /usr/local/src/autodoc/diagram.lua.patch; \
|
||||
rm /usr/local/src/autodoc/diagram.lua.patch;
|
||||
|
|
@ -1,12 +1,14 @@
|
|||
# autodoc
|
||||
|
||||
[](https://github.drone.yavook.de/ldericher/autodoc)
|
||||
|
||||
[`autodoc`](https://github.com/ldericher/autodoc) is a simple [CI](https://en.wikipedia.org/wiki/Continuous_integration) system optimized for document creation.
|
||||
|
||||
In general, any file-sharing solution -- preferably on top of `docker-compose` -- can be made into an automatic document distribution system by adding an `autodoc` instance.
|
||||
|
||||
## Quick Start Guide using Docker
|
||||
|
||||
The `autodoc` image [available on Docker Hub](https://hub.docker.com/r/ldericher/autodoc) is based on [pandocker](https://hub.docker.com/r/ldericher/pandocker) providing Ubuntu's TeXlive `LaTeX` and `pandoc` in a simple box.
|
||||
The `autodoc` image [available on Docker Hub](https://hub.docker.com/r/ldericher/autodoc) is based on [pandoc/extra](https://hub.docker.com/r/pandoc/extra) providing TeXlive `LaTeX` and `pandoc` in a container.
|
||||
|
||||
01. Install [Docker CE](https://docs.docker.com/install/)
|
||||
|
||||
|
|
@ -16,7 +18,7 @@ The `autodoc` image [available on Docker Hub](https://hub.docker.com/r/ldericher
|
|||
|
||||
```bash
|
||||
docker run --rm -it \
|
||||
--volume "${PWD}":/docs \
|
||||
--volume "${PWD}:/docs" \
|
||||
--user "$(id -u):$(id -g)" \
|
||||
ldericher/autodoc
|
||||
```
|
||||
|
|
@ -56,7 +58,6 @@ services:
|
|||
- documents:/opt/autodoc
|
||||
|
||||
autodoc:
|
||||
restart: always
|
||||
image: ldericher/autodoc
|
||||
user: "UID:GID"
|
||||
volumes:
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
FROM ldericher/pandocker:latest
|
||||
|
||||
RUN apt-get update && apt-get -y install \
|
||||
inotify-tools \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY usr /usr
|
||||
|
||||
CMD ["autodoc"]
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# hard globals
|
||||
#
|
||||
|
||||
g_bin="$(readlink -f "$(which "$0")")"
|
||||
g_lib=${g_bin/"bin"/"lib"}
|
||||
declare -a g_build_systems
|
||||
declare -A g_build_systems_glob
|
||||
|
||||
#
|
||||
# load base program
|
||||
#
|
||||
|
||||
source "${g_lib}/globals"
|
||||
source "${g_lib}/logging"
|
||||
source "${g_lib}/plugins/"*".sh"
|
||||
source "${g_lib}/handle_inotify"
|
||||
|
||||
#
|
||||
# MAIN
|
||||
#
|
||||
|
||||
echo "Booting '${g_bin}' in '${g_watchroot}'."
|
||||
# setup inotify:
|
||||
# -mrq monitor, recursive, quiet
|
||||
# -e events
|
||||
# --format %e eventlist csv, %w workdir, %f filename
|
||||
inotifywait -mrq \
|
||||
-e create -e delete -e moved_to -e close_write \
|
||||
--format '%e %w%f' \
|
||||
"${g_watchroot}" | \
|
||||
\
|
||||
while read NOTIFICATION; do
|
||||
do_handle ${NOTIFICATION}
|
||||
done
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $WATCHROOT (default: ".")
|
||||
g_watchroot="$(readlink -f "${1:-.}")"
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# process an inotify event
|
||||
do_handle() { # $FLAGS $OBJECT
|
||||
# extract params
|
||||
local flags="$1"
|
||||
shift 1
|
||||
local dir="$(dirname "$*")"
|
||||
local object="$(basename "$*")"
|
||||
|
||||
if [[ "${flags}" =~ "ISDIR" ]]; then
|
||||
# object refers to directory
|
||||
local dir="${dir}/${object}"
|
||||
local object="."
|
||||
fi
|
||||
|
||||
# start using toolchain
|
||||
logline_append "'${object}': '${flags}' in '${dir}'."
|
||||
do_compile "${dir}" "${object}"
|
||||
logline_flush
|
||||
}
|
||||
|
||||
# compile an OBJECT using build instructions found in DIRectory
|
||||
do_compile() { # $DIR $OBJECT $DONE
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local object="$2"
|
||||
local done="${3:-0}"
|
||||
|
||||
# build systems
|
||||
for build_system in ${g_build_systems[@]}; do
|
||||
do_build_system "${dir}" "${object}" "${build_system}" \
|
||||
&& local done="1"
|
||||
done
|
||||
|
||||
# never leave $g_watchroot
|
||||
if [ "${dir}" != "${g_watchroot}" ]; then
|
||||
# search parent dir for more build instructions
|
||||
do_compile "$(dirname "${dir}")" "${object}" "${done}"
|
||||
|
||||
elif [ "${done}" == "0" ]; then
|
||||
# hit $g_watchroot
|
||||
logline_append "Not a source file."
|
||||
fi
|
||||
}
|
||||
|
||||
# use given BUILD_SYSTEM to process an OBJECT from a DIRectory
|
||||
do_build_system() { # $DIR $OBJECT $BUILD_SYSTEM
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local object="$2"
|
||||
local build_system="$3"
|
||||
|
||||
# not done yet
|
||||
local result=1
|
||||
|
||||
# get glob pattern for plugin
|
||||
for glob in ${g_build_systems_glob[${build_system}]}; do
|
||||
# match glob in directory
|
||||
for file in "${dir}"/${glob}; do
|
||||
# check file readability
|
||||
if [ -r "${file}" ]; then
|
||||
# actually call into build system
|
||||
logline_append "Found '${file}':"
|
||||
do_${build_system} "${dir}" "${object}" "$(basename "${file}")" \
|
||||
&& local result=0
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
return ${result}
|
||||
}
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# plugin name
|
||||
g_build_systems+=(make)
|
||||
|
||||
# build instruction file globs for this plugin
|
||||
g_build_systems_glob[make]="Makefile *.mk"
|
||||
|
||||
# compile using bare make command
|
||||
do_make() { # $DIR $OBJECT $MAKEFILE
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local object="$2"
|
||||
local makefile="$3"
|
||||
|
||||
# check Makefile 'source pattern'
|
||||
local srcpat="$(grep -E "^#%SRCPAT%" "${dir}/${makefile}" | tail -n 1 | sed -r "s/^#%SRCPAT%\s+//")"
|
||||
|
||||
if [ -z "${srcpat}" ]; then
|
||||
logline_append "Empty source pattern, check '#%SRCPAT%' annotation!"
|
||||
return 1
|
||||
|
||||
elif [[ "${object}" =~ ${srcpat} ]]; then
|
||||
# check for autodoc target
|
||||
local target="$(grep -E "^autodoc:" "${dir}/${makefile}" | sed -r "s/:.*$//")"
|
||||
|
||||
if [ -z "${target}" ]; then
|
||||
logline_append "Running 'make'!"
|
||||
else
|
||||
logline_append "Making '${target}'!"
|
||||
fi
|
||||
|
||||
# actually run "make" and save (truncated) output
|
||||
local makelog="$(make --no-print-directory -C "${dir}" -f "${makefile}" -j ${target})"
|
||||
logline_append "$(echo "${makelog}" | head -n 10 | sed 's/$/;/g' | tr '\n' ' ' | sed 's/ *$//')"
|
||||
|
||||
logline_append "Done."
|
||||
|
||||
else
|
||||
logline_append "SRCPAT '${srcpat}' mismatch."
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
version: "2"
|
||||
|
||||
volumes:
|
||||
phyLinux-home:
|
||||
|
||||
services:
|
||||
autodoc:
|
||||
restart: "no"
|
||||
|
||||
image: ldericher/autodoc
|
||||
build:
|
||||
context: ./build
|
||||
|
||||
command: "bash"
|
||||
|
||||
volumes:
|
||||
- "${PWD}/build/usr/local/bin/autodoc:/usr/local/bin/autodoc:ro"
|
||||
- "${PWD}/build/usr/local/lib/autodoc:/usr/local/lib/autodoc:ro"
|
||||
- "${PWD}/examples:/docs"
|
||||
1
examples/eisvogel/.gitignore
vendored
Normal file
1
examples/eisvogel/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
*.pdf
|
||||
8
examples/eisvogel/Makefile
Normal file
8
examples/eisvogel/Makefile
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#%SRCPAT% \.url$
|
||||
|
||||
.PHONY: all
|
||||
all: eisvogel.pdf
|
||||
|
||||
.PHONY: eisvogel.pdf
|
||||
eisvogel.pdf: document.md.url
|
||||
wget -O- '$(file < $<)' | pandoc -s -f markdown -t latex -o $@ --template eisvogel
|
||||
1
examples/eisvogel/document.md.url
Normal file
1
examples/eisvogel/document.md.url
Normal file
|
|
@ -0,0 +1 @@
|
|||
https://raw.githubusercontent.com/Wandmalfarbe/pandoc-latex-template/master/examples/basic-example/document.md
|
||||
|
|
@ -15,7 +15,7 @@ Behold, for there is jumbled mess ahead!
|
|||
|
||||
With the default HTML template, this does not translate: \textsl{Have some \LaTeX, too!}
|
||||
Some math is fine with HTML: $x=5$, some other is not: $\sqrt{x}=2$.
|
||||
However, both of these are fixable!
|
||||
However, both of these work with the `--webtex` switch for pandoc!
|
||||
|
||||
Code blocks? Sure!
|
||||
|
||||
|
|
|
|||
11
src/diagram.lua.patch
Normal file
11
src/diagram.lua.patch
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
--- diagram.lua
|
||||
+++ diagram.lua
|
||||
@@ -158,7 +158,7 @@
|
||||
write_file(infile, code)
|
||||
pipe(
|
||||
self.execpath or 'mmdc',
|
||||
- {"--pdfFit", "--input", infile, "--output", outfile},
|
||||
+ {"--pdfFit", "--puppeteerConfigFile", "/usr/local/share/puppeteer/config.json", "--input", infile, "--output", outfile},
|
||||
''
|
||||
)
|
||||
return read_file(outfile), mime_type
|
||||
45
src/usr/local/bin/autodoc
Executable file
45
src/usr/local/bin/autodoc
Executable file
|
|
@ -0,0 +1,45 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# hard globals
|
||||
#
|
||||
|
||||
g_bin="$(readlink -f "$(which "$0")")"
|
||||
g_lib=${g_bin/"bin"/"lib"}
|
||||
|
||||
#
|
||||
# load base program
|
||||
#
|
||||
|
||||
source "${g_lib}/globals"
|
||||
source "${g_lib}/logging"
|
||||
source "${g_lib}/main"
|
||||
|
||||
for plugin in "${g_lib}/plugins/"*".sh"; do
|
||||
source "${plugin}"
|
||||
done
|
||||
|
||||
#
|
||||
# MAIN
|
||||
#
|
||||
|
||||
# show debug info
|
||||
if [ ${g_verbose} -eq 1 ]; then
|
||||
logline_append "Variables:"
|
||||
logline_append "build:${g_build}"
|
||||
logline_append "watch:${g_watch}"
|
||||
logline_append "root:${g_root}"
|
||||
logline_flush
|
||||
fi
|
||||
|
||||
if [ ${g_build} -eq 1 ]; then
|
||||
echo "Building everything in '${g_root}'."
|
||||
do_build_all
|
||||
fi
|
||||
|
||||
if [ ${g_watch} -eq 1 ]; then
|
||||
echo "Watching '${g_root}'."
|
||||
do_build_watch
|
||||
fi
|
||||
|
||||
echo "Done."
|
||||
68
src/usr/local/lib/autodoc/globals
Normal file
68
src/usr/local/lib/autodoc/globals
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
#!/bin/bash
|
||||
|
||||
# array of available build systems
|
||||
declare -a g_build_systems
|
||||
|
||||
# map of file globs for build systems
|
||||
declare -A g_build_systems_glob
|
||||
|
||||
# map of annotation patterns for build systems
|
||||
declare -A g_build_systems_annotations
|
||||
|
||||
# simple help page
|
||||
do_show_help() {
|
||||
echo "Usage: ${0} [-h?bwv] [-r ROOT] [ROOT]"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -h, -? Show this help and exit"
|
||||
echo " -b Build ROOT directory on startup"
|
||||
echo " -w Keep watching ROOT directory for changes"
|
||||
echo " -v Verbose output"
|
||||
echo " -r ROOT Set ROOT directory"
|
||||
echo
|
||||
echo "ROOT directory can be set via '-r' argument or positionally."
|
||||
echo "If ROOT directory is undefined, it defaults to the current working directory."
|
||||
exit 0
|
||||
}
|
||||
|
||||
# reset in case getopts has been used previously in the shell
|
||||
OPTIND=1
|
||||
|
||||
# initialize variables
|
||||
g_build=0
|
||||
g_watch=0
|
||||
g_verbose=0
|
||||
g_root=""
|
||||
|
||||
while getopts "h?bwvr:" opt; do
|
||||
case "$opt" in
|
||||
h|\?)
|
||||
do_show_help
|
||||
;;
|
||||
b)
|
||||
g_build=1
|
||||
;;
|
||||
w)
|
||||
g_watch=1
|
||||
;;
|
||||
v)
|
||||
g_verbose=1
|
||||
;;
|
||||
r)
|
||||
g_root="${OPTARG}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# default to help
|
||||
[ ${g_build} -eq 0 ] && [ ${g_watch} -eq 0 ] && [ ${g_verbose} -eq 0 ] && do_show_help
|
||||
|
||||
# shift off getopts parsed options
|
||||
shift $((OPTIND-1))
|
||||
[ "${1:-}" = "--" ] && shift
|
||||
|
||||
# if g_root undefined by getopt,
|
||||
[ -z "${g_root:-}" ] && g_root="$1"
|
||||
|
||||
# get actual $ROOT directory (default: ".")
|
||||
g_root="$(readlink -f "${g_root:-.}")"
|
||||
146
src/usr/local/lib/autodoc/main
Normal file
146
src/usr/local/lib/autodoc/main
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
#!/bin/bash
|
||||
|
||||
# process an inotify event
|
||||
do_handle_inotify() { # $FLAGS $OBJECT
|
||||
# extract params
|
||||
local flags="$1"
|
||||
shift 1
|
||||
local dir="$(dirname "$*")"
|
||||
local object="$(basename "$*")"
|
||||
|
||||
if [[ "${flags}" =~ "ISDIR" ]]; then
|
||||
# object refers to directory
|
||||
local dir="${dir}/${object}"
|
||||
local object="."
|
||||
fi
|
||||
|
||||
# start using toolchain
|
||||
logline_append "'${object}': '${flags}' in '${dir}'."
|
||||
do_compile "${dir}" "${object}"
|
||||
logline_flush
|
||||
}
|
||||
|
||||
# compile an OBJECT using build instructions found in DIRectory
|
||||
do_compile() { # $DIR $OBJECT $DONE
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local object="$2"
|
||||
local done="${3:-0}"
|
||||
|
||||
# build systems
|
||||
for build_system in ${g_build_systems[@]}; do
|
||||
do_build_system "${dir}" "${build_system}" "${object}" \
|
||||
&& local done="1"
|
||||
done
|
||||
|
||||
# never leave $g_root
|
||||
if [ "${dir}" != "${g_root}" ]; then
|
||||
# search parent dir for more build instructions
|
||||
do_compile "$(dirname "${dir}")" "${object}" "${done}"
|
||||
|
||||
elif [ "${done}" == "0" ]; then
|
||||
# hit $g_root
|
||||
logline_append "Not a source file."
|
||||
fi
|
||||
}
|
||||
|
||||
# check if defined source pattern matches OBJECT
|
||||
do_check_srcpat() { # $DIR $BUILD_DESC $ANNOTATION $OBJECT
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local build_desc="$2"
|
||||
local annotation="$3"
|
||||
local object="$4"
|
||||
|
||||
# check 'source pattern'
|
||||
local srcpat="$(grep -E "^${annotation}" "${dir}/${build_desc}" | tail -n 1 | sed -r "s/^${annotation}\s+//")"
|
||||
|
||||
if [ -z "${srcpat}" ]; then
|
||||
# empty srcpat => fail
|
||||
logline_append "Empty source pattern, check for '${annotation}' annotation!"
|
||||
return 1
|
||||
|
||||
elif [ -z "${object}" ]; then
|
||||
# empty object = "no specific object" => success
|
||||
return 0
|
||||
|
||||
elif [[ "${object}" =~ ${srcpat} ]]; then
|
||||
# nonempty object matches srcpat => success
|
||||
return 0
|
||||
|
||||
else
|
||||
# nonempty object does not match srcpat => fail
|
||||
logline_append "SRCPAT '${srcpat}' mismatch."
|
||||
return 1
|
||||
|
||||
fi
|
||||
}
|
||||
|
||||
# use given BUILD_SYSTEM to process an OBJECT from a DIRectory
|
||||
do_build_system() { # $DIR $BUILD_SYSTEM $OBJECT
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local build_system="$2"
|
||||
local object="$3"
|
||||
|
||||
# not done yet
|
||||
local result=1
|
||||
|
||||
# get glob patterns for plugin
|
||||
for glob in ${g_build_systems_glob[${build_system}]}; do
|
||||
# match each glob in directory
|
||||
for file in "${dir}"/${glob}; do
|
||||
# check file readability
|
||||
if [ -r "${file}" ]; then
|
||||
# actually call into build system
|
||||
logline_append "Found '${file}':"
|
||||
|
||||
local file="$(basename "${file}")"
|
||||
do_${build_system} "${dir}" "${file}" "${object}" \
|
||||
&& local result=0
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
return ${result}
|
||||
}
|
||||
|
||||
# force build using all systems
|
||||
do_build_all() { #
|
||||
# build systems
|
||||
for build_system in ${g_build_systems[@]}; do
|
||||
echo "Build system '${build_system}'."
|
||||
for glob in ${g_build_systems_glob[${build_system}]}; do
|
||||
|
||||
# match each glob recursively
|
||||
find "${g_root}" -iname "${glob}" | \
|
||||
while read file; do
|
||||
if [ -r "${file}" ]; then
|
||||
# force call into build system
|
||||
logline_append "Found '${file}':"
|
||||
|
||||
local dir="$(dirname "${file}")"
|
||||
local file="$(basename "${file}")"
|
||||
do_${build_system}_all "${dir}" "$(basename "${file}")"
|
||||
|
||||
logline_flush
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
do_build_watch() { #
|
||||
# setup inotify:
|
||||
# -mrq monitor, recursive, quiet
|
||||
# -e events
|
||||
# --format %e eventlist csv, %w workdir, %f filename
|
||||
inotifywait -mrq \
|
||||
-e create -e delete -e moved_to -e close_write \
|
||||
--format '%e %w%f' \
|
||||
"${g_root}" | \
|
||||
\
|
||||
while read NOTIFICATION; do
|
||||
do_handle_inotify ${NOTIFICATION}
|
||||
done
|
||||
}
|
||||
57
src/usr/local/lib/autodoc/plugins/make.sh
Normal file
57
src/usr/local/lib/autodoc/plugins/make.sh
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
#!/bin/bash
|
||||
|
||||
# plugin name
|
||||
g_build_systems+=(make)
|
||||
|
||||
# build instruction file globs for this plugin
|
||||
g_build_systems_glob[make]="Makefile *.mk"
|
||||
|
||||
# srcpat annotation prefix for this plugin
|
||||
g_build_systems_annotations[make]='#%SRCPAT%'
|
||||
|
||||
# try to compile file OBJECT
|
||||
do_make() { # $DIR $OBJECT $MAKEFILE
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local makefile="$2"
|
||||
local object="$3"
|
||||
|
||||
# only run if "object" is source file
|
||||
if do_check_srcpat "${dir}" "${makefile}" "${g_build_systems_annotations[make]}" "${object}"; then
|
||||
do_run_make "${dir}" "${makefile}"
|
||||
fi
|
||||
}
|
||||
|
||||
# try running make for MAKEFILE inside DIRectory
|
||||
do_make_all() { # $DIR $MAKEFILE
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local makefile="$2"
|
||||
|
||||
# only run if "makefile" is relevant for autodoc
|
||||
if do_check_srcpat "${dir}" "${makefile}" "${g_build_systems_annotations[make]}" ""; then
|
||||
do_run_make "${dir}" "${makefile}"
|
||||
fi
|
||||
}
|
||||
|
||||
# actually run GNU Make with MAKEFILE inside DIRectory
|
||||
do_run_make() { # $DIR $MAKEFILE
|
||||
# extract params
|
||||
local dir="$1"
|
||||
local makefile="$2"
|
||||
|
||||
# check for autodoc target
|
||||
local target="$(grep -E "^autodoc:" "${dir}/${makefile}" | sed -r "s/:.*$//")"
|
||||
|
||||
if [ -z "${target}" ]; then
|
||||
logline_append "Running 'make'!"
|
||||
else
|
||||
logline_append "Making '${target}'!"
|
||||
fi
|
||||
|
||||
# actually run "make" and save (truncated) output
|
||||
local makelog="$(make --no-print-directory -C "${dir}" -f "${makefile}" -j ${target})"
|
||||
logline_append "$(echo "${makelog}" | head -n 10 | sed 's/$/;/g' | tr '\n' ' ' | sed 's/ *$//')"
|
||||
|
||||
logline_append "Done."
|
||||
}
|
||||
11
src/usr/local/share/autodoc/PDFA_def.ps.patch
Normal file
11
src/usr/local/share/autodoc/PDFA_def.ps.patch
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
--- PDFA_def.ps
|
||||
+++ PDFA_def.ps
|
||||
@@ -9,7 +9,7 @@
|
||||
/DOCINFO pdfmark
|
||||
|
||||
% Define an ICC profile :
|
||||
-/ICCProfile (srgb.icc) % Customise
|
||||
+/ICCProfile (/usr/local/share/autodoc/sRGB.icc) % Customise
|
||||
def
|
||||
|
||||
[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark
|
||||
BIN
src/usr/local/share/autodoc/compatibleWithAdobeRGB1998.icc
(Stored with Git LFS)
Normal file
BIN
src/usr/local/share/autodoc/compatibleWithAdobeRGB1998.icc
(Stored with Git LFS)
Normal file
Binary file not shown.
46
src/usr/local/share/autodoc/pdftools.mk
Normal file
46
src/usr/local/share/autodoc/pdftools.mk
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
#############
|
||||
# FUNCTIONS #
|
||||
#############
|
||||
|
||||
PDFTOOLS_GSFLAGS := \
|
||||
-sDEVICE=pdfwrite \
|
||||
-dNOOUTERSAVE \
|
||||
-dNOPAUSE \
|
||||
-dQUIET \
|
||||
-dBATCH
|
||||
|
||||
pdftools_pdfcat = gs \
|
||||
$(PDFTOOLS_GSFLAGS) \
|
||||
-sPAPERSIZE=a4 \
|
||||
-dFIXEDMEDIA \
|
||||
-dPDFFitPage \
|
||||
-dCompatibilityLevel=1.7 \
|
||||
-dPDFSETTINGS=/ebook \
|
||||
-sOutputFile=$(2) \
|
||||
$(1)
|
||||
|
||||
pdftools_mkpdfa = gs \
|
||||
$(PDFTOOLS_GSFLAGS) \
|
||||
-dPDFA=$(1) \
|
||||
-sColorConversionStrategy=RGB \
|
||||
-dPDFACompatibilityPolicy=1 \
|
||||
--permit-file-read=/usr/local/share/autodoc/ \
|
||||
-sOutputFile=$(3) \
|
||||
/usr/local/share/autodoc/PDFA_def.ps \
|
||||
$(2)
|
||||
|
||||
############
|
||||
# PATTERNS #
|
||||
############
|
||||
|
||||
# convert PDF to PDF/A-2B
|
||||
%_pdfa2.pdf: %.pdf
|
||||
$(call pdftools_mkpdfa,2,$<,$@)
|
||||
|
||||
# convert PDF to PDF/A-3B
|
||||
%_pdfa3.pdf: %.pdf
|
||||
$(call pdftools_mkpdfa,3,$<,$@)
|
||||
|
||||
# convert PDF to PDF/A (default variant 3B)
|
||||
%_pdfa.pdf: %.pdf
|
||||
$(call pdftools_mkpdfa,3,$<,$@)
|
||||
BIN
src/usr/local/share/autodoc/sRGB.icc
(Stored with Git LFS)
Normal file
BIN
src/usr/local/share/autodoc/sRGB.icc
(Stored with Git LFS)
Normal file
Binary file not shown.
3
src/usr/local/share/puppeteer/config.json
Normal file
3
src/usr/local/share/puppeteer/config.json
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"args": [ "--no-sandbox" ]
|
||||
}
|
||||
Loading…
Reference in a new issue