// Alias: sv

routines (
           et_condition
           mark_regions
           main_suffix
           consonant_pair
           other_suffix
)

externals ( stem )

integers ( p1 x )

groupings ( v s_ending ost_ending )

stringescapes {}

/* special characters */

stringdef a"   '{U+00E4}'
stringdef ao   '{U+00E5}'
stringdef o"   '{U+00F6}'

define v 'aeiouy{a"}{ao}{o"}'

define s_ending  'bcdfghjklmnoprtvy'

define ost_ending 'iklnprtuv'

define mark_regions as (

    $p1 = limit
    test ( hop 3 setmark x )
    gopast v  gopast non-v  setmark p1
    try ( $p1 < x  $p1 = x )
)

backwardmode (

    define et_condition as (
        (non-v v not atlimit)
        and not among (
            // frihet, nyhet, råhet, trohet
            'h'
            // societet
            'iet'
            // annuitet, kontinuitet
            'uit'
            // alfabet
            'fab'
            // autenticitet, elektricitet, kapacitet, metallicitet, publicitet
            'cit'
            // graviditet, likviditet, rigiditet
            'dit'
            // neutralitet, rivalitet, sexualitet
            'alit'
            // flexibilitet, instabilitet, kompatibilitet, mobilitet, variabilitet
            'ilit'
            // anonymitet, intimitet, legitimitet
            'mit'
            // kommunitet, maskulinitet, modernitet, spontanitet, suveränitet
            'nit'
            // epitet, serendipitet
            'pit'
            // auktoritet, integritet, majoritet, popularitet, prioritet
            'rit'
            // densitet, generositet, intensitet, luminositet, viskositet
            'sit'
            // identitet, kvantitet
            'tit'
            // aggressivitet, positivitet
            'ivit'
            // antikvitet, oblikvitet
            'kvit'
            // komplexitet
            'xit'
            // komet
            'kom'
            // raket
            'rak'
            // paket
            'pak'
            // staket
            'stak'
        )
    )

    define main_suffix as (
        setlimit tomark p1 for ([substring])
        among(

            'a' 'arna' 'erna' 'heterna' 'orna' 'ad' 'e' 'ade' 'ande' 'arne'
            'are' 'aste' 'en' 'anden' 'aren' 'heten' 'ern' 'ar' 'er' 'heter'
            'or' 'as' 'arnas' 'ernas' 'ornas' 'es' 'ades' 'andes' 'ens' 'arens'
            'hetens' 'erns' 'at' 'andet' 'het' 'ast'
                (delete)
            's'
                ( ('et' et_condition ]) or s_ending  delete )
            'et'
                ( et_condition delete )
        )
    )

    define consonant_pair as setlimit tomark p1 for (
        among('dd' 'gd' 'nn' 'dt' 'gt' 'kt' 'tt')
        and ([next] delete)
    )

    define other_suffix as (
        setlimit tomark p1 for ([substring])
        among(
            'lig' 'ig' 'els' (delete)
            '{o"}st'         (ost_ending <-'{o"}s')
            'fullt'          (<-'full')
        )
    )
)

define stem as (

    do mark_regions
    backwards (
        do main_suffix
        do consonant_pair
        do other_suffix
    )
)
