# Aap recipe for Russian Vim spell files.

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

REGIONS = RU IE YO
SPELLDIR = ..
FILES    = ru_$*(REGIONS).aff ru_$*(REGIONS).dic

all: $SPELLDIR/ru.koi8-r.spl $SPELLDIR/ru.utf-8.spl \
        $SPELLDIR/ru.cp1251.spl ../README_ru.txt

$SPELLDIR/ru.koi8-r.spl : $FILES
        :sys env LANG=ru_RU.KOI8-R $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_IE ru_YO" -c q

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

$SPELLDIR/ru.cp1251.spl : $FILES
        :sys env LANG=ru_RU.CP1251 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_IE ru_YO" -c q

../README_ru.txt: README_ru_$*(REGIONS).txt
        :print ru_RU >! $target
        :cat README_ru_RU.txt >> $target
        :print =================================================== >>$target
        :print ru_IE >> $target
        :cat README_ru_IE.txt >> $target
        :print =================================================== >>$target
        :print ru_YO >> $target
        :cat README_ru_YO.txt >> $target

#
# Fetching the files from OpenOffice.org.
#
OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
:attr {fetch = $OODIR/%file%} ru_RU.zip ru_RU_ye.zip ru_RU_yo.zip

# 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.
# This is a bit tricky, since the file name includes the date.
ru_RU.aff ru_RU.dic: {buildcheck=}
        :assertpkg unzip
        :fetch ru_RU.zip
        :sys unzip ru_RU.zip
        :delete ru_RU.zip
        @if not os.path.exists('ru_RU.orig.aff'):
            :copy ru_RU.aff ru_RU.orig.aff
        @if not os.path.exists('ru_RU.orig.dic'):
            :copy ru_RU.dic ru_RU.orig.dic
        @if os.path.exists('ru_RU.diff'):
            :sys patch <ru_RU.diff

ru_IE.aff ru_IE.dic: {buildcheck=}
        :assertpkg unzip
        :fetch ru_RU_ye.zip
        :sys unzip ru_RU_ye.zip
        :delete ru_RU_ye.zip
        :move ru_RU_ie.aff ru_IE.aff
        :move ru_RU_ie.dic ru_IE.dic
        :move README_ru_RU_ie.txt README_ru_IE.txt
        @if not os.path.exists('ru_IE.orig.aff'):
            :copy ru_IE.aff ru_IE.orig.aff
        @if not os.path.exists('ru_IE.orig.dic'):
            :copy ru_IE.dic ru_IE.orig.dic
        @if os.path.exists('ru_IE.diff'):
            :sys patch <ru_IE.diff

ru_YO.aff ru_YO.dic: {buildcheck=}
        :assertpkg unzip
        :fetch ru_RU_yo.zip
        :sys unzip ru_RU_yo.zip
        :delete ru_RU_yo.zip
        :move ru_RU_yo.aff ru_YO.aff
        :move ru_RU_yo.dic ru_YO.dic
        :move README_ru_RU_yo.txt README_ru_YO.txt
        @if not os.path.exists('ru_YO.orig.aff'):
            :copy ru_YO.aff ru_YO.orig.aff
        @if not os.path.exists('ru_YO.orig.dic'):
            :copy ru_YO.dic ru_YO.orig.dic
        @if os.path.exists('ru_YO.diff'):
            :sys patch <ru_YO.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 ru_RU.orig.aff ru_RU.aff >ru_RU.diff
        :sys {force} diff -a -C 1 ru_RU.orig.dic ru_RU.dic >>ru_RU.diff
        :sys {force} diff -a -C 1 ru_IE.orig.aff ru_IE.aff >ru_IE.diff
        :sys {force} diff -a -C 1 ru_IE.orig.dic ru_IE.dic >>ru_IE.diff
        :sys {force} diff -a -C 1 ru_YO.orig.aff ru_YO.aff >ru_YO.diff
        :sys {force} diff -a -C 1 ru_YO.orig.dic ru_YO.dic >>ru_YO.diff


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

check:
        :print Doesn't work yet.
