diff options
Diffstat (limited to 'lulua/data')
-rw-r--r-- | lulua/data/keyboards/ibmpc105.yaml | 436 | ||||
-rw-r--r-- | lulua/data/layouts/ar-ergoarabic.yaml | 168 | ||||
-rw-r--r-- | lulua/data/layouts/ar-qtaish.yaml | 64 | ||||
-rw-r--r-- | lulua/data/report/index.html | 286 | ||||
-rw-r--r-- | lulua/data/report/style.css | 11 |
5 files changed, 879 insertions, 86 deletions
diff --git a/lulua/data/keyboards/ibmpc105.yaml b/lulua/data/keyboards/ibmpc105.yaml index d9dcb76..0938262 100644 --- a/lulua/data/keyboards/ibmpc105.yaml +++ b/lulua/data/keyboards/ibmpc105.yaml @@ -3,130 +3,558 @@ description: Standard IBM PC 105 key layout (European) rows: - - - kind: letter name: Bl1 + scancode: + keyman: K_BKSLASH + macos: 50 + windows: + - 41 + xorg: 49 + width: 1 - kind: letter name: Bl2 + scancode: + keyman: K_1 + macos: 18 + windows: + - 2 + xorg: 10 + width: 1 - kind: letter name: Bl3 + scancode: + keyman: K_2 + macos: 19 + windows: + - 3 + xorg: 11 + width: 1 - kind: letter name: Bl4 + scancode: + keyman: K_3 + macos: 20 + windows: + - 4 + xorg: 12 + width: 1 - kind: letter name: Bl5 + scancode: + keyman: K_4 + macos: 21 + windows: + - 5 + xorg: 13 + width: 1 - kind: letter name: Bl6 + scancode: + keyman: K_5 + macos: 23 + windows: + - 6 + xorg: 14 + width: 1 - kind: letter name: Bl7 + scancode: + keyman: K_6 + macos: 22 + windows: + - 7 + xorg: 15 + width: 1 - - kind: letter name: Br6 + scancode: + keyman: K_7 + macos: 26 + windows: + - 8 + xorg: 16 + width: 1 - kind: letter name: Br5 + scancode: + keyman: K_8 + macos: 28 + windows: + - 9 + xorg: 17 + width: 1 - kind: letter name: Br4 + scancode: + keyman: K_9 + macos: 25 + windows: + - 10 + xorg: 18 + width: 1 - kind: letter name: Br3 + scancode: + keyman: K_0 + macos: 29 + windows: + - 11 + xorg: 19 + width: 1 - kind: letter name: Br2 + scancode: + keyman: K_LBRKT + macos: 27 + windows: + - 12 + xorg: 20 + width: 1 - kind: letter name: Br1 + scancode: + keyman: K_RBRKT + macos: 24 + windows: + - 13 + xorg: 21 + width: 1 - name: Br_bs + scancode: + keyman: K_BKSP + macos: 51 + windows: + - 14 + xorg: 22 width: 1.75 - - - name: Cl_tab + scancode: + keyman: K_TAB + macos: 48 + windows: + - 15 + xorg: 23 width: 1.75 - kind: letter name: Cl1 + scancode: + keyman: K_Q + macos: 12 + windows: + - 16 + xorg: 24 + width: 1 - kind: letter name: Cl2 + scancode: + keyman: K_W + macos: 13 + windows: + - 17 + xorg: 25 + width: 1 - kind: letter name: Cl3 + scancode: + keyman: K_E + macos: 14 + windows: + - 18 + xorg: 26 + width: 1 - kind: letter name: Cl4 + scancode: + keyman: K_R + macos: 15 + windows: + - 19 + xorg: 27 + width: 1 - kind: letter name: Cl5 + scancode: + keyman: K_T + macos: 17 + windows: + - 20 + xorg: 28 + width: 1 - - kind: letter name: Cr7 + scancode: + keyman: K_Z + macos: 16 + windows: + - 21 + xorg: 29 + width: 1 - kind: letter name: Cr6 + scancode: + keyman: K_U + macos: 32 + windows: + - 22 + xorg: 30 + width: 1 - kind: letter name: Cr5 + scancode: + keyman: K_I + macos: 34 + windows: + - 23 + xorg: 31 + width: 1 - kind: letter name: Cr4 + scancode: + keyman: K_O + macos: 31 + windows: + - 24 + xorg: 32 + width: 1 - kind: letter name: Cr3 + scancode: + keyman: K_P + macos: 35 + windows: + - 25 + xorg: 33 + width: 1 - kind: letter name: Cr2 + scancode: + keyman: K_COLON + macos: 33 + windows: + - 26 + xorg: 34 + width: 1 - kind: letter name: Cr1 + scancode: + keyman: K_EQUAL + macos: 30 + windows: + - 27 + xorg: 35 + width: 1 - kind: multi name: CD_ret + scancode: + keyman: K_ENTER + macos: 36 + windows: + - 28 + xorg: 36 span: 2 + width: 1 - - - name: Dl_caps + scancode: + keyman: CAPS + macos: 57 + windows: + - 58 + xorg: 66 width: 2 - kind: letter name: Dl1 + scancode: + keyman: K_A + macos: 0 + windows: + - 30 + xorg: 38 + width: 1 - kind: letter name: Dl2 + scancode: + keyman: K_S + macos: 1 + windows: + - 31 + xorg: 39 + width: 1 - kind: letter name: Dl3 - - kind: letter - isMarked: true + scancode: + keyman: K_D + macos: 2 + windows: + - 32 + xorg: 40 + width: 1 + - isMarked: true + kind: letter name: Dl4 + scancode: + keyman: K_F + macos: 3 + windows: + - 33 + xorg: 41 + width: 1 - kind: letter name: Dl5 + scancode: + keyman: K_G + macos: 5 + windows: + - 34 + xorg: 42 + width: 1 - - kind: letter name: Dr7 - - kind: letter - isMarked: true + scancode: + keyman: K_H + macos: 4 + windows: + - 35 + xorg: 43 + width: 1 + - isMarked: true + kind: letter name: Dr6 + scancode: + keyman: K_J + macos: 38 + windows: + - 36 + xorg: 44 + width: 1 - kind: letter name: Dr5 + scancode: + keyman: K_K + macos: 40 + windows: + - 37 + xorg: 45 + width: 1 - kind: letter name: Dr4 + scancode: + keyman: K_L + macos: 37 + windows: + - 38 + xorg: 46 + width: 1 - kind: letter name: Dr3 + scancode: + keyman: K_BKQUOTE + macos: 41 + windows: + - 39 + xorg: 47 + width: 1 - kind: letter name: Dr2 + scancode: + keyman: K_QUOTE + macos: 39 + windows: + - 40 + xorg: 48 + width: 1 - kind: letter name: Dr1 + scancode: + keyman: K_SLASH + windows: + - 43 + xorg: 51 + width: 1 - - - name: El_shift + scancode: + keyman: SHIFT + macos: 57 + windows: + - 42 + xorg: 50 width: 1.5 - kind: letter name: El1 + scancode: + keyman: K_oE2 + windows: + - 86 + xorg: 94 + width: 1 - kind: letter name: El2 + scancode: + keyman: K_Y + macos: 6 + windows: + - 44 + xorg: 52 + width: 1 - kind: letter name: El3 + scancode: + keyman: K_X + macos: 7 + windows: + - 45 + xorg: 53 + width: 1 - kind: letter name: El4 + scancode: + keyman: K_C + macos: 8 + windows: + - 46 + xorg: 54 + width: 1 - kind: letter name: El5 + scancode: + keyman: K_V + macos: 9 + windows: + - 47 + xorg: 55 + width: 1 - kind: letter name: El6 + scancode: + keyman: K_B + macos: 11 + windows: + - 48 + xorg: 56 + width: 1 - - kind: letter name: Er5 + scancode: + keyman: K_N + macos: 45 + windows: + - 49 + xorg: 57 + width: 1 - kind: letter name: Er4 + scancode: + keyman: K_M + macos: 46 + windows: + - 50 + xorg: 58 + width: 1 - kind: letter name: Er3 + scancode: + keyman: K_COMMA + macos: 43 + windows: + - 51 + xorg: 59 + width: 1 - kind: letter name: Er2 + scancode: + keyman: K_PERIOD + macos: 47 + windows: + - 52 + xorg: 60 + width: 1 - kind: letter name: Er1 + scancode: + keyman: K_HYPHEN + macos: 44 + windows: + - 53 + xorg: 61 + width: 1 - name: Er_shift + scancode: + keyman: SHIFT + macos: 60 + windows: + - 54 + xorg: 62 width: 2.35 - - - name: Fl_ctrl + scancode: + keyman: LCTRL + macos: 59 + windows: + - 29 + xorg: 37 width: 1.75 - name: Fl_win + scancode: + keyman: K_?5B + macos: 55 + windows: + - 224 + - 91 + xorg: 133 width: 1.25 - name: Fl_alt + scancode: + keyman: LALT + macos: 58 + windows: + - 56 + xorg: 64 width: 1.25 - name: Fl_space + scancode: + keyman: K_SPACE + macos: 49 + windows: + - 57 + xorg: 65 width: 3 - - name: Fr_space + scancode: + keyman: K_SPACE + macos: 49 + windows: + - 57 + xorg: 65 width: 3 - name: Fr_altgr + scancode: + keyman: RALT + macos: 61 + windows: + - 224 + - 56 + xorg: 108 width: 1.25 - name: Fr_win + scancode: + keyman: K_?5C + macos: 55 + windows: + - 224 + - 92 + xorg: 105 width: 1.25 - name: Fr_menu + scancode: + keyman: K_?5D + windows: + - 224 + - 93 + xorg: 135 width: 1.25 - name: Fr_ctrl + scancode: + keyman: RCTRL + windows: + - 224 + - 29 + xorg: 105 width: 1.25 diff --git a/lulua/data/layouts/ar-ergoarabic.yaml b/lulua/data/layouts/ar-ergoarabic.yaml new file mode 100644 index 0000000..620ead1 --- /dev/null +++ b/lulua/data/layouts/ar-ergoarabic.yaml @@ -0,0 +1,168 @@ +name: ar-ergoarabic +layout: +- layer: + Bl1: "`" + Bl2: "1" + Bl3: "2" + Bl4: "3" + Bl5: "4" + Bl6: "5" + Bl7: "6" + Br6: "7" + Br5: "8" + Br4: "9" + Br3: "0" + Br2: "-" + Br1: "=" + Br_bs: "\b" + + Cl_tab: "\t" + Cl1: "د" + Cl2: "ص" + Cl3: "ث" + Cl4: "ق" + Cl5: "ف" + Cr7: "ء" + Cr6: "ع" + Cr5: "ه" + Cr4: "و" + Cr3: "ة" + Cr2: "]" + Cr1: "[" + + CD_ret: "\n" + + Dl1: "ش" + Dl2: "س" + Dl3: "ي" + Dl4: "ب" + Dl5: "ل" + Dr7: "ا" + Dr6: "ت" + Dr5: "ن" + Dr4: "م" + Dr3: "ك" + Dr2: "'" + Dr1: "\\" + + El2: "\u064a\u0654" # composed: ئ + El3: "ى" + El4: "ط" + El5: "ر" + El6: "خ" + Er5: "ح" + Er4: "ج" + Er3: "،" + Er2: "." + Er1: "/" + + Fl_space: " " + Fr_space: " " + modifier: + - [] +- layer: + Bl1: "~" # shadda + Bl2: "!" + Bl3: "@" + Bl4: "#" + Bl5: "$" + Bl6: "%" + Bl7: "^" + Br6: "&" + Br5: "*" + Br4: ")" + Br3: "(" + Br2: "_" + Br1: "+" + + Cl1: "ذ" + Cl2: "ض" + Cl3: "\u064f" # damma + Cl4: "\u064c" # dammatan + Cl5: "\u0651" # shadda + Cr7: "ا\u0655" # composed: إ + Cr6: "غ" + Cr5: "÷" + Cr4: "\u0648\u0654" # composed: ؤ + Cr3: "؛" + Cr2: "}" + Cr1: "{" + + Dl1: "\u0650" # kasra + Dl2: "\u064d" # kasratan + Dl3: "\u064e" # fatha + Dl4: "\u064b" # fathatan + Dl5: "ا\u0653" # composed: آ + Dr7: "ا\u0654" # composed: أ + Dr6: "\u0640" # tatweel + Dr5: "×" + Dr4: "," + Dr3: ":" + Dr2: '"' + + El3: "\u0652" # sukun + El4: "ظ" + El5: "ز" + El6: "…" + Er5: "»" + Er4: "«" + Er3: ">" + Er2: "<" + Er1: "؟" + modifier: + - [El_shift] + - [Er_shift] +- layer: + Bl2: "١" + Bl3: "٢" + Bl4: "٣" + Bl5: "٤" + Bl6: "٥" + Bl7: "٦" + Br6: "٧" + Br5: "٨" + Br4: "٩" + Br3: "٠" + Br1: "≠" + + Cl5: "ڤ" + + Dl4: "پ" + Dl5: "\u0670" # superscript alef + Dr7: "\u0671" # alef wasla + Dr5: "\u066b" # decimal separator + Dr3: "گ" + Dr2: '⟩' + Dr1: "⟨" + + El2: "›" + El3: "‹" + El5: "ژ" + Er4: "چ" + Er1: "\u066d" # five pointed star + modifier: + - [Fr_altgr] +- layer: + Bl6: "‰" + Br2: "\u2011" # non-breaking hyphen + Br1: "≈" + + Cl1: "\u2066" # LRI + Cl2: "\u2067" # RLI + Cl3: "\u2068" # first strong isolate + Cl4: "\u2069" # PDI + Cr7: "\u202a" # LRE + Cr6: "\u202b" # RLE + Cr5: "\u202c" # PDF + Cr3: "\u200e" # LRM + Cr2: "\u200f" # RLM + Cr1: "\u061c" # ALM + + Dr2: "\u200d" # ZWJ + Dr1: "\u202f" # NNBSP + + Er1: "\u200c" # ZWNJ + modifier: + - [Fr_altgr, El_shift] + - [Fr_altgr, Er_shift] + diff --git a/lulua/data/layouts/ar-qtaish.yaml b/lulua/data/layouts/ar-qtaish.yaml new file mode 100644 index 0000000..2acd0d6 --- /dev/null +++ b/lulua/data/layouts/ar-qtaish.yaml @@ -0,0 +1,64 @@ +name: ar-qtaish +layout: +- layer: + Bl2: "١" + Bl3: "٢" + Bl4: "٣" + Bl5: "٤" + Bl6: "٥" + Bl7: "٦" + Br6: "٧" + Br5: "٨" + Br4: "٩" + Br3: "٠" + + Cl_tab: "\t" + Cl1: "ق" + Cl2: "ى" + Cl3: "ة" + Cl4: "د" + Cl5: "ف" + Cr7: "ك" + Cr6: "ص" + Cr5: "س" + Cr4: "ح" + Cr3: "ذ" + Cr2: "ش" + Cr1: "ج" + + CD_ret: "\n" + + Dl1: "ر" + Dl2: "و" + Dl3: "ن" + Dl4: "ل" + Dl5: "ب" + Dr7: "ت" + Dr6: "ا" + Dr5: "ع" + Dr4: "ي" + Dr3: "م" + Dr2: "ه" + + El2: "ض" + El3: "خ" + El4: "ز" + El5: "ظ" + El6: "غ" + Er5: "ا\u0654" # composed: أ + Er4: "ء" + Er3: "ط" + Er2: "ث" + Er1: "\u064a\u0654" # composed: ئ + + Fl_space: " " + Fr_space: " " + modifier: + - [] +- layer: + Dl2: "\u0648\u0654" # composed: ؤ + Dr6: "ا\u0653" # composed: آ + Er5: "ا\u0655" # composed: إ + modifier: + - [El_shift] + - [Er_shift] diff --git a/lulua/data/report/index.html b/lulua/data/report/index.html index e35e08f..e2108cd 100644 --- a/lulua/data/report/index.html +++ b/lulua/data/report/index.html @@ -5,15 +5,23 @@ <title>لؤلؤة: لوحة مفاتيح عربية</title> <!--<meta name="description" content="">--> <meta name="viewport" content="width=device-width, initial-scale=1"> - + {# Fonts #} <link href="https://fonts.googleapis.com/css?family=IBM+Plex+Mono|IBM+Plex+Sans:100,400&display=swap" rel="stylesheet"> + + {# Pure.css #} <link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/pure-min.css" integrity="sha384-cg6SkqEOCV1NbJoCu11+bm0NvBRc8IYLRGXkmNrqUBfTjmMYwNKPWBTIKyw9mHNJ" crossorigin="anonymous"> <link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/grids-responsive-min.css" integrity="sha384-+lKLtMyKzY/ZdqRXlhw2whazop7duDxgP+oWPB+EGry5wK+vJnZwSsgMnAmDS/39" crossorigin="anonymous"> - <script src="https://polyfill.io/v3/polyfill.min.js?features=es6" crossorigin="anonymous"></script> - <script id="MathJax-script" async src="https://www.unpkg.com/mathjax@3.1.0/es5/tex-mml-chtml.js" integrity="sha384-ynpCZozLxgqK3wrgBu8qH8qPG3eD8mME8z0zugAX26UMb5HfLp2PtvtDH4vdmgkm" crossorigin="anonymous"></script> + + {# TeX support #} + <link rel="stylesheet" href="https://unpkg.com/katex@0.13.18/dist/katex.min.css" integrity="sha384-zTROYFVGOfTw7JV7KUu8udsvW2fx4lWOsCEDqhBreBwlHI4ioVRtmIvEThzJHGET" crossorigin="anonymous"> + <script defer src="https://unpkg.com/katex@0.13.18/dist/katex.min.js" integrity="sha384-GxNFqL3r9uRJQhR+47eDxuPoNE7yLftQM8LcxzgS4HT73tp970WS/wV5p8UzCOmb" crossorigin="anonymous"></script> + + <script defer src="https://unpkg.com/katex@0.13.18/dist/contrib/auto-render.min.js" integrity="sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl" crossorigin="anonymous" onload="renderMathInElement(document.body);"></script> + {# bokeh #} + {# Defer loading bokeh, so it does not block rendering #} {% for f in bokehres.js_files -%} - <script src="{{ f }}"></script> + <script defer crossorigin="anonymous" src="{{ f }}"></script> {%- endfor %} {% for f in bokehres.css_files -%} <link rel="stylesheet" href="{{ f }}"> @@ -129,11 +137,10 @@ <div class="lbox"> <h2>The Arabic alphabet</h2> <p> - 28 letters make up the Arabic alphabet and quite a few extra - symbols are required for proper text input, like the hamza in its different - shapes <bdo dir="ltr" lang="ar">أ إ آ ء ئ ؤ</bdo>, ta marbutah <bdo - dir="ltr" lang="ar">ة</bdo>, alif maqsurah <bdo dir="ltr" - lang="ar">ى</bdo> and various diacritics for vowelized texts. + 28 letters make up the Arabic alphabet and quite a few extra symbols are + required for proper text input, like the {{ hamzah }} in its different + shapes <bdo dir="ltr" lang="ar">أ إ آ ء ئ ؤ</bdo>, {{ tamarbutah + }}, {{ alifmaqsurah }} and various diacritics for vowelized texts. <!-- --> Since the performance of a keyboard layout depends on the text entered it is necessary to study its mono-, di- and trigraph frequencies first. @@ -222,8 +229,9 @@ </details> <p> - The plot below shows <bdo dir="ltr" lang="ar">ا ل ي م و ن</bdo> can be - considered the most frequently used letters in the Arabic language. + The plot below shows {{ alif }}, {{ lam }}, {{ ya }}, {{ mim }}, {{ + waw }} and {{ nun }} can be considered the most frequently used letters + in the Arabic language. <!-- --> Together they account for more than 55% of all letters in the corpus. </p> @@ -328,17 +336,17 @@ The most frequent letters have all been assigned to the home row, which makes them easily accessible. <!-- --> - <bdo lang="ar" dir="ltr">ا</bdo> and <bdo lang="ar" dir="ltr">ل</bdo> + {{ Alif }} and {{ lam }} are typed with different hands, balancing the load on hands almost evenly. <!-- --> The index and middle finger of both hands share the majority of the typing load, but naturally the left middle finger is used more - frequently due to its assignment to the letter alif. + frequently due to its assignment to the letter {{ alif }}. </p> <p> - The layout targets Quaranic and Modern Standard Arabic (MSA), also called Fusha + The layout targets Quaranic and Modern Standard Arabic (MSA), also called Fuṣḥa (<bdo lang="ar">الفصحى</bdo>), only. <!-- --> Dialectical Arabic (<bdo lang="ar">العامية</bdo>) is mainly a spoken @@ -353,35 +361,35 @@ Designing the layout to be compose-based has both benefits and disadvantages. <!-- --> - Compose-based mainly means the hamza <bdo lang="ar" dir="ltr">ء</bdo> - is treated like an optional diacritic for Alef, Waw and Yah instead of - viewing Alef-Hamza, Waw-Hamza and Yah-Hamza as precombined, atomic - units. + Compose-based mainly means the {{ hamzah }} is treated like an optional + diacritic for {{ alif }}, {{ waw }} and {{ ya }} instead of viewing + {{ alifhamzah }}, {{ wawhamzah }} and {{ yahamzah }} as precombined, + atomic units. <!-- --> - Although <bdo lang="ar" dir="ltr">أ</bdo> and <bdo lang="ar" - dir="ltr">ا</bdo> are not the same, the hamza can be dropped if the - writer’s intention is unambigiously inferable from context. + Although {{ alifhamzah_ }} and {{ alif_ }} are not the same, the {{ + hamzah_ }} can be dropped if the writer’s intention is unambigiously + inferable from context. <!-- --> - Thus it makes sense to provide hamza as a combining character on the - keyboard. + Thus it makes sense to provide {{ hamzah_ }} as a combining character + on the keyboard. <!-- --> Additionally it uses two keys less than precombining it with its stems, - allowing the entire alphabet plus hamza diacritic to fit on a single + allowing the entire alphabet plus hamzah diacritic to fit on a single keyboard layer. <!-- --> However, there is a cost to this approach: - All hamza variants account for {{ + All {{ hamzah_ }} variants account for {{ '%.1f'|format(layoutstats['ar-osx'].hamzaImpact*100) }}% of button combinations. <!-- --> - Splitting hamza and from its stem means doubling the total number of - button combinations and thus button presses, decreasing scores like + Splitting {{ hamzah_ }} and from its stem means doubling the total number + of button combinations and thus button presses, decreasing scores like words per minute (WPM) slightly. <!-- --> - Splitting Alef and Alef-Hamza could also reduce pressure on left middle - finger and allow for more even distribution, since {{ - layoutstats['ar-osx'].hamzaOnAlef|fraction }}<sup>th</sup> of all Alef - uses are with Hamza. + Splitting {{ alif }} and {{ alifhamzah }} could also reduce pressure + on left middle finger and allow for more even distribution, since {{ + layoutstats['ar-osx'].hamzaOnAlef|fraction }}<sup>th</sup> of all {{ + alif }} uses are with {{ hamzah }}. </p> <details class="remarks"> <summary></summary> @@ -415,23 +423,6 @@ {% endif %} {% endfor %} </div> -<div class="sentencestats"> -<p lang="en">Examples:</p> -<ul lang="ar"> -{% for sentence in stats.sentences %} - <li> - {% for match, weight in sentence[0] -%} - {%- if weight is none -%} - <span>{{ match }}</span> - {%- else -%} - {%- set c = weight|blendn((38, 139, 210), (108, 113, 196), (211, 54, 130), (220, 50, 47)) -%} - <span style="color: rgb({{ c[0] }}, {{ c[1] }}, {{ c[2] }});" title="{{ '%5.5f'|format(weight) }}">{{ match }}</span> - {%- endif -%} - {%- endfor %} - </li> -{% endfor %} -</ul> -</div> {% endmacro %} <figure id="ar-lulua-heat"> @@ -450,7 +441,62 @@ <div class="lbox"> <h2><a href="#related">Related work</a></h2> <p>This section explores existing keyboard layouts made for the - Arabic language and analyzes their usability.</p> + Arabic language and analyzes their usability. + <!-- --> + Comparing them with the proposed layout above is difficult at best, + because the layouts presented below cover different character sets. + <!-- --> + Some lack numbers, some do not include short vowels and others provide + no way to type symbols. + <!-- --> + Therefore no individual score is assigned to each layout, but an analysis + of each layout’s features is given. + </p> + </div> + </div> + </div> + + <figure id="triadeffort"> + <div class="lbox" lang="en"> + <div id="triadeffort-div"></div> + </div> + <figcaption class="pure-g flexreverse"> + </figcaption> + </figure> + + <div class="pure-g flexreverse"> + <div class="pure-u-1 pure-u-xl-1-2"> + </div> + <div class="pure-u-1 pure-u-xl-1-2" lang="en"> + <div class="lbox"> + <p> + Carpalx tries to minimize the effort of typing in blocks of three + consecutive keystrokes, triads, and thus a good layout in that sense + should make typing frequent triads easy. + <!-- --> + The figure above plots cumulative triad frequency on the x-axis and + weighted cumulative effort on the y-axis. + <!-- --> + Thus, at an x value of 0.5 the y-axis is the sum of triad frequencies + multiplied by their effort for all triads responsible for 50% of the + typing process. + <!-- --> + Standard layouts are the layouts from <a href="#ar-asmo663">ASMO</a>, + <a href="#ar-linux">Linux</a> and <a href="#ar-osx">OSX</a> whereas + <em>usable</em> lists only those which are actually relevant for typing. + <!-- --> + As we can see the layout presented above meets the optimization goal. + <!-- --> + Only the top 5% of all triads are “easier” to type with <a + href="#ar-malas">Malas’ layout</a>, because lulua splits {{ hamzah }} + from its {{ alif }} stem. + <!-- --> + As expected the <a href="#ar-phonetic">phonetic layout</a> is one of the + worst ones, because QWERTY is not optimized for Arabic letter frequencies. + </p> + <p> + The following sections provide details about these layouts. + </p> </div> </div> </div> @@ -474,8 +520,8 @@ dir="ltr" lang="ar">ض ص، س ش، ح ج خ</bdo>) and not frequency. <!-- --> Also it overuses the right index finger by assigning the four - high-frequency letters <bdo lang="ar" dir="ltr">ا ت و ة</bdo> to - it. + high-frequency letters {{ alif }}, {{ ta }}, {{ waw }} and {{ tamarbutah + }} to it. </p> </div> </div> @@ -497,14 +543,14 @@ <h3><a href="#ar-osx">Mac OS X</a></h3> <p> Mac OS X’s Arabic keyboard layout makes a few small changes to ASMO - 663 by moving the <bdo lang="ar" dir="ltr">ة</bdo> to a hard to + 663 by moving the {{ tamarbutah }} to a hard to reach spot on the right of the top row. <!-- --> It also moves the short vowels from the first to the top row of the second layer and replaces them with symbols. <!-- --> The bottom row keys are aditionally shifted to the right, beginning - with <bdo lang="ar" dir="ltr">ر</bdo>. + with {{ ra }}. </p> </div> </div> @@ -528,15 +574,14 @@ A more common layout is the one used on Linux, which also exists on Windows with minor changes to the first layer. <!-- --> - While its top and center row barely differ from ASMO 663 the - bottom row now contains a separate key for the ligature <bdo - lang="ar" dir="ltr">ﻻ</bdo>, likely inherited from <a + While its top and center row barely differ from + ASMO 663 the bottom row now contains a separate key + for the ligature {{ lamalif }} , likely inherited from <a href="https://oztypewriter.blogspot.com/2014/10/the-arabic-typewriter-keyboard-and.html">early typewriter layouts</a>. <!-- --> But at the cost of pushing punctuation characters to the second - layer, <bdo dir="ltr" lang="ar">د</bdo> into the top and <bdo - dir="ltr" lang="ar">ذ</bdo> even further into the number row. + layer, {{ dal }} into the top and {{ dhal }} even further into the number row. </p> </div> </div> @@ -591,10 +636,10 @@ </p> <p> While the layout distributes load between fingers quite well it - favors the left hand by assigning <bdo dir="ltr" lang="ar">ا</bdo> - and <bdo dir="ltr" lang="ar">ل</bdo> to it. + favors the left hand by assigning {{ alif }} + and {{ lam }} to it. <!-- --> - The decision to place <bdo dir="ltr" lang="ar">ث</bdo> in a very + The decision to place {{ tha }} in a very prominent spot seems weird, given it only accounts for 0.5% of all symbols, even in their own analysis. </p> @@ -636,15 +681,13 @@ <!-- --> Probably due to their unusual assumption that middle- and ring-finger rest in the top row their results are suboptimal, - placing both <bdo dir="ltr" lang="ar">ا</bdo> and <bdo dir="ltr" - lang="ar">ي</bdo> in the top row. + placing both {{ alif }} and {{ ya }} in the top row. <!-- --> Their analysis notices this and suggests improved positions for both characters, but these are not actually implemented. <!-- --> - The big asymmetry is caused by placing <bdo dir="ltr" lang="ar">ا - ل ي</bdo> and <bdo dir="ltr" lang="ar">و</bdo>, four of the five - most frequent letters, on the right hand side. + The big asymmetry is caused by placing {{ alif }}, {{ lam }}, {{ ya }} and + {{ waw }}, four of the five most frequent letters, on the right hand side. </p> </div></div> </div> @@ -672,11 +715,11 @@ optimized for typing speed only, claiming 35% faster typing compared to the <a href="#ar-linux">currently used layouts</a>. <!-- --> - However the decision to put <bdo dir="ltr" lang="ar">ي</bdo> in the top + However the decision to put {{ ya }} in the top row seems odd. <!-- --> - Assigning the same left index finger to <bdo dir="ltr" lang="ar">ا - ي و</bdo>, which are three of the most frequent letters, heavily + Assigning the same left index finger to {{ alif }}, + {{ ya }} and {{ waw }}, which are three of the most frequent letters, heavily strains this particular finger. </p> </div> @@ -711,8 +754,8 @@ well. <!-- --> However their algorithm seems to favor the bottom row instead of the - easier to use top row since it places the letters <bdo dir="ltr" - lang="ar">ب ت ر</bdo> there. + easier to use top row since it places the letters {{ ba }}, {{ ta }} + and {{ ra }} there. </p> </div> </div> @@ -746,20 +789,102 @@ provide <em>three</em> single-quote marks ’ and <em>two</em> Arabic semicolon <bdo dir="ltr" lang="ar">؛</bdo>. <!-- --> - Additionally it places <bdo dir="ltr" lang="ar">ي</bdo> in an even + Additionally it places {{ ya }} in an even worse position than Malas’ layout. </p> </div> </div> </div> - <figure id="ar-osman"> + <figure> <div class="lbox"> <img src="ar-osman-heat.svg"> {{ fingerhandstats(layoutstats['ar-osman']) }} </div> </figure> + <div id="ar-qtaish" class="pure-g flexreverse"> + <div class="pure-u-1 pure-u-xl-1-2"> + </div> + <div class="pure-u-1 pure-u-xl-1-2" lang="en"> + <div class="lbox"> + <h3><a href="#ar-qtaish">Qtaish et al</a></h3> + <p> + Qtaish et al presented this layout in + <a href="http://www.sci-int.com/pdf/637456047563529791.pdf">An Improved Arabic Keyboard Layout</a> in 2021. + <!-- --> + They use a novel corpus of 5 million words or roughly 66 million letters + <!-- 65713689 adding up the numbers in their paper --> consisting of + newspapers, (now defunct) social networks and blogs, as well as six + dictionaries (see remarks). + <!-- --> + Then letters were classified into three categories based on their + frequency, which apparently were used to populate home, top and bottom + row (in this order). + <!-- --> + Additionally bigrams were somehow used to arrange letters and avoid + placing them on the same or adjacent fingers, making rolling finger + movements incentiviced by carpalx impossible. + <!-- --> + Ultimately it looks like the layout was designed by hand and not through + an automated process. <!-- see section 5 of the paper --> + </p> + + <details class="remarks"> + <summary></summary> + <em>Alfarahindi</em> and <em>Alein Dictionary</em> are most likely the same 8th century book <a href="https://en.wikipedia.org/wiki/Kitab_al-%27Ayn">Kitab al-'Ayn</a>. + <!-- --> + There are also <a href="https://ar.wikipedia.org/wiki/%D8%AA%D8%A7%D8%AC_%D8%A7%D9%84%D8%B9%D8%B1%D9%88%D8%B3_%D9%85%D9%86_%D8%AC%D9%88%D8%A7%D9%87%D8%B1_%D8%A7%D9%84%D9%82%D8%A7%D9%85%D9%88%D8%B3">Taj-Alaroos</a>, <a href="https://www.lesanarab.com/letter/">Lesan Alarab</a>, <a href="https://ar.wikipedia.org/wiki/%D8%A7%D9%84%D9%85%D8%B9%D8%AC%D9%85_%D8%A7%D9%84%D9%88%D8%B3%D9%8A%D8%B7">Almujam Alwaseet</a> and <a href="https://ar.wikipedia.org/wiki/%D8%A7%D9%84%D9%85%D9%86%D8%AC%D8%AF_(%D9%84%D9%88%D9%8A%D8%B3_%D9%85%D8%B9%D9%84%D9%88%D9%81)">Almunjed</a>. + <!-- --> + All of them are lexica, not dictionaries. + </details> + + <p> + Although the authors do not provide a number row, it has been added for + fair comparison. + <!-- --> + However to be actually usable the layout would need punctuation symbols and diacritics. + </p> + </div> + </div> + </div> + + <figure id="ar-qtaish"> + <div class="lbox"> + <img src="ar-qtaish-heat.svg"> + {{ fingerhandstats(layoutstats['ar-qtaish']) }} + </div> + </figure> + + <div id="ar-ergoarabic" class="pure-g flexreverse"> + <div class="pure-u-1 pure-u-xl-1-2"> + </div> + <div class="pure-u-1 pure-u-xl-1-2" lang="en"> + <div class="lbox"> + <h3><a href="#ar-ergoarabic">Ergoarabic</a></h3> + <p> + Being first released in 2021 <a + href="https://github.com/darkstego/ergoarabic">Ergoarabic</a> is the + most recent optimized layout for Arabic. + <!-- --> + On the first layer it combines the positions of 17 keys from the <a + href="#ar-linux">standard PC layout</a> with brackets and punctuation + symbols from QWERTY, aiming to retain compatibility with both. + <!-- --> + The remaining keys have been re-arranged or moved to the shift layer by + hand for improved ergonomics. + </p> + </div> + </div> + </div> + + <figure id="ar-ergoarabic"> + <div class="lbox"> + <img src="ar-ergoarabic-heat.svg"> + {{ fingerhandstats(layoutstats['ar-ergoarabic']) }} + </div> + </figure> + <div id="ar-phonetic" class="pure-g flexreverse"> <div class="pure-u-1 pure-u-xl-1-2"> </div> @@ -769,7 +894,7 @@ <p> The <a href="http://arabic.omaralzabir.com/home">Arabic Phonetic Keyboard</a> simply maps the QWERTY layout to Arabic letters, based on their sound. - Thus Q becomes <bdo dir="ltr" lang="ar">ق</bdo>, Y becomes <bdo dir="ltr" lang="ar">ي</bdo> and so on. + Thus Q becomes {{ qaf }}, Y becomes {{ ya }} and so on. It claims to be optimized for writing vowelized texts, especially Quranic Arabic, and thus includes quite a few combining characters and special symbols. @@ -836,9 +961,16 @@ </section> <script> -fetch('letterfreq.json') - .then(function(response) { return response.json(); }) - .then(function(item) { Bokeh.embed.embed_item(item, 'letterfreq-div'); }) +function loadPlots () { + const plots = ['letterfreq', 'triadeffort']; + for (const p of plots) { + fetch(p + '.json') + .then(function(response) { return response.json(); }) + .then(function(item) { Bokeh.embed.embed_item(item, p + '-div'); }); + } +} +if (document.readyState != "loading") loadPlots (); +else document.addEventListener("DOMContentLoaded", loadPlots); </script> </body> diff --git a/lulua/data/report/style.css b/lulua/data/report/style.css index ed0d32d..2cffb03 100644 --- a/lulua/data/report/style.css +++ b/lulua/data/report/style.css @@ -30,6 +30,12 @@ using http://colormind.io/bootstrap/ src: local('IBM Plex Sans Arabic Regular'), local('IBMPlexSansArabic-Regular'), url('fonts/IBMPlexSansArabic-Regular.woff2') format('woff2'); } +html { + /* Increase line-height, because Arabic font is taller than Latin and + * we need some space between lines for descenders/ascenders */ + line-height: 1.33; +} + body { font-size: 14pt; background-color: var(--light-shades); @@ -157,11 +163,6 @@ div.fingerhandstats .fingers .index { div.fingerhandstats .fingers .thumb { border: 0.1em solid var(--finger-thumb); } -div.sentencestats ul { - list-style-type: none; - margin: 1em 0; - padding: 0; -} .table-overflow { overflow-x: auto; |