# Aap recipe for German Vim spell files.

# Use a freshly compiled Vim if it exists.
@if os.path.exists('../../../src/vim'):
    VIM = ../../../src/vim
@else:
    VIM = vim

SPELLDIR = ..
FILES    = de_DE.aff de_DE.dic
ZIPFILE  = de_DE_comb.zip

all: $(SPELLDIR)/de.latin1.spl $(SPELLDIR)/de.utf-8.spl ../README_de.txt

$(SPELLDIR)/de.latin1.spl : $(VIM) $(FILES)
        :sys env LANG=de_DE.ISO8859-1
		$(VIM) -e -c "mkspell! $(SPELLDIR)/de de_DE" -c q

$(SPELLDIR)/de.utf-8.spl : $(VIM) $(FILES)
        :sys env LANG=de_DE.UTF-8
		$(VIM) -e -c "mkspell! $(SPELLDIR)/de de_DE" -c q

../README_de.txt: README_de_DE_comb.txt
        :copy $source $target

#
# Fetching the files from OpenOffice.org.
#
OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
:attr {fetch = $(OODIR)/%file%} $(ZIPFILE)

# The files don't depend on the .zip file so that we can delete it.
# Only download the zip file if the targets don't exist.
de_DE.aff de_DE.dic: {buildcheck=}
        :assertpkg unzip patch
        :fetch $(ZIPFILE)
        :sys $(UNZIP) $(ZIPFILE)
        :delete $(ZIPFILE)
        :move de_DE_comb.aff de_DE.aff
        :move de_DE_comb.dic de_DE.dic
        @if not os.path.exists('de_DE.orig.aff'):
                :copy de_DE.aff de_DE.orig.aff
        @if not os.path.exists('de_DE.orig.dic'):
                :copy de_DE.aff de_DE.orig.dic
        :sys patch <de_DE.diff


# Generate diff files, so that others can get the OpenOffice files and apply
# the diffs to get the Vim versions.

diff:
        :assertpkg diff
        :sys {force} diff -a -C 1 de_DE.orig.aff de_DE.aff >de_DE.diff
        :sys {force} diff -a -C 1 de_DE.orig.dic de_DE.dic >>de_DE.diff


# Check for updated OpenOffice spell files.  When there are changes the
# ".new.aff" and ".new.dic" files are left behind for manual inspection.

check:
        :assertpkg unzip diff
        :fetch $(ZIPFILE)
        :mkdir tmp
        :cd tmp
        @try:
            @import stat
            :sys $(UNZIP) ../$(ZIPFILE)
            :move de_DE_comb.aff de_DE.aff
            :move de_DE_comb.dic de_DE.dic
            :sys {force} diff ../de_DE.orig.aff de_DE.aff >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy de_DE.aff ../de_DE.new.aff
            :sys {force} diff ../de_DE.orig.dic de_DE.dic >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy de_DE.dic ../de_DE.new.dic
        @finally:
            :cd ..
            :delete {r}{f}{q} tmp
            :delete $(ZIPFILE)


# vim: set sts=4 sw=4 :
