top_builddir=..
include $(top_builddir)/Makefile.config

SUBDIRS = man

# A little trick to simplify some of the rules.
VPATH = $(builddir):$(srcdir):$(top_srcdir)/contrib/perl:$(top_srcdir)/po/perl

docdir = $(datadir)/doc

# Used by install-doc
HTML_DIR = $(DESTDIR)$(docdir)/$(PACKAGE)/html
PDF_DIR  = $(DESTDIR)$(docdir)/$(PACKAGE)/pdf
TXT_DIR  = $(DESTDIR)$(docdir)/$(PACKAGE)/txt

ASCIIDOC_CONF  = $(srcdir)asciidoc.conf
ASCIIDOC_FLAGS += -f $(ASCIIDOC_CONF) -a "builddir=$(CURDIR)/"

#############################################################################
# Build files

TXT_DOCS_NOINSTALL = \
 features.txt \
 keymap-actions.txt \
 keymap-defaults.txt \
 option-command.txt \
 option-config.txt

TXT_DOCS_ASIS = \
 python.txt

HTML_DOCS-$(CONFIG_ASCIIDOC) += \
 elinks.1.html \
 elinks.conf.5.html \
 elinkskeys.5.html \
 hacking.html \
 manual.html

HTML_DOCS-$(CONFIG_XMLTO) += \
 manual.html-chunked

HTML_DOCS-$(CONFIG_POD2HTML) += \
 perl.html \
 perl-hooks.html

# Don't install these documents, because the corresponding scripts
# are not installed either.  However, generating them may be useful.
HTML_DOCS_NOINSTALL-$(CONFIG_POD2HTML) += \
 perl-check-accelerator-conflicts.html \
 perl-gather-accelerator-contexts.html

MAN_DOCS-$(CONFIG_XMLTO) += \
 elinks.1 \
 elinks.conf.5 \
 elinkskeys.5

# Use jw for generating PDF, since xmlto seems to freak out.
PDF_DOCS-$(CONFIG_JW) += \
 manual.pdf


#############################################################################
## Set the default doc rules

MAN_DOCS  = $(MAN_DOCS-yes)
HTML_DOCS = $(HTML_DOCS-yes)
HTML_DOCS_NOINSTALL = $(HTML_DOCS_NOINSTALL-yes)
PDF_DOCS  = $(PDF_DOCS-yes)

txt:  $(TXT_DOCS_NOINSTALL)
html: txt $(HTML_DOCS) $(HTML_DOCS_NOINSTALL)
pdf:  txt $(PDF_DOCS)
man:  txt $(MAN_DOCS)

all-docs: man html pdf

