##
## Variables
##

DALIDOC?=.
DALIDOC_SOURCE_DIR?=.
DALIDOC_BUILD_DIR?=.

DALIDOC_VERSION:=$(shell git -C $(DALIDOC) symbolic-ref -q --short HEAD || git -C $(DALIDOC) describe --tags --exact-match)

DALIDOC_LATEST_TAG_ON_ORIGIN:=$(shell git -C $(DALIDOC)  -c 'versionsort.suffix=-' ls-remote --exit-code --tags --sort='v:refname' origin | tail -n1 | cut --delimiter='/' --fields=3)

# Garder cette cible en haut
default: help

##
## Checks
##

.PHONY: check_dalidoc
check_dalidoc: #: Vérifie si le sous-module dalidoc est à jour
ifeq ($(DALIDOC_VERSION), $(DALIDOC_LATEST_TAG_ON_ORIGIN))
	$(info dalidoc est à jour.)
else
	$(info version locale=$(DALIDOC_VERSION))
	$(info dernière version disponible=$(DALIDOC_LATEST_TAG_ON_ORIGIN))
	$(info dalidoc n'est pas à jour !)
	$(info Essayez `git -C $(DALIDOC) fetch --all && git -C $(DALIDOC) checkout $(DALIDOC_LATEST_TAG_ON_ORIGIN)`)
endif


##
## Help
##

help::  #: Affiche cette page
	@echo
	@echo "    dalidoc $(DALIDOC_VERSION)"
	@echo
	@echo "Cibles make disponibles :"
	@echo
	@gawk 'match($$0, /([^:]*):.+#'': (.*)/, m) { printf "    %-16s%s\n", m[1], m[2]}' $(MAKEFILE_LIST) | sort
	@echo


##
## Pandoc
##

# Fichiers préfixe de toutes les docs.
PANDOC_METADATA_FILE?=$(DALIDOC)/config/metadata.yml

# Pour activer/désactiver les filtres pandoc, il suffit de surcharger ou vider
# ces variables dans le Makefile local
#
PANDOC_COVER?=--filter=pandoc-cover
PANDOC_INCLUDE?=--filter=pandoc-include
PANDOC_JINJA?=--filter=pandoc-jinja
PANDOC_LATEX_ENVIRONMENT?=--filter=pandoc-latex-environment

# le filtre pandoc-recap est expérimental
#PANDOC_RECAP?=--filter=pandoc-recap

PANDOC_SYNTAXDEF+=--syntax-definition=$(DALIDOC)/include/highlight/console.xml

# Paramètres pandoc communs à tous les formats d'export
#
# Attention l'ordre des filtres est important !
# Le principe est de déclencher les filtres impactant le fond (include, jinja,
# etc.) en priorité et pour tous les formats.
# Puis déclencher les filtres impactant la forme ( cover, latex-environment,
# etc. ) spécifiquement en fonction du format d'export.
#
PANDOC_ARGS?=--strip-comments \
             --mathml \
             --metadata-file=$(PANDOC_METADATA_FILE) \
             --resource-path=.:`dirname $<`:dalidoc \
             $(PANDOC_SYNTAXDEF) \
             $(PANDOC_INCLUDE) \
             $(PANDOC_JINJA) \
             $(PANDOC_RECAP)

##
## Pandocker
##

# La version de pandocker à utiliser
PANDOCKER_TAG?=stable


# Utile pour tracer un bug latex
#PANDOCKER_ENTRYPOINT?=--entrypoint xelatex

ifeq (0, $(shell grep -q docker  /proc/self/cgroup; echo -n $$?))
# On est dans docker, on utilise directement pandoc
PANDOC=pandoc
else ifdef NO_DOCKER
# On veut utiliser la commande locale
PANDOC=pandoc
else
# Sinon, se replier sur docker
PANDOC:=docker run --rm \
	--user `id -u`:`id -g` \
	--volume $(CURDIR):/pandoc $(PANDOCKER_ENTRYPOINT) \
	dalibo/pandocker:$(PANDOCKER_TAG)
endif

#
# DOCS_SRC est la liste des fichers source Markdown
#
# On inclut tous les fichiers *.md du dossier source
# Sauf:
# - les fichiers qui commencent par '_'
# - les fichiers dans le dossier $DALIDOC
# - les README
#

#DALIDOC_IGNORE_OLDER_THAN?=90
ifdef DALIDOC_IGNORE_OLDER_THAN
  FIND_MTIME=-mtime -$(DALIDOC_IGNORE_OLDER_THAN)
endif

DOCS_SRC?=$(shell find $(DALIDOC_SOURCE_DIR) -name '*.md' ! -path '*/_*' -and ! -path '$(DALIDOC)/*' -and ! -name 'README.md' $(FIND_MTIME) )


##
## Cible globale
##

#DALIDOC_TARGET_FORMATS?= markdown pdf html odt slides epub
DALIDOC_TARGET_FORMATS?= pdf

all: docs

.PHONY: docs
docs: $(DALIDOC_TARGET_FORMATS) #: Génère les formats définis par $DALIDOC_TARGET_FORMATS


##
## EPUB
##
## Pas vraiment testé, on le conserve pour des raisons historiques
##

DOCS_EPUB?=$(DOCS_SRC:.md=.epub)

.PHONY: epub
epub:: $(foreach d,$(DOCS_EPUB),$(DALIDOC_BUILD_DIR)/$(d)) #: Génère les docs au format EPUB

$(DALIDOC_BUILD_DIR)/%.epub:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		$< -o $@

##
## HTML (avec uikit)
##
## export "monolithique" du document, utile pour les formations
##

DOCS_HTML?=$(DOCS_SRC:.md=.html)

.PHONY: html
html:: $(foreach d,$(DOCS_HTML),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les docs au format HTML

PANDOC_HTML_TEMPLATE?=uikit

$(DALIDOC_BUILD_DIR)/%.html:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		--template=$(PANDOC_HTML_TEMPLATE) \
		--toc \
		--css $(DALIDOC)/include/css/dalibo.$(PANDOC_HTML_TEMPLATE).css \
		$< -o $@

##
## Markdown
##
## Si le client demande un export markdown, il vaut mieux envoyer
## une export markdown plutot que le fichier source
##
## On utilise l'extension `.markdown` pour différiencer l'export et la source
##

DOCS_MD?=$(DOCS_SRC:.md=.markdown)

.PHONY: markdown
markdown:: $(foreach d,$(DOCS_MD),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les docs au format Markdown

$(DALIDOC_BUILD_DIR)/%.markdown:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		$< -o $@

##
## ODT
##
## Rarement demandé, conservé pour des raisons historiques
##

DOCS_ODT?=$(DOCS_SRC:.md=.odt)

.PHONY: odt
odt:: $(foreach d,$(DOCS_ODT),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les docs au format ODT

$(DALIDOC_BUILD_DIR)/%.odt:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		--toc \
		--listings \
		$< -o $@

##
## PDF
##

DOCS_PDF?=$(DOCS_SRC:.md=.pdf)

.PHONY: pdf
pdf:: $(foreach d,$(DOCS_PDF),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les docs au format PDF

PANDOC_PDF_TEMPLATE?=eisvogel

# L'option --listings n'aime pas les caractères UTF-8 !
# On la désactive par défaut
#PANDOC_PDF_LISTINGS?=--listings

$(DALIDOC_BUILD_DIR)/%.tex $(DALIDOC_BUILD_DIR)/%.pdf:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		--template=$(PANDOC_PDF_TEMPLATE) \
		--pdf-engine-opt=-shell-escape \
		--pdf-engine=xelatex \
		--toc \
		$(PANDOC_COVER) \
		$(PANDOC_LATEX_ENVIRONMENT) \
		$(PANDOC_PDF_LISTINGS) \
		$< -o $@



##
## Slides HTML avec Revealjs
##
## On utilise l'extension `slides.html` pour différencier avec l'export uikit
##

DOCS_SLIDES?=$(DOCS_SRC:.md=.slides.html)
.PHONY: slides
slides:: $(foreach d,$(DOCS_SLIDES),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les diapos avec RevealJS

$(DALIDOC_BUILD_DIR)/%.slides.html:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		--to revealjs \
		--embed-resources \
		--standalone \
		--css $(DALIDOC)/include/css/dalibo.reveal.css \
		$< -o $@

##
## Slides PDF
## Decktape permet de convertir les slides HTML en PDF
##

DECKTAPE?=docker run --rm -u `id -u`:`id -g` --privileged -v $(CURDIR):/slides astefanutti/decktape

DOCS_SLIDES_PDF?=$(DOCS_SRC:.md=.slides.pdf)
.PHONY: slides
slides_pdf:: $(foreach d,$(DOCS_SLIDES_PDF),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les diapos en PDF

%.slides.pdf: %.slides.html
	mkdir -p $(dir $@)
	$(DECKTAPE) --size 1920x1080 $^ $@

##
## Slides PowerPoint
##

DOCS_SLIDES_PPTX?=$(DOCS_SRC:.md=.slides.pptx)
.PHONY: slides
slides_pptx:: $(foreach d,$(DOCS_SLIDES_PPTX),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les diapos avec RevealJS

$(DALIDOC_BUILD_DIR)/%.slides.pptx:: %.md
	mkdir -p $(dir $@)
	$(PANDOC) \
		$(PANDOC_ARGS) \
		--reference-doc $(DALIDOC)/include/pptx/styles.pptx \
		$< -o $@


##
## debug
##


DOCS_TEX?=$(DOCS_SRC:.md=.tex)
.PHONY: debug
debug:
	$(info DALIDOC_TARGET_FORMATS = $(DALIDOC_TARGET_FORMATS))
	$(info DOCS_SRC = $(DOCS_SRC))
	$(info DOCS_PDF = $(DOCS_PDF))

.PHONY: tex
tex:: $(foreach d,$(DOCS_TEX),$(DALIDOC_BUILD_DIR)/$(d))  #: Génère les docs au format TEX (debug)

##
## Mermaid
##


DALIDOC_MERMAID_DIR?=images/mermaid
DALIDOC_MERMAID_OPT?=-t neutral

ifdef NO_DOCKER
# On veut utiliser la commande locale
MERMAID?=mmdc
else
MERMAID?=docker run --rm -u `id -u`:`id -g` -v `pwd`:/data minlag/mermaid-cli:latest
endif

MMD := $(shell test -d $(DALIDOC_MERMAID_DIR) && find $(DALIDOC_MERMAID_DIR) -name '*.md')
SVG = $(MMD:.md=.svg)
PNG = $(MMD:.md=.png)

.PHONY: png svg
mermaid: png svg #: Génère les images dans le dossier $DALIDOC_MERMAID_DIR
png: $(PNG)
svg: $(SVG)

%.png: %.md
	$(MERMAID) $(MERMAID_OPT) -i /data/$^ -o /data/$@

%.svg: %.md
	$(MERMAID) $(MERMAID_OPT) -i /data/$^ -o /data/$@


##
## Lint
##
lint: #: Vérifier la syntax Markdown
	mdl .

##
## Nettoyage
##

DOCS_ALL=$(DOCS_EPUB) $(DOCS_HTML) $(DOCS_MD) $(DOCS_ODT) $(DOCS_PDF) $(DOCS_SLIDES) $(DOCS_TEX)

clean:: #: Supprime tous les artefacts
	rm -fr $(DOCS_ALL)
