# Aap recipe for Swedish Vim spell files.
#
# Maintainer: Mattias Winther <vim@mattias.winthernet.se>

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

SPELLDIR = ..
FILES    = sv_SE.aff sv_SE.dic

all: $SPELLDIR/sv.latin1.spl $SPELLDIR/sv.utf-8.spl ../README_sv.txt

$SPELLDIR/sv.latin1.spl : $FILES
        :sys env LANG=sv_SE.ISO-8859-1
		$VIM -u NONE -e -c "mkspell! $SPELLDIR/sv sv_SE" -c q

$SPELLDIR/sv.utf-8.spl : $FILES
        :sys env LANG=sv_SE.UTF-8
		$VIM -u NONE -e -c "mkspell! $SPELLDIR/sv sv_SE" -c q

../README_sv.txt : README_sv.txt
        :copy $source $target

#
# Fetching the files from OpenOffice.org.
#
OODIR = http://extensions.services.openoffice.org/e-files/1080/7
:attr {fetch = $OODIR/%file%} ooo_swedish_dict_1.43.oxt

# 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.
sv_SE.aff sv_SE.dic: {buildcheck=}
        :assertpkg unzip patch
        :fetch ooo_swedish_dict_1.43.oxt
        :sys $UNZIP ooo_swedish_dict_1.43.oxt
        :delete ooo_swedish_dict_1.43.oxt
        :delete {r} META-INF
        :copy dictionaries/sv_SE.aff sv_SE.aff
        :copy dictionaries/sv_SE.dic sv_SE.dic
        :delete {r} dictionaries dictionaries.xcu description.xml
        :delete {f} README_sv.txt
        :sys $VIM README_sv.txt -u NONE -N -e -c "0read LICENSE_en_US.txt" -c "read LICENSE_sv_SE.txt" -c "set ff=unix" -c write -c q
        :delete LICENSE_en_US.txt LICENSE_sv_SE.txt
        @if not os.path.exists('sv_SE.orig.aff'):
            :copy sv_SE.aff sv_SE.orig.aff
        @if not os.path.exists('sv_SE.orig.dic'):
            :copy sv_SE.dic sv_SE.orig.dic
        @if os.path.exists('sv_SE.diff'):
            :sys patch <sv_SE.diff

# Delete all the generated files, start from scratch
clean:
        :delete {f} sv_SE.aff sv_SE.dic
        :delete {f} sv_SE.aff.orig sv_SE.dic.orig
        :delete {f} sv_SE.orig.aff sv_SE.orig.dic
        :delete {f} README_sv.txt

# 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 sv_SE.orig.aff sv_SE.aff >sv_SE.diff
        :sys {force} diff -a -C 1 sv_SE.orig.dic sv_SE.dic >>sv_SE.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 ooo_swedish_dict_1.43.oxt
        :mkdir tmp
        :cd tmp
        @try:
            @import stat
            :sys $UNZIP ../ooo_swedish_dict_1.43.oxt
            :sys {force} diff ../sv_SE.orig.aff sv_SE.aff >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy sv_SE.aff ../sv_SE.new.aff
            :sys {force} diff ../sv_SE.orig.dic sv_SE.dic >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy sv_SE.dic ../sv_SE.new.dic
        @finally:
            :cd ..
            :delete {r}{f}{q} tmp
            :delete ooo_swedish_dict_1.43.oxt


# vim: set sts=4 sw=4 :