install-doc: all-docs update-man install
	@$(foreach doc,$(HTML_DOCS), \
		if test -d $(doc); then \
			$(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(PACKAGE)/html/$(doc); \
			$(call ncmd,installdata,$(doc)/*,$(HTML_DIR)/$(doc)); \
		else \
			$(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(PACKAGE)/html; \
			$(call ncmd,installdata,$(doc),$(HTML_DIR)); \
		fi;)
	@$(foreach doc,$(PDF_DOCS), \
		$(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(PACKAGE)/pdf; \
		$(call ncmd,installdata,$(doc),$(PDF_DIR));)
	@$(foreach doc,$(TXT_DOCS_ASIS), \
		$(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(PACKAGE)/txt; \
		$(call ncmd,installdata,$(srcdir)$(doc),$(TXT_DIR));)

update-man: man
	@$(if $(MAN_DOCS), \
		$(call ncmd,installdata,elinks.1,$(srcdir)man/man1/elinks.1.in); \
		$(call ncmd,installdata,elinkskeys.5,$(srcdir)man/man5/); \
		$(call ncmd,installdata,elinks.conf.5,$(srcdir)man/man5/))

clean-local:
	@$(RM) -r api $(TXT_DOCS_NOINSTALL) $(MAN_DOCS) $(HTML_DOCS) $(HTML_DOCS_NOINSTALL) $(PDF_DOCS) *.tmp *.xml

# TODO: perl.pod should be pod2ized during make install. --pasky
install-local:


#############################################################################
# Generated asciidoc files

# Scripts and Dependencies
HELP2DOC = $(srcdir)tools/help2doc
CONF2DOC = $(srcdir)tools/conf2doc
KEYS2DOC = $(srcdir)tools/keys2doc
ELINKS	 = $(top_builddir)/src/elinks
FEATURES = $(top_srcdir)/features.conf
KBDBIND	 = $(top_srcdir)/src/config/kbdbind.c

# Locale env vars to override system one to ensure commands
# using elinks binary will generate texts in english
LOCALES = LC_ALL=C LANGUAGE=en

# FIXME: Keep generated .txt files relative to the source directory and files
# they are included in.
quiet_cmd_help2doc = ' [$(LINK_COLOR)HELP2DOC$(END_COLOR)]   $(RELPATH)$@'
      cmd_help2doc = $(LOCALES) $(HELP2DOC) $(ELINKS) $@ > $@

quiet_cmd_conf2doc = ' [$(LINK_COLOR)CONF2DOC$(END_COLOR)]   $(RELPATH)$@'
      cmd_conf2doc = $(LOCALES) $(CONF2DOC) $(FEATURES) > $@

quiet_cmd_keys2doc = ' [$(LINK_COLOR)KEYS2DOC$(END_COLOR)]   $(RELPATH)$@'
      cmd_keys2doc = $(LOCALES) $(KEYS2DOC) $(KBDBIND) $@ > $@

features.txt: $(FEATURES) $(CONF2DOC)
	$(call cmd,conf2doc)

keymap-%.txt: $(KBDBIND) $(KEYS2DOC)
	$(call cmd,keys2doc)

option-%.txt: $(ELINKS) $(HELP2DOC)
	$(call cmd,help2doc)


#############################################################################
# Build commands and macros

      quiet_cmd_jw = '       [$(LINK_COLOR)JW$(END_COLOR)]   $(RELPATH)$@'
            cmd_jw = $(JW) -b $(2) $<

   quiet_cmd_xmlto = '    [$(LINK_COLOR)XMLTO$(END_COLOR)]   $(RELPATH)$@'
         cmd_xmlto = $(XMLTO) -o $(call outdir) $(3) $(2) $<

quiet_cmd_pod2html = ' [$(LINK_COLOR)POD2HTML$(END_COLOR)]   $(RELPATH)$@'
      cmd_pod2html = $(POD2HTML) --outfile=$@ < $<

quiet_cmd_asciidoc = ' [$(LINK_COLOR)ASCIIDOC$(END_COLOR)]   $(RELPATH)$@'
      cmd_asciidoc = $(ASCIIDOC) $(ASCIIDOC_FLAGS) -b $(call backend) -d $(call doctype) -o $@ $<

# Based on $@ find out asciidoc doctype or backend + xmlto output dir.
doctype = $(if $(findstring .1.,$@)$(findstring .5.,$@),manpage,book)
backend = $(if $(findstring .xml,$@),docbook,xhtml11)
outdir  = $(if $(findstring -chunked,$@),$@,.)

# Loosely track dependencies via asciidoc includes.
asciidoc_dep = sed -n 's/[{]builddir}//g;s@include::\(.*\)\[.*@$@: $< \1@p' < $< > .deps/$(@F).asciidoc

-include .deps/*.asciidoc

# Do a little post-processing of man pages. Inserting title headers and date.
# - Change SYNOPSIS to OVERVIEW in elinkskeys.5 (but not in elinks.1).
#   SYNOPSIS isn't supposed to contain running text.  But AsciiDoc
#   7.1.2 complains "ERROR: elinkskeys.5.txt: line 10: second section
#   must be named SYNOPSIS" so we can't change this in  elinkskeys.5.txt.
# - Write backslash as "\e" not "\\", but be careful not to replace
#   double-backslashes that actually mean something else.  This is
#   apparently a bug in db2man, which xmlto runs.
# Run all the hacks together in one sed command so that we get the right
# exit code if there is an error somewhere in the middle.
MAN_DATE = $(shell date -I)
man_desc = `sed -n 's/:Description:\s*\(.*\)/\1/p' < $(srcdir)$(subst .xml,.txt,$(<F))`
man_hack = sed -e "s/^\(\.TH \"ELINKS[^\"]*\" [0-9] \).*/\1\"$(1)\" \"$(MAN_DATE)\" \"$(1)\"/" \
	       -e 's/\\\\\\\\ /\\e\\e /' \
	       -e 's/\(\\fI\)\\\\\(\\fR\)/\1\\e\2/' \
	       -e "s/@squote@/\\\\'/g" \
	       $(if $(findstring elinkskeys.5,$(<F)),-e 's/^\.SH "SYNOPSIS"$$/.SH "OVERVIEW"/') \
	       $(2) < $@ > $@.tmp \
	   && mv $@.tmp $@

#############################################################################
# Build recipies

%.html: %.txt $(ASCIIDOC_CONF)
	$(call cmd,asciidoc,xhtml11)
	@-$(call asciidoc_dep)

%.xml: %.txt $(ASCIIDOC_CONF)
	$(call cmd,asciidoc,docbook)
	@-$(call asciidoc_dep)

%.1: %.1.xml
	$(call cmd,xmlto,man)
	@$(call man_hack,$(call man_desc))

%.5: %.5.xml
	$(call cmd,xmlto,man)
	@$(call man_hack,$(call man_desc))

%.html-chunked: %.xml
	$(call cmd,xmlto,html)

%.pdf: %.xml
	$(call cmd,jw,pdf)

%.html: %.pod
	$(call cmd,pod2html)

perl-%.html: %.pl
	$(call cmd,pod2html)


include $(top_srcdir)/Makefile.lib
