﻿#!/usr/bin/python
# -*- coding=utf-8 -*-
# -------------------------------------------------------------------------------
# Name:        stem_noun_const
# Purpose:     Arabic lexical analyser constants, provides feature for stemming arabic word as noun
#
# Author:      Taha Zerrouki (taha.zerrouki[at]gmail.com)
#
# Created:     31-10-2011
# Copyright:   (c) Taha Zerrouki 2011
# Licence:     GPL
# -------------------------------------------------------------------------------
"""Constants for stemming nouns"""
import pyarabic.araby as ar

COMP_PREFIX_LETTERS = "أابتفكلو"
COMP_SUFFIX_LETTERS = "ينهكماو"
COMP_INFIX_LETTERS = ""
COMP_MAX_PREFIX = 5
COMP_MAX_SUFFIX = 6
COMP_MIN_STEM = 2
COMP_JOKER = "*"
COMP_PREFIX_LIST_TAGS = {
    "": {"tags": ("",), "vocalized": ("",)},
    "أ": {"tags": ("استفهام",), "vocalized": ("أَ",)},
    "أَ": {"tags": ("استفهام",), "vocalized": ("أَ",)},
    "و": {
        "tags": (
            "عطف",
            "",
        ),
        "vocalized": ("وَ",),
    },
    "وَ": {
        "tags": (
            "عطف",
            "",
        ),
        "vocalized": ("وَ",),
    },
    "أو": {
        "tags": (
            "عطف",
            "استفهام",
        ),
        "vocalized": ("أَوََ",),
    },
    "ف": {"tags": ("عطف",), "vocalized": ("فَ",)},
    "أف": {
        "tags": (
            "استفهام",
            "عطف",
        ),
        "vocalized": ("أَفَ",),
    },
    "ب": {"tags": ("جر",), "vocalized": ("بِ",)},
    "أب": {
        "tags": (
            "استفهام",
            "جر",
        ),
        "vocalized": ("أَبِ",),
    },
    "وب": {
        "tags": (
            "جر",
            "عطف",
        ),
        "vocalized": ("وَبِ",),
    },
    "أوب": {
        "tags": (
            "استفهام",
            "جر",
            "عطف",
        ),
        "vocalized": ("أَوَبِ",),
    },
    "فب": {
        "tags": (
            "عطف",
            "جر",
        ),
        "vocalized": ("فَبِ",),
    },
    "أفب": {
        "tags": (
            "استفهام",
            "عطف",
            "جر",
        ),
        "vocalized": ("أَفَبِ",),
    },
    "ك": {"tags": ("جر",), "vocalized": ("كَ",)},
    "أك": {
        "tags": (
            "استفهام",
            "جر",
        ),
        "vocalized": ("أكَ",),
    },
    "وك": {
        "tags": (
            "جر",
            "عطف",
        ),
        "vocalized": ("وَكَ",),
    },
    "أوك": {
        "tags": (
            "استفهام",
            "جر",
            "عطف",
        ),
        "vocalized": ("أَوَكَ",),
    },
    "فك": {
        "tags": (
            "عطف",
            "جر",
        ),
        "vocalized": ("فَكَ",),
    },
    "أفك": {
        "tags": (
            "استفهام",
            "عطف",
            "جر",
        ),
        "vocalized": ("أَفَكَ",),
    },
    "ل": {"tags": ("جر",), "vocalized": ("لِ",)},
    "أل": {
        "tags": (
            "استفهام",
            "جر",
        ),
        "vocalized": ("أَلِ",),
    },
    "ول": {
        "tags": (
            "جر",
            "عطف",
        ),
        "vocalized": ("وَلِ",),
    },
    "أول": {
        "tags": (
            "استفهام",
            "جر",
            "عطف",
        ),
        "vocalized": ("أَوَلِ",),
    },
    "فل": {
        "tags": (
            "عطف",
            "جر",
        ),
        "vocalized": ("فَلِ",),
    },
    "أفل": {
        "tags": (
            "استفهام",
            "عطف",
            "جر",
        ),
        "vocalized": ("أَفَلِ",),
    },
    "ال": {"tags": ("تعريف",), "vocalized": ("الْ",)},
    "أال": {
        "tags": (
            "استفهام",
            "تعريف",
        ),
        "vocalized": ("أَالْ",),
    },
    "وال": {
        "tags": (
            "تعريف",
            "عطف",
        ),
        "vocalized": ("وَالْ",),
    },
    "أوال": {
        "tags": (
            "استفهام",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("أَوَالْ",),
    },
    "فال": {
        "tags": (
            "عطف",
            "تعريف",
        ),
        "vocalized": ("فَالْ",),
    },
    "أفال": {
        "tags": (
            "استفهام",
            "عطف",
            "تعريف",
        ),
        "vocalized": ("أَفَالْ",),
    },
    "بال": {
        "tags": (
            "جر",
            "تعريف",
        ),
        "vocalized": ("بِالْ",),
    },
    "أبال": {
        "tags": (
            "استفهام",
            "جر",
            "تعريف",
        ),
        "vocalized": ("أَبالْ",),
    },
    "وبال": {
        "tags": (
            "جر",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("وَبِالْْ",),
    },
    "أوبال": {
        "tags": (
            "استفهام",
            "جر",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("أَوَبالْْ",),
    },
    "فبال": {
        "tags": (
            "عطف",
            "جر",
            "تعريف",
        ),
        "vocalized": ("فَبِالْ",),
    },
    "أفبال": {
        "tags": (
            "استفهام",
            "عطف",
            "جر",
            "تعريف",
        ),
        "vocalized": ("أَفَبِالْ",),
    },
    "كال": {
        "tags": (
            "جر",
            "تعريف",
        ),
        "vocalized": ("كَالْْ",),
    },
    "أكال": {
        "tags": (
            "استفهام",
            "جر",
            "تعريف",
        ),
        "vocalized": ("أكَالْ",),
    },
    "وكال": {
        "tags": (
            "جر",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("وَكَالْْ",),
    },
    "أوكال": {
        "tags": (
            "استفهام",
            "جر",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("أَوَكَالْْ",),
    },
    "فكال": {
        "tags": (
            "عطف",
            "جر",
            "تعريف",
        ),
        "vocalized": ("فَكَالْ",),
    },
    "أفكال": {
        "tags": (
            "استفهام",
            "عطف",
            "جر",
            "تعريف",
        ),
        "vocalized": ("أَفَكَالْ",),
    },
    "لل": {
        "tags": (
            "جر",
            "تعريف",
        ),
        "vocalized": ("لِلْ",),
    },
    "ألل": {
        "tags": (
            "استفهام",
            "جر",
            "تعريف",
        ),
        "vocalized": ("أَلِلْ",),
    },
    "ولل": {
        "tags": (
            "جر",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("وَلِلْ",),
    },
    "أولل": {
        "tags": (
            "استفهام",
            "جر",
            "تعريف",
            "عطف",
        ),
        "vocalized": ("أَوَلِلْ",),
    },
    "فلل": {
        "tags": (
            "عطف",
            "جر",
            "تعريف",
        ),
        "vocalized": ("فَلِلْ",),
    },
    "أفلل": {
        "tags": (
            "استفهام",
            "عطف",
            "جر",
            "تعريف",
        ),
        "vocalized": ("أَفَلِلْ",),
    },
}
COMP_PREFIX_LIST = list(COMP_PREFIX_LIST_TAGS.keys())
COMP_SUFFIX_LIST_TAGS = {
    "": {"tags": ("",), "vocalized": ("",)},
    "ي": {
        "tags": ("مضاف",),
        "vocalized": ("ي",),
    },
    "ك": {
        "tags": ("مضاف",),
        "vocalized": ("كَ", "كِ"),
    },
    "كَ": {
        "tags": ("مضاف",),
        "vocalized": ("كَ",),
    },
    "كِ": {
        "tags": ("مضاف",),
        "vocalized": ("كِ",),
    },
    "كم": {
        "tags": ("مضاف",),
        "vocalized": ("كُمْ",),
    },
    "كُمْ": {
        "tags": ("مضاف",),
        "vocalized": ("كُمْ",),
    },
    "كن": {
        "tags": ("مضاف",),
        "vocalized": ("كُنَّ",),
    },
    "كُنَّ": {
        "tags": ("مضاف",),
        "vocalized": ("كُنَّ",),
    },
    "ها": {
        "tags": ("مضاف",),
        "vocalized": ("هَا",),
    },
    "هَا": {
        "tags": ("مضاف",),
        "vocalized": ("هَا",),
    },
    "نا": {
        "tags": ("مضاف",),
        "vocalized": ("نَا",),
    },
    "نَا": {
        "tags": ("مضاف",),
        "vocalized": ("نَا",),
    },
    "كما": {
        "tags": ("مضاف",),
        "vocalized": ("كُمَا",),
    },
    "كُمَا": {
        "tags": ("مضاف",),
        "vocalized": ("كُمَا",),
    },
    "هما": {
        "tags": ("مضاف",),
        "vocalized": ("هُمَا",),
    },
    # the  second variant is ajusted in vocalized fucntion
    "هُمَا": {
        "tags": ("مضاف",),
        "vocalized": ("هُمَا",),
    },
    # تستعمل في حالة كسر هاء الضمير في الجر
    "هِمَا": {
        "tags": ("مضاف",),
        "vocalized": ("هِمَا",),
    },
    # u"هُمَا":{'tags':(u"مضاف",  u'لايجر' ), "vocalized":(u"هُمَا", ), },
    # u"هِمَا":{'tags':(u"مضاف", u"مجرور", ), "vocalized":(u"هِمَا", ), },
    "هم": {
        "tags": ("مضاف",),
        "vocalized": ("هُمْ",),
    },
    "هُمْ": {
        "tags": ("مضاف",),
        "vocalized": ("هُمْ",),
    },
    # the  second variant is ajusted in vocalized fucntion
    "هِمْ": {
        "tags": ("مضاف",),
        "vocalized": ("هِمْ",),
    },
    # u"هُمْ":{'tags':(u"مضاف",  u'لايجر'), "vocalized":(u"هُمْ", ), },
    # u"هِمْ":{'tags':(u"مضاف", u"مجرور", ), "vocalized":(u"هِمْ", ), },
    "هن": {
        "tags": ("مضاف",),
        "vocalized": ("هُنَّ",),
    },
    "هُنَّ": {
        "tags": ("مضاف",),
        "vocalized": ("هُنَّ",),
    },
    # the  second variant is ajusted in vocalized fucntion
    "هِنَّ": {
        "tags": ("مضاف",),
        "vocalized": ("هِنَّ",),
    },
    # u"هُنَّ":{'tags':(u"مضاف",  u'لايجر' ), "vocalized":(u"هُنَّ", ), },
    # u"هِنَّ":{'tags':(u"مضاف", u"مجرور", ), "vocalized":(u"هِنَّ", ), },
    "ه": {
        "tags": ("مضاف",),
        "vocalized": ("هُ",),
    },
    "هُ": {
        "tags": ("مضاف",),
        "vocalized": ("هُ",),
    },
    # the  second variant is ajusted in vocalized fucntion
    "هِ": {
        "tags": ("مضاف",),
        "vocalized": ("هِ",),
    },
    # u"هُ":{'tags':(u"مضاف",  u'لايجر'), "vocalized":(u"هُ", ), },
    # u"هِ":{'tags':(u"مضاف", u"مجرور", ), "vocalized":(u"هِ", ), },
}
COMP_SUFFIX_LIST = list(COMP_SUFFIX_LIST_TAGS.keys())
COMP_NOUN_AFFIXES = set(
    [
        "-",  # قصد
        "أ-",  # أ-قصد
        "و-",  # و-قصد
        "أو-",  # أ-و-قصد
        "ف-",  # ف-قصد
        "أف-",  # أ-ف-قصد
        "ب-",  # ب-قصد
        "أب-",  # أ-ب-قصد
        "وب-",  # و-ب-قصد
        "أوب-",  # أ-و-ب-قصد
        "فب-",  # ف-ب-قصد
        "أفب-",  # أ-ف-ب-قصد
        "ك-",  # ك-قصد
        "أك-",  # أ-ك-قصد
        "وك-",  # و-ك-قصد
        "أوك-",  # أ-و-ك-قصد
        "فك-",  # ف-ك-قصد
        "أفك-",  # أ-ف-ك-قصد
        "ل-",  # ل-قصد
        "أل-",  # أ-ل-قصد
        "ول-",  # و-ل-قصد
        "أول-",  # أ-و-ل-قصد
        "فل-",  # ف-ل-قصد
        "أفل-",  # أ-ف-ل-قصد
        "-ي",  # قصد-ي
        "أ-ي",  # أ-قصد-ي
        "و-ي",  # و-قصد-ي
        "أو-ي",  # أ-و-قصد-ي
        "ف-ي",  # ف-قصد-ي
        "أف-ي",  # أ-ف-قصد-ي
        "ب-ي",  # ب-قصد-ي
        "أب-ي",  # أ-ب-قصد-ي
        "وب-ي",  # و-ب-قصد-ي
        "أوب-ي",  # أ-و-ب-قصد-ي
        "فب-ي",  # ف-ب-قصد-ي
        "أفب-ي",  # أ-ف-ب-قصد-ي
        "ك-ي",  # ك-قصد-ي
        "أك-ي",  # أ-ك-قصد-ي
        "وك-ي",  # و-ك-قصد-ي
        "أوك-ي",  # أ-و-ك-قصد-ي
        "فك-ي",  # ف-ك-قصد-ي
        "أفك-ي",  # أ-ف-ك-قصد-ي
        "ل-ي",  # ل-قصد-ي
        "أل-ي",  # أ-ل-قصد-ي
        "ول-ي",  # و-ل-قصد-ي
        "أول-ي",  # أ-و-ل-قصد-ي
        "فل-ي",  # ف-ل-قصد-ي
        "أفل-ي",  # أ-ف-ل-قصد-ي
        "-ك",  # قصد-ك
        "أ-ك",  # أ-قصد-ك
        "و-ك",  # و-قصد-ك
        "أو-ك",  # أ-و-قصد-ك
        "ف-ك",  # ف-قصد-ك
        "أف-ك",  # أ-ف-قصد-ك
        "ب-ك",  # ب-قصد-ك
        "أب-ك",  # أ-ب-قصد-ك
        "وب-ك",  # و-ب-قصد-ك
        "أوب-ك",  # أ-و-ب-قصد-ك
        "فب-ك",  # ف-ب-قصد-ك
        "أفب-ك",  # أ-ف-ب-قصد-ك
        "ك-ك",  # ك-قصد-ك
        "أك-ك",  # أ-ك-قصد-ك
        "وك-ك",  # و-ك-قصد-ك
        "أوك-ك",  # أ-و-ك-قصد-ك
        "فك-ك",  # ف-ك-قصد-ك
        "أفك-ك",  # أ-ف-ك-قصد-ك
        "ل-ك",  # ل-قصد-ك
        "أل-ك",  # أ-ل-قصد-ك
        "ول-ك",  # و-ل-قصد-ك
        "أول-ك",  # أ-و-ل-قصد-ك
        "فل-ك",  # ف-ل-قصد-ك
        "أفل-ك",  # أ-ف-ل-قصد-ك
        "-ه",  # قصد-ه
        "أ-ه",  # أ-قصد-ه
        "و-ه",  # و-قصد-ه
        "أو-ه",  # أ-و-قصد-ه
        "ف-ه",  # ف-قصد-ه
        "أف-ه",  # أ-ف-قصد-ه
        "ب-ه",  # ب-قصد-ه
        "أب-ه",  # أ-ب-قصد-ه
        "وب-ه",  # و-ب-قصد-ه
        "أوب-ه",  # أ-و-ب-قصد-ه
        "فب-ه",  # ف-ب-قصد-ه
        "أفب-ه",  # أ-ف-ب-قصد-ه
        "ك-ه",  # ك-قصد-ه
        "أك-ه",  # أ-ك-قصد-ه
        "وك-ه",  # و-ك-قصد-ه
        "أوك-ه",  # أ-و-ك-قصد-ه
        "فك-ه",  # ف-ك-قصد-ه
        "أفك-ه",  # أ-ف-ك-قصد-ه
        "ل-ه",  # ل-قصد-ه
        "أل-ه",  # أ-ل-قصد-ه
        "ول-ه",  # و-ل-قصد-ه
        "أول-ه",  # أ-و-ل-قصد-ه
        "فل-ه",  # ف-ل-قصد-ه
        "أفل-ه",  # أ-ف-ل-قصد-ه
        "-كم",  # قصد-كم
        "أ-كم",  # أ-قصد-كم
        "و-كم",  # و-قصد-كم
        "أو-كم",  # أ-و-قصد-كم
        "ف-كم",  # ف-قصد-كم
        "أف-كم",  # أ-ف-قصد-كم
        "ب-كم",  # ب-قصد-كم
        "أب-كم",  # أ-ب-قصد-كم
        "وب-كم",  # و-ب-قصد-كم
        "أوب-كم",  # أ-و-ب-قصد-كم
        "فب-كم",  # ف-ب-قصد-كم
        "أفب-كم",  # أ-ف-ب-قصد-كم
        "ك-كم",  # ك-قصد-كم
        "أك-كم",  # أ-ك-قصد-كم
        "وك-كم",  # و-ك-قصد-كم
        "أوك-كم",  # أ-و-ك-قصد-كم
        "فك-كم",  # ف-ك-قصد-كم
        "أفك-كم",  # أ-ف-ك-قصد-كم
        "ل-كم",  # ل-قصد-كم
        "أل-كم",  # أ-ل-قصد-كم
        "ول-كم",  # و-ل-قصد-كم
        "أول-كم",  # أ-و-ل-قصد-كم
        "فل-كم",  # ف-ل-قصد-كم
        "أفل-كم",  # أ-ف-ل-قصد-كم
        "-كن",  # قصد-كن
        "أ-كن",  # أ-قصد-كن
        "و-كن",  # و-قصد-كن
        "أو-كن",  # أ-و-قصد-كن
        "ف-كن",  # ف-قصد-كن
        "أف-كن",  # أ-ف-قصد-كن
        "ب-كن",  # ب-قصد-كن
        "أب-كن",  # أ-ب-قصد-كن
        "وب-كن",  # و-ب-قصد-كن
        "أوب-كن",  # أ-و-ب-قصد-كن
        "فب-كن",  # ف-ب-قصد-كن
        "أفب-كن",  # أ-ف-ب-قصد-كن
        "ك-كن",  # ك-قصد-كن
        "أك-كن",  # أ-ك-قصد-كن
        "وك-كن",  # و-ك-قصد-كن
        "أوك-كن",  # أ-و-ك-قصد-كن
        "فك-كن",  # ف-ك-قصد-كن
        "أفك-كن",  # أ-ف-ك-قصد-كن
        "ل-كن",  # ل-قصد-كن
        "أل-كن",  # أ-ل-قصد-كن
        "ول-كن",  # و-ل-قصد-كن
        "أول-كن",  # أ-و-ل-قصد-كن
        "فل-كن",  # ف-ل-قصد-كن
        "أفل-كن",  # أ-ف-ل-قصد-كن
        "-ها",  # قصد-ها
        "أ-ها",  # أ-قصد-ها
        "و-ها",  # و-قصد-ها
        "أو-ها",  # أ-و-قصد-ها
        "ف-ها",  # ف-قصد-ها
        "أف-ها",  # أ-ف-قصد-ها
        "ب-ها",  # ب-قصد-ها
        "أب-ها",  # أ-ب-قصد-ها
        "وب-ها",  # و-ب-قصد-ها
        "أوب-ها",  # أ-و-ب-قصد-ها
        "فب-ها",  # ف-ب-قصد-ها
        "أفب-ها",  # أ-ف-ب-قصد-ها
        "ك-ها",  # ك-قصد-ها
        "أك-ها",  # أ-ك-قصد-ها
        "وك-ها",  # و-ك-قصد-ها
        "أوك-ها",  # أ-و-ك-قصد-ها
        "فك-ها",  # ف-ك-قصد-ها
        "أفك-ها",  # أ-ف-ك-قصد-ها
        "ل-ها",  # ل-قصد-ها
        "أل-ها",  # أ-ل-قصد-ها
        "ول-ها",  # و-ل-قصد-ها
        "أول-ها",  # أ-و-ل-قصد-ها
        "فل-ها",  # ف-ل-قصد-ها
        "أفل-ها",  # أ-ف-ل-قصد-ها
        "-هم",  # قصد-هم
        "أ-هم",  # أ-قصد-هم
        "و-هم",  # و-قصد-هم
        "أو-هم",  # أ-و-قصد-هم
        "ف-هم",  # ف-قصد-هم
        "أف-هم",  # أ-ف-قصد-هم
        "ب-هم",  # ب-قصد-هم
        "أب-هم",  # أ-ب-قصد-هم
        "وب-هم",  # و-ب-قصد-هم
        "أوب-هم",  # أ-و-ب-قصد-هم
        "فب-هم",  # ف-ب-قصد-هم
        "أفب-هم",  # أ-ف-ب-قصد-هم
        "ك-هم",  # ك-قصد-هم
        "أك-هم",  # أ-ك-قصد-هم
        "وك-هم",  # و-ك-قصد-هم
        "أوك-هم",  # أ-و-ك-قصد-هم
        "فك-هم",  # ف-ك-قصد-هم
        "أفك-هم",  # أ-ف-ك-قصد-هم
        "ل-هم",  # ل-قصد-هم
        "أل-هم",  # أ-ل-قصد-هم
        "ول-هم",  # و-ل-قصد-هم
        "أول-هم",  # أ-و-ل-قصد-هم
        "فل-هم",  # ف-ل-قصد-هم
        "أفل-هم",  # أ-ف-ل-قصد-هم
        "-هن",  # قصد-هن
        "أ-هن",  # أ-قصد-هن
        "و-هن",  # و-قصد-هن
        "أو-هن",  # أ-و-قصد-هن
        "ف-هن",  # ف-قصد-هن
        "أف-هن",  # أ-ف-قصد-هن
        "ب-هن",  # ب-قصد-هن
        "أب-هن",  # أ-ب-قصد-هن
        "وب-هن",  # و-ب-قصد-هن
        "أوب-هن",  # أ-و-ب-قصد-هن
        "فب-هن",  # ف-ب-قصد-هن
        "أفب-هن",  # أ-ف-ب-قصد-هن
        "ك-هن",  # ك-قصد-هن
        "أك-هن",  # أ-ك-قصد-هن
        "وك-هن",  # و-ك-قصد-هن
        "أوك-هن",  # أ-و-ك-قصد-هن
        "فك-هن",  # ف-ك-قصد-هن
        "أفك-هن",  # أ-ف-ك-قصد-هن
        "ل-هن",  # ل-قصد-هن
        "أل-هن",  # أ-ل-قصد-هن
        "ول-هن",  # و-ل-قصد-هن
        "أول-هن",  # أ-و-ل-قصد-هن
        "فل-هن",  # ف-ل-قصد-هن
        "أفل-هن",  # أ-ف-ل-قصد-هن
        "-نا",  # قصد-نا
        "أ-نا",  # أ-قصد-نا
        "و-نا",  # و-قصد-نا
        "أو-نا",  # أ-و-قصد-نا
        "ف-نا",  # ف-قصد-نا
        "أف-نا",  # أ-ف-قصد-نا
        "ب-نا",  # ب-قصد-نا
        "أب-نا",  # أ-ب-قصد-نا
        "وب-نا",  # و-ب-قصد-نا
        "أوب-نا",  # أ-و-ب-قصد-نا
        "فب-نا",  # ف-ب-قصد-نا
        "أفب-نا",  # أ-ف-ب-قصد-نا
        "ك-نا",  # ك-قصد-نا
        "أك-نا",  # أ-ك-قصد-نا
        "وك-نا",  # و-ك-قصد-نا
        "أوك-نا",  # أ-و-ك-قصد-نا
        "فك-نا",  # ف-ك-قصد-نا
        "أفك-نا",  # أ-ف-ك-قصد-نا
        "ل-نا",  # ل-قصد-نا
        "أل-نا",  # أ-ل-قصد-نا
        "ول-نا",  # و-ل-قصد-نا
        "أول-نا",  # أ-و-ل-قصد-نا
        "فل-نا",  # ف-ل-قصد-نا
        "أفل-نا",  # أ-ف-ل-قصد-نا
        "-كما",  # قصد-كما
        "أ-كما",  # أ-قصد-كما
        "و-كما",  # و-قصد-كما
        "أو-كما",  # أ-و-قصد-كما
        "ف-كما",  # ف-قصد-كما
        "أف-كما",  # أ-ف-قصد-كما
        "ب-كما",  # ب-قصد-كما
        "أب-كما",  # أ-ب-قصد-كما
        "وب-كما",  # و-ب-قصد-كما
        "أوب-كما",  # أ-و-ب-قصد-كما
        "فب-كما",  # ف-ب-قصد-كما
        "أفب-كما",  # أ-ف-ب-قصد-كما
        "ك-كما",  # ك-قصد-كما
        "أك-كما",  # أ-ك-قصد-كما
        "وك-كما",  # و-ك-قصد-كما
        "أوك-كما",  # أ-و-ك-قصد-كما
        "فك-كما",  # ف-ك-قصد-كما
        "أفك-كما",  # أ-ف-ك-قصد-كما
        "ل-كما",  # ل-قصد-كما
        "أل-كما",  # أ-ل-قصد-كما
        "ول-كما",  # و-ل-قصد-كما
        "أول-كما",  # أ-و-ل-قصد-كما
        "فل-كما",  # ف-ل-قصد-كما
        "أفل-كما",  # أ-ف-ل-قصد-كما
        "-هما",  # قصد-هما
        "أ-هما",  # أ-قصد-هما
        "و-هما",  # و-قصد-هما
        "أو-هما",  # أ-و-قصد-هما
        "ف-هما",  # ف-قصد-هما
        "أف-هما",  # أ-ف-قصد-هما
        "ب-هما",  # ب-قصد-هما
        "أب-هما",  # أ-ب-قصد-هما
        "وب-هما",  # و-ب-قصد-هما
        "أوب-هما",  # أ-و-ب-قصد-هما
        "فب-هما",  # ف-ب-قصد-هما
        "أفب-هما",  # أ-ف-ب-قصد-هما
        "ك-هما",  # ك-قصد-هما
        "أك-هما",  # أ-ك-قصد-هما
        "وك-هما",  # و-ك-قصد-هما
        "أوك-هما",  # أ-و-ك-قصد-هما
        "فك-هما",  # ف-ك-قصد-هما
        "أفك-هما",  # أ-ف-ك-قصد-هما
        "ل-هما",  # ل-قصد-هما
        "أل-هما",  # أ-ل-قصد-هما
        "ول-هما",  # و-ل-قصد-هما
        "أول-هما",  # أ-و-ل-قصد-هما
        "فل-هما",  # ف-ل-قصد-هما
        "أفل-هما",  # أ-ف-ل-قصد-هما
        "ال-",  # ال-قصد
        "أال-",  # أ-ال-قصد
        "وال-",  # و-ال-قصد
        "أوال-",  # أ-و-ال-قصد
        "فال-",  # ف-ال-قصد
        "أفال-",  # أ-ف-ال-قصد
        "بال-",  # ب-ال-قصد
        "أبال-",  # أ-ب-ال-قصد
        "وبال-",  # و-ب-ال-قصد
        "أوبال-",  # أ-و-ب-ال-قصد
        "فبال-",  # ف-ب-ال-قصد
        "أفبال-",  # أ-ف-ب-ال-قصد
        "كال-",  # ك-ال-قصد
        "أكال-",  # أ-ك-ال-قصد
        "وكال-",  # و-ك-ال-قصد
        "أوكال-",  # أ-و-ك-ال-قصد
        "فكال-",  # ف-ك-ال-قصد
        "أفكال-",  # أ-ف-ك-ال-قصد
        "لل-",  # ل-ال-قصد
        "ألل-",  # أ-ل-ال-قصد
        "ولل-",  # و-ل-ال-قصد
        "أولل-",  # أ-و-ل-ال-قصد
        "فلل-",  # ف-ل-ال-قصد
        "أفلل-",  # أ-ف-ل-ال-قصد
    ]
)
CONJ_PREFIX_LETTERS = "1"
CONJ_SUFFIX_LETTERS = "اتةنوي"
CONJ_INFIX_LETTERS = ""
CONJ_MAX_PREFIX = 3
CONJ_MAX_SUFFIX = 3
CONJ_MIN_STEM = 2
CONJ_JOKER = "*"
CONJ_PREFIX_LIST = ""
CONJ_SUFFIX_LIST_TAGS = {
    "": {
        "tags": ("",),
        "vocalized": (
            ar.FATHA,
            ar.DAMMA,
            ar.KASRA,
            ar.DAMMATAN,
            ar.KASRATAN,
            ar.FATHATAN,
        ),
    },
    "ُ": {
        "tags": (
            "مرفوع",
            "متحرك",
            "ينون",
        ),
        "vocalized": ("ُ",),
    },  # DAMMA,
    "ٌ": {"tags": ("مرفوع", "متحرك", "تنوين"), "vocalized": ("ٌ",)},  # DAMMATAN,
    "ٍ": {"tags": ("مجرور", "متحرك", "تنوين"), "vocalized": ("ٍ",)},  # KASRA,
    "ِ": {
        "tags": (
            "مجرور",
            "متحرك",
            "ينون",
        ),
        "vocalized": ("ِ",),
    },  # KAsratan,
    "َ": {
        "tags": (
            "منصوب",
            "متحرك",
            "ينون",
        ),
        "vocalized": ("َ",),
    },  # FATHA,
    "ً": {"tags": ("منصوب", "تنوين"), "vocalized": ("ً",)},  # FATHATAN,
    "ة": {
        "tags": ("مؤنث", "يعرب"),
        "vocalized": ("َةُ", "َةٌ", "َةٍ", "َةِ", "َةَ", "َةً"),
    },  # TEH_MARBUTA,
    "َةُ": {
        "tags": (
            "مؤنث",
            "مرفوع",
            "متحرك",
            "ينون",
        ),
        "vocalized": ("َةُ",),
    },  # TEH_MARBUTA,
    "َةٌ": {
        "tags": ("مؤنث", "مرفوع", "متحرك", "تنوين"),
        "vocalized": ("َةٌ",),
    },  # TEH_MARBUTA,
    "َةٍ": {
        "tags": ("مؤنث", "مجرور", "متحرك", "تنوين"),
        "vocalized": ("َةٍ",),
    },  # TEH_MARBUTA,
    "َةِ": {
        "tags": (
            "مؤنث",
            "مجرور",
            "متحرك",
            "ينون",
        ),
        "vocalized": ("َةِ",),
    },  # TEH_MARBUTA,
    "َةَ": {
        "tags": (
            "مؤنث",
            "منصوب",
            "متحرك",
            "ينون",
        ),
        "vocalized": ("َةَ",),
    },  # TEH_MARBUTA,
    "َةً": {
        "tags": ("مؤنث", "منصوب", "متحرك", "تنوين"),
        "vocalized": ("َةً",),
    },  # TEH_MARBUTA,
    "ية": {
        "tags": ("مؤنث", "مجرور", "منسوب", "يعرب"),
        "vocalized": ("ِيَّةُ", "ِيَّةٌ", "ِيَّةٍ", "ِيَّةِ", "ِيَّةَ", "ِيَّةً"),
    },  # TEH_MARBUTA,
    "ِيَّةُ": {
        "tags": (
            "مؤنث",
            "مرفوع",
            "متحرك",
            "منسوب",
            "ينون",
        ),
        "vocalized": ("ِيَّةُ",),
    },  # TEH_MARBUTA,
    "ِيَّةٌ": {
        "tags": ("مؤنث", "مرفوع", "متحرك", "تنوين", "منسوب"),
        "vocalized": ("ِيَّةٌ",),
    },  # TEH_MARBUTA,
    "ِيَّةٍ": {
        "tags": ("مؤنث", "مجرور", "متحرك", "تنوين", "منسوب"),
        "vocalized": ("ِيَّةٍ",),
    },  # TEH_MARBUTA,
    "ِيَّةِ": {
        "tags": (
            "مؤنث",
            "مجرور",
            "متحرك",
            "منسوب",
            "ينون",
        ),
        "vocalized": ("ِيَّةِ",),
    },  # TEH_MARBUTA,
    "ِيَّةَ": {
        "tags": (
            "مؤنث",
            "منصوب",
            "متحرك",
            "منسوب",
            "ينون",
        ),
        "vocalized": ("ِيَّةَ",),
    },  # TEH_MARBUTA,
    "ِيَّةً": {
        "tags": ("مؤنث", "منصوب", "متحرك", "تنوين", "منسوب"),
        "vocalized": ("ِيَّةً",),
    },  # TEH_MARBUTA,
    "ا": {
        "tags": (
            "مثنى",
            "مرفوع",
        ),
        "vocalized": ("َا", "ًا"),
    },  # ALEF,
    "َا": {
        "tags": (
            "مثنى",
            "إضافة",
            "مرفوع",
            "متحرك",
        ),
        "vocalized": ("َا",),
    },  # ALEF,
    # ~ u"ًا":{'tags':(u'تنوين', u'منصوب', u'متحرك', ), 'vocalized':(u'ًا', )}, #ALEF,
    "ًا": {
        "tags": (
            "تنوين",
            "منصوب",
            "متحرك",
        ),
        "vocalized": ("ًا",),
    },  # ALEF,
    # u"ت":{'tags':(u'مؤنث', u'مضاف', u'مجرور'), 'vocalized':(u'َت', )}, #TEH_MARBUTA,
    # u"يت":{'tags':(u'مضاف', u'مجرور'), 'vocalized':(u'َيَّتَ', )}, #YEH+TEH_MARBUTA,
    "ات": {
        "tags": ("جمع مؤنث سالم", "مجرور", "متحرك", "جمع", "يعرب"),
        "vocalized": ("َاتُ", "َاتٌ", "َاتٍ", "َاتِ"),
    },  # ALEF+TEH,
    "َاتُ": {
        "tags": ("جمع مؤنث سالم", "مرفوع", "متحرك", "ينون", "جمع"),
        "vocalized": ("َاتُ",),
    },  # ALEF+TEH,
    "َاتٌ": {
        "tags": ("جمع مؤنث سالم", "مرفوع", "متحرك", "تنوين", "جمع"),
        "vocalized": ("َاتٌ",),
    },  # ALEF+TEH,
    "َاتٍ": {
        "tags": ("جمع مؤنث سالم", "متحرك", "تنوين", "جمع"),
        "cases": ("مجرور", "منصوب"),
        "vocalized": ("َاتٍ",),
    },  # ALEF+TEH,
    "َاتِ": {
        "tags": ("جمع مؤنث سالم", "متحرك", "ينون", "جمع"),
        "cases": ("مجرور", "منصوب"),
        "vocalized": ("َاتِ",),
    },  # ALEF+TEH,
    "ون": {
        "tags": ("جمع مذكر سالم", "لايضاف", "جمع"),
        "vocalized": ("ُونَ",),
    },  # WAW+NOON,
    "ُونَ": {
        "tags": ("جمع مذكر سالم", "لايضاف", "جمع"),
        "vocalized": ("ُونَ",),
    },  # WAW+NOON,
    "ين": {"tags": ("مجرور", "لايضاف", "جمع"), "vocalized": ("ِينَ", "َيْنِ")},  # YEH+NOON,
    "ِينَ": {
        "tags": ("جمع مذكر سالم", "لايضاف", "جمع"),
        "cases": ("مجرور", "منصوب"),
        "vocalized": ("ِينَ",),
    },  # YEH+NOON,
    "َيْنِ": {
        "tags": ("مجرور", "منصوب", "لايضاف", "مثنى"),
        "vocalized": ("َيْنِ",),
    },  # YEH+NOON,
    "و": {"tags": ("جمع مذكر سالم", "إضافة", "جمع"), "vocalized": ("ُو",)},  # WAW,
    "ُو": {"tags": ("جمع مذكر سالم", "إضافة", "جمع"), "vocalized": ("ُو",)},  # WAW,
    # YEH
    "ي": {"tags": (), "vocalized": ("ِي", "َيْ", "ِيُّ", "ِيٌّ", "ِيَّ", "ِيِّ", "ِيٍّ")},  # YEH,
    "يا": {"tags": ("منسوب", "منصوب", "تنوين"), "vocalized": ("يا", "ِيًّا")},  # YEH,
    "ِيًّا": {"tags": ("منسوب", "منصوب", "تنوين"), "vocalized": ("يا",)},  # YEH,
    # المثنى
    "َيْ": {
        "tags": (
            "مثنى",
            "مضاف",
        ),
        "cases": ("مجرور", "منصوب"),
        "vocalized": ("ي",),
    },  # YEH,
    # الجمع
    "ِي": {
        "tags": (
            "جمع مذكر سالم",
            "مضاف",
        ),
        "cases": ("مجرور", "منصوب"),
        "vocalized": ("ي",),
    },  # YEH,
    # منسوب بالياء
    "ِيُّ": {
        "tags": (
            "منسوب",
            "مرفوع",
        ),
        "vocalized": ("ي",),
    },  # YEH,
    "ِيٌّ": {"tags": ("منسوب", "مرفوع", "تنوين"), "vocalized": ("ي",)},  # YEH,
    "ِيَّ": {
        "tags": (
            "منسوب",
            "منصوب",
        ),
        "vocalized": ("ي",),
    },  # YEH,
    "ِيِّ": {
        "tags": (
            "منسوب",
            "مجرور",
        ),
        "vocalized": ("ي",),
    },  # YEH,
    "ِيٍّ": {"tags": ("منسوب", "مجرور", "تنوين"), "vocalized": ("ي",)},  # YEH,
    "ان": {"tags": ("مثنى", "لايضاف", "مرفوع"), "vocalized": ("َانِ",)},  # ALEF+NOON,
    "َانِ": {"tags": ("مثنى", "لايضاف", "مرفوع"), "vocalized": ("َانِ",)},  # ALEF+NOON,
    "تين": {
        "tags": ("مثنى", "مجرور", "لايضاف"),
        "vocalized": ("َتَيْنِ",),
    },  # TEH+YEH+NOON,
    "َتَيْنِ": {
        "tags": ("مثنى", "مجرور", "لايضاف"),
        "vocalized": ("َتَيْنِ",),
    },  # TEH+YEH+NOON,
    "تان": {"tags": ("مثنى", "لايضاف"), "vocalized": ("َتَانِِ",)},  # TEH+ALEF+NOON,
    "َتَانِِ": {"tags": ("مثنى", "لايضاف"), "vocalized": ("َتَانِِ",)},  # TEH+ALEF+NOON,
    "يتين": {
        "tags": ("مثنى", "مجرور", "لايضاف"),
        "vocalized": ("ِيَّتَيْنِ",),
    },  # TEH+YEH+NOON,
    "ِيَّتَيْنِ": {
        "tags": ("مثنى", "مجرور", "لايضاف"),
        "vocalized": ("ِيَّتَيْنِ",),
    },  # TEH+YEH+NOON,
    "يتان": {"tags": ("مثنى", "لايضاف"), "vocalized": ("ِيَّتَانِِ",)},  # TEH+ALEF+NOON,
    "ِيَّتَانِِ": {"tags": ("مثنى", "لايضاف"), "vocalized": ("ِيَّتَانِِ",)},  # TEH+ALEF+NOON,
    "يات": {
        "tags": ("جمع مؤنث سالم", "مجرور", "متحرك", "جمع", "يعرب"),
        "vocalized": (
            "ِيَاتِ",
            "ِيَاتُ",
            "ِيَاتٌ",
            "ِيَاتٍ",
        ),
    },  # YEH+ALEF+TEH,
    "ِيَاتُ": {
        "tags": ("جمع مؤنث سالم", "مرفوع", "متحرك", "ينون", "جمع"),
        "vocalized": ("ِيَاتُ",),
    },  # YEH+ALEF+TEH,
    "ِيَاتٌ": {
        "tags": ("جمع مؤنث سالم", "مرفوع", "متحرك", "تنوين", "جمع"),
        "vocalized": ("ِيَاتٌ",),
    },  # YEH+ALEF+TEH,
    "ِيَاتِ": {
        "tags": ("جمع مؤنث سالم", "متحرك", "ينون", "جمع"),
        "cases": ("منصوب", "مجرور"),
        "vocalized": ("ِيَاتِ",),
    },  # YEH+ALEF+TEH,
    "ِيَاتٍ": {
        "tags": ("جمع مؤنث سالم", "متحرك", "تنوين", "جمع"),
        "cases": ("منصوب", "مجرور"),
        "vocalized": ("ِيَاتٍ",),
    },  # YEH+ALEF+TEH,
}
CONJ_SUFFIX_LIST = list(CONJ_SUFFIX_LIST_TAGS.keys())
NOMINAL_CONJUGATION_AFFIX = set(
    [
        "-",
        "-ة",  # TEH_MARBUTA,
        "-ية",  # YEH+TEH_MARBUTA,
        "-يتين",  # TEH_MARBUTA,
        "-يتان",  # YEH+TEH_MARBUTA,
        "-ا",  # ALEF,
        "-ات",  # ALEF+TEH,
        "-ون",  # WAW+NOON,
        "-ين",  # YEH+NOON,
        "-و",  # WAW,
        "-ي",  # YEH,
        "-يا",  # YEH,
        "-ان",  # ALEF+NOON,
        "-تين",  # TEH+YEH+NOON,
        "-تان",  # TEH+ALEF+NOON,
        "-يات",  # YEH+ALEF+TEH,
    ]
)

AJUST_VOCAL_PATTERNS = [
    (ar.FATHA + ar.ALEF_MAKSURA + ar.FATHATAN, ar.FATHATAN + ar.ALEF_MAKSURA),
    (ar.FATHA + ar.ALEF_MAKSURA + ar.KASRATAN, ar.FATHATAN + ar.ALEF_MAKSURA),
    (ar.FATHA + ar.ALEF_MAKSURA + ar.DAMMATAN, ar.FATHATAN + ar.ALEF_MAKSURA),
    (ar.ALEF_MAKSURA + ar.FATHA, ar.ALEF_MAKSURA),
    (ar.ALEF_MAKSURA + ar.KASRA, ar.ALEF_MAKSURA),
    (ar.ALEF_MAKSURA + ar.DAMMA, ar.ALEF_MAKSURA),
    # Alef MAdda
    (ar.ALEF_HAMZA_ABOVE + ar.FATHA + ar.ALEF, ar.ALEF_MADDA),
]

# ~ word_vocalized = re.sub(ur"(%s)+" % ar.FATHA, ar.FATHA, word_vocalized)
# ~ word_vocalized = re.sub(ur"%s%s%s" % (ar.FATHA, ar.ALEF_MAKSURA,
# ~ ar.KASRATAN),
# ~ ar.FATHATAN + ar.ALEF_MAKSURA, word_vocalized)
# ~ word_vocalized = re.sub(ur"%s%s%s" % (ar.FATHA, ar.ALEF_MAKSURA,
# ~ ar.DAMMATAN),
# ~ ar.FATHATAN + ar.ALEF_MAKSURA, word_vocalized)
# ~ word_vocalized = re.sub(ur"%s%s%s" % (ar.FATHA, ar.ALEF_MAKSURA,
# ~ ar.FATHATAN),
# ~ ar.FATHATAN + ar.ALEF_MAKSURA, word_vocalized)
# ~ word_vocalized = re.sub(ur"%s%s%s" % (ar.FATHA, ar.ALEF_MAKSURA, ar.KASRA),
# ~ ar.FATHA + ar.ALEF_MAKSURA, word_vocalized)
# ~ word_vocalized = re.sub(ur"%s[%s|%s|%s]" % (ar.ALEF_MAKSURA, ar.DAMMA,
# ~ ar.FATHA, ar.KASRA),
# ~ ar.ALEF_MAKSURA, word_vocalized)
