Skip to content
Snippets Groups Projects
KeySpecShortcuts.kt 5.36 KiB
Newer Older
package org.futo.inputmethod.v2keyboard

import org.futo.inputmethod.keyboard.internal.KeyboardLayoutKind
import org.futo.inputmethod.keyboard.internal.KeyboardTextsSet

fun shortcutsOf(vararg values: Pair<String, List<String>>): Map<String, List<String>> =
    mapOf(*values).mapValues {
        it.value.map { v ->
            if(v.startsWith("keyspec") || v.startsWith("morekeys") || v.startsWith("additional_")) {
                "!text/$v"
            } else {
                v
            }

val KeySpecShortcuts = listOf(
    // Symbols-only shortcuts
    listOf(KeyboardLayoutKind.Symbols) to shortcutsOf(
        ";" to listOf("keyspec_symbols_semicolon", "morekeys_symbols_semicolon"),
        "!" to listOf("!", "morekeys_exclamation"),
        "+" to listOf("+", "morekeys_plus"),
        "?" to listOf("keyspec_symbols_question", "morekeys_question"),
        "\"" to listOf("\"", "morekeys_double_quote"),
        "\'" to listOf("\'", "morekeys_single_quote"),
        "$" to listOf("keyspec_currency", "morekeys_currency_generic"),
        "%" to listOf("keyspec_symbols_percent", "morekeys_symbols_percent"),
        "(" to listOf("keyspec_left_parenthesis", "morekeys_left_parenthesis"),
        ")" to listOf("keyspec_right_parenthesis", "morekeys_right_parenthesis"),
        "<" to listOf("keyspec_less_than", "morekeys_less_than"),
        ">" to listOf("keyspec_greater_than", "morekeys_greater_than"),
        "[" to listOf("keyspec_left_square_bracket"),
        "]" to listOf("keyspec_right_square_bracket"),
        "{" to listOf("keyspec_left_curly_bracket"),
        "}" to listOf("keyspec_right_curly_bracket"),
        "*" to listOf("*", "morekeys_star"),
        "=" to listOf("=", "≠", "≈", "∞"),

Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
        "," to listOf("keyspec_comma"),
        "." to listOf("keyspec_period", "…"),

        "1" to listOf("keyspec_symbols_1", "additional_morekeys_symbols_1", "morekeys_symbols_1"),
        "2" to listOf("keyspec_symbols_2", "additional_morekeys_symbols_2", "morekeys_symbols_2"),
        "3" to listOf("keyspec_symbols_3", "additional_morekeys_symbols_3", "morekeys_symbols_3"),
        "4" to listOf("keyspec_symbols_4", "additional_morekeys_symbols_4", "morekeys_symbols_4"),
        "5" to listOf("keyspec_symbols_5", "additional_morekeys_symbols_5", "morekeys_symbols_5"),
        "6" to listOf("keyspec_symbols_6", "additional_morekeys_symbols_6", "morekeys_symbols_6"),
        "7" to listOf("keyspec_symbols_7", "additional_morekeys_symbols_7", "morekeys_symbols_7"),
        "8" to listOf("keyspec_symbols_8", "additional_morekeys_symbols_8", "morekeys_symbols_8"),
        "9" to listOf("keyspec_symbols_9", "additional_morekeys_symbols_9", "morekeys_symbols_9"),
        "0" to listOf("keyspec_symbols_0", "additional_morekeys_symbols_0", "morekeys_symbols_0"),
    ),

    // Alphabet-only shortcuts
    listOf(KeyboardLayoutKind.Alphabet) to shortcutsOf(
        "q" to listOf("keyspec_q"),
        "w" to listOf("keyspec_w"),
        "y" to listOf("keyspec_y"),
        "x" to listOf("keyspec_x"),

        // Cyrillic
        "щ" to listOf("keyspec_east_slavic_row1_9"),
        "ы" to listOf("keyspec_east_slavic_row2_2", "morekeys_east_slavic_row2_2"),
        "э" to listOf("keyspec_east_slavic_row2_11", "morekeys_east_slaiv_row2_11"),
        "и" to listOf("keyspec_east_slavic_row3_5"),
        "\u044c" to listOf("\u044c", "morekeys_cyrillic_soft_sign"),
        "\u0443" to listOf("\u0443", "morekeys_cyrillic_u"),
        "\u043a" to listOf("\u043a", "morekeys_cyrillic_ka"),
        "\u043d" to listOf("\u043d", "morekeys_cyrillic_en"),
        "\u0433" to listOf("\u0433", "morekeys_cyrillic_ghe"),
        "\u0430" to listOf("\u0430", "morekeys_cyrillic_a"),
        "\u043e" to listOf("\u043e", "morekeys_cyrillic_o"),
        "\u0438" to listOf("\u0438", "morekeys_cyrillic_i"),
        "\u0435" to listOf("\u0435", "morekeys_cyrillic_ie"),
    ),

    // All shortcuts
    KeyboardLayoutKind.entries to shortcutsOf(
        "," to listOf("keyspec_comma"),
        "." to listOf("keyspec_period"),

        // Similar to the symbols shortcuts for 0-9, but without morekeys_symbols_n
        "1" to listOf("keyspec_symbols_1", "additional_morekeys_symbols_1"),
        "2" to listOf("keyspec_symbols_2", "additional_morekeys_symbols_2"),
        "3" to listOf("keyspec_symbols_3", "additional_morekeys_symbols_3"),
        "4" to listOf("keyspec_symbols_4", "additional_morekeys_symbols_4"),
        "5" to listOf("keyspec_symbols_5", "additional_morekeys_symbols_5"),
        "6" to listOf("keyspec_symbols_6", "additional_morekeys_symbols_6"),
        "7" to listOf("keyspec_symbols_7", "additional_morekeys_symbols_7"),
        "8" to listOf("keyspec_symbols_8", "additional_morekeys_symbols_8"),
        "9" to listOf("keyspec_symbols_9", "additional_morekeys_symbols_9"),
        "0" to listOf("keyspec_symbols_0", "additional_morekeys_symbols_0"),
    )
)

fun resolveSpecWithOptionalShortcut(spec: String, textsSet: KeyboardTextsSet, coordinate: KeyCoordinate): List<String>? =
    KeySpecShortcuts.filter {
        // Filter to shortcut tables that are relevant for this element kind (alphabet, symbols, etc)
        it.first.contains(coordinate.element.kind)
    }.mapNotNull {
        // Map to values that exist
        it.second[spec]
    }.firstOrNull {
        // First one where the main key is resolvable in our texts set
        textsSet.resolveTextReference(it[0]) != null
    }