Compare commits

...

350 Commits

Author SHA1 Message Date
Patrick Goldinger
ddc4f7f1ba Release v0.4.2 2024-10-17 19:12:13 +02:00
Patrick Goldinger
afea8c721f Merge branch 'main' into release/0.4 2024-10-17 19:10:49 +02:00
florisboard-bot
7dedfd4f7a Update translations from Crowdin 2024-10-17 19:07:32 +02:00
Patrick Goldinger
ef37194900 Disable compose strong skipping mode (#2637) 2024-10-17 16:51:02 +02:00
Lars Mühlbauer
58134b1ceb Add fix for sensitive clipboard suggestions (#2635) 2024-10-16 23:17:54 +02:00
Lars Mühlbauer
53cfbad404 Clipboard History enhancements (#2631)
* Hide sensitive clip data in clipboard history

* Add is remoteDevice flag

* Do not link password length to displayed characters

* Add backspace in clipboard history (#2615)

* Use ClipboardItem level function for the obfuscation of the text

* Move the backspace button to the header bar

* Adjust innerHeight to match the full layout

* Use KeyboardLikeButton instead of FlorisIconButtonWithInnerPadding
2024-10-14 19:31:37 +02:00
Patrick Goldinger
9cffcea246 Release v0.4.1 2024-10-10 20:53:19 +02:00
Patrick Goldinger
5acf80db0f Merge branch 'main' into release/0.4 2024-10-10 16:03:17 +02:00
florisboard-bot
d6f724e518 Update translations from Crowdin 2024-10-10 16:00:04 +02:00
Patrick Goldinger
6c4aa36b06 Update Crowdin configuration and workflow 2024-10-10 15:54:48 +02:00
Patrick Goldinger
edc38b6c2c Fix keyboard key size not properly updating (#2625) 2024-10-10 14:48:50 +02:00
Patrick Goldinger
891a2c6bac Update README.md 2024-10-09 15:35:16 +02:00
Patrick Goldinger
229237153b Add new release configs for Obtainium 2024-10-09 15:35:16 +02:00
Patrick Goldinger
290fbb5239 Merge pull request #2613 from florisboard/rework/inline-autofill-impl
Rework inline autofill suggestions from password managers
2024-10-08 21:59:43 +02:00
Patrick Goldinger
409d4f9348 Fix theme editor state bugs (#2620)
* Fix emoji history header not using theme style

* Fix extension editor component list state not being updated
2024-10-06 10:34:26 +02:00
Patrick Goldinger
82938cda5b Fix emojis with differing meta data not being seen as identical (#2617) 2024-10-05 14:48:26 +02:00
Patrick Goldinger
f7b0a30271 Rework Smartbar layout implementation & Remove Smartbar shared auto expand 2024-10-02 16:46:30 +02:00
Patrick Goldinger
575f359a85 Fix inline autofill service potential concurrent modification exception 2024-10-01 01:15:17 +02:00
Patrick Goldinger
22591163b3 Improve state handling for inline autofill suggestions 2024-10-01 00:30:20 +02:00
Patrick Goldinger
8104ae60ca Add inline autofill debug overlay 2024-09-30 22:34:04 +02:00
Patrick Goldinger
165b682732 Rework inline autofill UI implementation 2024-09-30 21:36:54 +02:00
Patrick Goldinger
eb770fac6c Merge pull request #2611 from florisboard/rework/emoji-history
Major rework of emoji history
2024-09-30 00:58:02 +02:00
Patrick Goldinger
39c27426a4 Add ability to manually reorder emojis in history (#1975) 2024-09-29 14:29:59 +02:00
Patrick Goldinger
228d5055cc Add ability to pin emojis in emoji history (#2273) 2024-09-29 14:05:57 +02:00
Patrick Goldinger
b400e04560 Rewrite emoji history logic and data class 2024-09-28 19:35:12 +02:00
Patrick Goldinger
27c1bbf039 Fix emoji history update bug if items is max size (#2129) 2024-09-28 15:32:10 +02:00
Patrick Goldinger
f61b655f7d Add emoji history group and enable toggle (#1990) 2024-09-28 15:19:30 +02:00
Patrick Goldinger
f82af63e97 Merge pull request #2606 from florisboard/rework/emoji-suggestions
Major rework of emoji suggestions
2024-09-28 14:17:36 +02:00
Patrick Goldinger
0fbd950f6e Change default value of show emoji name to false 2024-09-28 13:41:53 +02:00
Patrick Goldinger
e97b5f54ac Update emoji data to CLDR 45 (#2607) 2024-09-27 23:28:47 +02:00
Patrick Goldinger
b611360dd5 Add emoji acceptance updates history toggle 2024-09-27 19:37:12 +02:00
Patrick Goldinger
1b9d260020 Add emoji name visibility toggle 2024-09-27 19:24:28 +02:00
Patrick Goldinger
d74fe62bc0 Fix emoji suggestions failing for non-default skin-tones (#2604) 2024-09-27 19:04:09 +02:00
Patrick Goldinger
fe6f61a282 Rework emoji suggestions prefs 2024-09-27 18:32:16 +02:00
Senthil Vignesh Kumar
8b4239d9be Added Tamil to layout extension config (#2514)
* adding tamil to characters

* Author name fixed
2024-09-24 02:32:37 +02:00
Patrick Goldinger
a0c7cf2794 Upgrade to Kotlin 2.0 (#2597) 2024-09-24 01:59:37 +02:00
Patrick Goldinger
7480d14a0f Upgrade Compose to 1.7 & Upgrade other deps (#2596)
* Upgrade dependencies

* Code base deprecation cleanup
2024-09-24 00:38:51 +02:00
Kevin
7274228a46 Update quick action reordering based on row (#2592) 2024-09-23 14:58:54 +02:00
Patrick Goldinger
a38f6a2c76 Fix utility key action not correctly applied (#2591) 2024-09-23 13:59:04 +02:00
Krzysztof Kozyra
eda6c09538 Add delete subtype on long-press (#2580)
* add delete subtype feature

* Delete dialog switch from AlertDialog.Builder (unstyled) to JetPrefAlertDialog() to match rest of the ui

* Rework code and add new changes, add translations for subtype delete dialog

* Fix: when dialog is open and screen is rotated app crashes

* Remove translations due to contribution guidelines

* Add english translation so that the project can be built again ;)

* Revert spacing in values-ru/strings.xml

---------

Co-authored-by: lm41 <lm41@lm41.xyz>
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-09-22 22:50:49 +02:00
Patrick Goldinger
9e42d16cb0 Add workflow for automatically rejecting translation updates (#2588) 2024-09-22 22:30:16 +02:00
Lars Mühlbauer
11ba51c354 Remove placeholder suggestions (#2572) 2024-09-22 14:50:55 +02:00
Kevin
51f5196b8a Fix incognito icon messing up landscape input height (#2584) 2024-09-22 14:48:21 +02:00
Lars Mühlbauer
56bbe9d13c Update clipboard backup and restore behavior (#2547)
* Change Clipboard History Checkbox to TriStateCheckbox

* Fix history import error when files are already in ClipboardFileStorage

* Ahhhh yes, the nitpicks `:DD`

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-09-18 23:47:38 +02:00
Lars Mühlbauer
4d1ae52dc0 Localize debug log screen and add option for preformatted exporting (#2561)
* Add Button for copying the formatted debug log for GitHub and localize ExportDebugLogScreen

* Add review suggestions

* Ahh yes, we love to nitpick
2024-09-18 23:17:59 +02:00
Lars Mühlbauer
1e1916194b Remove trailing comma to comply with the JSON spec (#2560) 2024-09-18 21:59:40 +02:00
Patrick Goldinger
80fb20885b Release v0.4.0 2024-09-18 18:26:47 +02:00
Patrick Goldinger
bae3c8ec9d Fix Rust Cargo.lock file getting rewritten during build (#2568) 2024-09-18 18:25:04 +02:00
Patrick Goldinger
9ff7d86a8d Add hint to find_program for Rust discovery (#2567) 2024-09-18 16:56:20 +02:00
Patrick Goldinger
89ab0731d2 Add Cargo.lock files to VCS (#2566) 2024-09-18 07:23:24 +02:00
Patrick Goldinger
887a75a482 Rework version name handling in Gradle (#2565) 2024-09-18 05:43:48 +02:00
Patrick Goldinger
e52bea2456 Rename master to main & Update workflows (#2564)
* Update workflows to main branch

* Remove OSS plugin comment (is not used anymore)
2024-09-18 04:25:11 +02:00
Patrick Goldinger
2171e16346 Release v0.4.0-rc02 2024-09-02 22:23:40 +02:00
Lars Mühlbauer
566b6fbae3 Fix incorrect drawing behavior with display cutouts (#2533)
* Fix incorrect drawing behavior with display cutouts

* Replace old conditional logic with new function
2024-09-02 22:20:03 +02:00
Book-reader
5215227793 Fix incorrect addons store url (.com -> .org) (#2535) 2024-08-28 20:43:27 +02:00
Patrick Goldinger
671f97eddb Release v0.4.0-rc01 2024-08-23 15:59:55 +02:00
Patrick Goldinger
b6c9469826 Adjust gitignore for release.sh script 2024-08-23 14:01:35 +02:00
Lars Mühlbauer
77e4414467 Move FlorisCopyToClipboardActivity to ime.clipboard (#2531)
* Move FlorisCopyToClipboardActivity to `ime.clipboard`

* Fix image alignment
2024-08-21 21:57:54 +02:00
Lars Mühlbauer
db85e05714 Disable hinted number row toggle if number row is enabled (#2532) 2024-08-21 21:22:09 +02:00
Lars Mühlbauer
51890c93d4 Fix transparent navigation bar color on older api levels (#2529) 2024-08-21 20:45:28 +02:00
Lars Mühlbauer
1f16ac2c3b Update README.md to the current status (#2528)
* Update README.md

* Apply suggestions from code review

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-08-13 21:33:37 +02:00
Lars Mühlbauer
199211fdbf Switch to sliding navigation animation (#2527) 2024-08-13 21:13:11 +02:00
Lars Mühlbauer
c5ee414ec6 Remove preference category from ExtensionHomeScreen (#2525) 2024-08-13 02:15:25 +02:00
Patrick Goldinger
f1c5b1802b Release v0.4.0-beta03 2024-08-10 02:47:31 +02:00
Patrick Goldinger
0450c8c7a1 Fix null ptr exception in intent handling 2024-08-10 02:47:09 +02:00
florisboard-bot
6da6da74fc Update translations from Crowdin 2024-08-07 02:16:08 +02:00
Lars Mühlbauer
d7fca0aad1 Open subtype preset dialog when a new subtype is added (#2521)
* Open subtype preset dialog when a new subtype is added

* Update addons store url in build config
2024-08-07 02:13:07 +02:00
Patrick Goldinger
1af519e01d Update to Gradle 8.7 and AGP 8.5.1 (#2520) 2024-08-07 00:01:04 +02:00
Lars Mühlbauer
989d2884b1 Fix backspace icon (#2518) 2024-08-06 03:19:29 +02:00
Lars Mühlbauer
d137155ab0 Add CheckUpdatesScreen (#2509) 2024-07-15 19:12:16 +02:00
Patrick Goldinger
270ab4fe5f Add deep link support for UI (#2508) 2024-07-15 18:22:05 +02:00
klaurence
be4cd4d897 Change files of Udmurt subtype (#2445)
* Update extension.json

* Update udmurt_compact.json

* Update udmurt_compact.json
2024-07-08 03:48:22 +02:00
JP O'Neill
e46d53291b add support for the layout colemak-dhm (#2357)
Co-authored-by: JP O'Neill <oneilljp@proton.me>
2024-07-08 03:37:36 +02:00
Victor B
8292f9d4cc Add ЈЦУКЕН interslavic keyboard layout (#2354) 2024-07-08 03:37:07 +02:00
Thanh, H
192412b6dd Improve Vietnamese Telex keyboard (#2259)
* Init Full Telex

* Add Telex Rule for a__

* Add a__, ă__, â__ rule

* Update ô, ơ, ư, iê without sound

* Add ơ, iê, uyê. yê without sound

* Add ăc, ăm

* Add êm

* Add ăn

* Update ô

* Improve Vietnamese

* Add "ưc"

* Special case: "gi" + vowel + tone

* Special case: "ghi" + tone + "ê"

* Special case: "gi" + "a, u" + "tone"

* Add change tone feature: "áf" -> "à"

* Add tone remove for iê case
2024-07-08 03:23:14 +02:00
GasparAM
a7f8980d35 Added Armenian alternative phonetic layout (#2171) 2024-07-08 03:18:55 +02:00
moonbeamcelery
f5d80a5818 CJK keyboard adjustments for better Chinese input convenience (#2142)
* CJK keyboard fixes, see expanded message:

- fix full-width comma
- add () to first symbol screen popups
- merge postal sign with # popups
- add = to + popup
- add full-width = to half-width popup
- fix half-width <> and single guillemets ‹›
- add check mark to square root symbol popup
- Add [] to popups
- Add pinyin characters in popup mapping

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: issue with brackets, ü, and add cjk popup to Chinese preset

---------

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
2024-07-08 03:16:36 +02:00
Patrick Goldinger
d9b940f4f3 Add possible detection for "All keys invisible" bug (#2501) 2024-07-08 02:38:21 +02:00
Lars Mühlbauer
d86fc13cff Remove material2 dependency (#2500)
* remove material2

* fix icon rotation in smartbar

* add FB icon for Android Studio's NewUI

* Add new button styling option for clipboard history view
replace one hand mode icon

* apply review suggestions

* ah yes, the trailing commas
2024-07-08 01:54:29 +02:00
Patrick Goldinger
5b7727b884 Merge pull request #2499 from florisboard/refactor/move-lib-snygg
Move `lib.snygg` to separate module
2024-07-05 20:49:19 +02:00
Patrick Goldinger
b0649b1b7e Move lib.snygg to separate module 2024-07-05 19:43:00 +02:00
Patrick Goldinger
6244198795 Rework enum display string strategy
Preparation for further lib de-entanglement
2024-07-05 17:56:29 +02:00
Patrick Goldinger
bd9f7750aa Move lib.android to separate module (#2498) 2024-07-05 15:59:37 +02:00
Patrick Goldinger
c909d3ad7d Merge pull request #2473 from florisboard/feat/addons-support
Add addons support
2024-07-04 19:31:11 +02:00
lm41
736411e4f3 change hardcoded uri build config uri 2024-07-04 19:21:18 +02:00
lm41
9c7d980b3b localize addon manager 2024-07-04 18:47:09 +02:00
lm41
4d04eb1bb5 update ROADMAP.md 2024-06-30 17:54:11 +02:00
lm41
68c55d66be add better one hand mode icon 2024-06-28 12:40:16 +02:00
lm41
e1550d813b Remove AssetManager and switch to extension functions 2024-06-26 20:45:01 +02:00
lm41
f780ef0213 localize ExtensionValidation 2024-06-24 21:35:15 +02:00
lm41
025620a262 add FLADDONS_*** prefix to BuildConfig fields 2024-06-23 21:41:04 +02:00
lm41
4b83c907c3 simplify code 2024-06-23 19:43:51 +02:00
lm41
5542a131b9 Update UX for managing Extensions 2024-06-23 14:03:17 +02:00
kuroya
eb50498890 Add Diktor layout (#2495)
* Add Diktor layout

* change tab to spaces
2024-06-22 13:58:48 +02:00
Lars Mühlbauer
e6a408fbc0 Remove deprecated swipe-able API and switch to M3 ModalBottomSheet (#2496) 2024-06-22 13:50:14 +02:00
Lars Mühlbauer
9d76b684be Fix suggestion engine selection crash (#2492)
* fix suggestion engine selection crash

* replace rtl modifier with auto mirrored icon

* remove unnecessary OptIn annotation
2024-06-22 13:38:06 +02:00
lm41
b97cc52958 fix url encoding 2024-06-13 19:35:01 +02:00
lm41
aac7134433 add funktion to create an extension update url 2024-06-05 16:31:40 +02:00
Patrick Goldinger
f1d60d9958 Add barebones implementation for addons screen 2024-06-03 15:55:59 +02:00
lm41
e520a9c335 Prevent file/path name max length attacks 2024-06-02 13:55:39 +02:00
lm41
30294b02b4 Prevent large file size attacks by limiting the max file size to 100MB 2024-06-02 00:58:44 +02:00
Patrick Goldinger
f1bdf216fc Add error condition for failing octet-streams 2024-06-02 00:19:28 +02:00
lm41
82d43a53cc prevent zip-slip when unpacking an extension 2024-06-01 21:42:56 +02:00
Patrick Goldinger
c51a787ac4 Fix import extension intents for Firefox 2024-06-01 21:11:23 +02:00
Lars Mühlbauer
f116e20829 Remove systemuicontroller and switch to view apis (#2486) 2024-06-01 12:27:06 +02:00
lm41
baf2cbcd13 Add share import handler for .flex files 2024-05-31 18:01:03 +02:00
lm41
1edb90b0f7 change flex file importer mimetype to application/vnd.florisboard.extension+zip 2024-05-31 14:31:19 +02:00
Lars Mühlbauer
4c0c3f52e7 Smartbar enhancements (#2477)
* fix incorrect smartbar paste button state

* Add incognito mode indicator in Smartbar

* apply suggestions
2024-05-29 22:49:38 +02:00
Md. Rifat Hasan Jihan
d23575375d Updated bn-BD layout with the latest Unijoy layout (#2417)
and refined the popup keys
2024-05-29 07:51:09 +02:00
Lars Mühlbauer
e95bbf5192 Fix fullscreen input mode in portrait orientation (#2475) 2024-05-29 07:42:07 +02:00
Patrick Goldinger
0a4a4418ca Revamp theme settings screen 2024-05-13 01:53:28 +02:00
Patrick Goldinger
2c653853e2 Add basic support for importing flex files from the file explorer 2024-05-13 00:30:18 +02:00
Lars Mühlbauer
6f169997e9 Migrate Settings UI to Material 3 (#2467)
* implement material3 for the settings ui

* fix chip colors

* fix statusbar color

* fix aboutlibraries color

* fix alignment of subcheckboxen

* fix wrong card colors

* Update cornershape of the dropdown menu

* update ScrollableModifiers to material 3

* better card and background colors

* update jetpref

* change contrast of outlined cards

* apply suggestions

* implement suggestions

* add corners on text background in the theme editor

* apply the systembar color for the navbar

* set material you as default on android 12+

* fix card content padding

* Fix status bar color not adapting to navbar color state

* update jetpref dependency to 0.2.0-beta01

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-05-08 00:29:42 +02:00
Patrick Goldinger
f2e76cc72a Fix emoji suggestion logic (#2462)
* Rework emoji suggestion (#2460)

* Apply suggestions from code review

* Fix emoji suggestions caring about capitalization
2024-05-03 20:37:06 +02:00
Lars Mühlbauer
3da59cc94b Add clipboard history to backup (#2458)
* Implement backup/restore clipboard history

* Fix duplicate clipboard items when merging the same archive multiple times

* Apply suggestions

* Update UI

* Implement backup of media clipboard history items.

* Implement restore and add strings; apply suggestions

* change from popBackStack() to navigateUp()
2024-04-29 21:14:06 +02:00
Patrick Goldinger
cf7f6f5fe2 Release v0.4.0-beta02 2024-04-20 17:41:22 +02:00
Lars Mühlbauer
7724b07a75 Fix missing beta variant build issue (#2450) 2024-04-20 16:52:56 +02:00
Patrick Goldinger
30750d7842 Merge pull request #2448 from florisboard/fix-material-you-colors
Add new Material You surface colors
2024-04-20 16:24:19 +02:00
Kevin
7351a8bfa9 Implement smooth scrollbar in emoji palette (#2446)
* implement smooth scrollbar

* Code style and function visibility adjustments

* Apply suggestions from code review

Formatting

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
Co-authored-by: Lars Mühlbauer <59062169+lm41@users.noreply.github.com>

* Update app/src/main/kotlin/dev/patrickgold/florisboard/lib/compose/ScrollableModifiers.kt

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
Co-authored-by: Lars Mühlbauer <59062169+lm41@users.noreply.github.com>
2024-04-19 12:45:35 +02:00
Patrick Goldinger
7df9a93cb9 Fix issue with auto-mirroring of dropdown-like buttons 2024-04-19 12:42:56 +02:00
Patrick Goldinger
522f9a8153 Add new Material You surface colors
The following color names are now available:
- surfaceBright
- surfaceDim
- surfaceContainer
- surfaceContainerHigh
- surfaceContainerHighest
- surfaceContainerLow
- surfaceContainerLowest

These colors have replaced the color name "surface", which has been removed.

See section "Surfaces" in the blog entry https://material.io/blog/material-3-compose-1-2 for more info
2024-04-19 12:42:22 +02:00
Patrick Goldinger
5bff051d41 Fix FlorisDropdownMenu arrows being inverse in direction 2024-04-16 21:30:35 +02:00
Patrick Goldinger
0167e1231f Merge pull request #2439 from florisboard/switch-to-rust
Switch native code to Rust
2024-04-07 20:29:31 +02:00
Patrick Goldinger
97bca076e2 Fix Rust toolchain locating issues 2024-04-07 16:26:39 +02:00
Patrick Goldinger
83ec842196 Update CONTRIBUTING.md 2024-04-07 15:23:41 +02:00
Lars Mühlbauer
9c25b7f7a3 Switch to ImageVector icons (#2432)
* Remove (most) drawables and refactor codebase to use androidx.material.icons instead

* use ImageVector for ButtonBar

* use the new vectorRessource function instead of jeticon

* resolve build error

* Switch to rc jetpref

* Apply suggestions
2024-04-07 13:40:22 +02:00
Patrick Goldinger
4d78110a56 Update ROADMAP.md 2024-04-07 11:47:16 +02:00
Patrick Goldinger
2b1dd31ad7 Upgrade Gradle to 8.4 / Upgrade AGP to 8.3.1 2024-04-05 02:11:26 +02:00
Patrick Goldinger
c5d1d3b31e Add Rust build support 2024-04-05 01:35:04 +02:00
Patrick Goldinger
c198e8b376 Remove cpp native code from app 2024-04-04 17:48:52 +02:00
Patrick Goldinger
c5e7fea8f2 Remove florisboard/nlp submodule 2024-04-04 17:46:24 +02:00
Patrick Goldinger
397ef1a150 Add emoji data for most important languages (#2437) 2024-04-03 17:02:18 +02:00
Siddhesh Naik
bdd8f660c5 Add Emoji Suggestions for a More Expressive User Experience (#2385)
* Add Emoji Suggestions for a More Expressive User Experience

- Implement EmojiSuggestionProvider:
  - Manages emoji suggestion tasks, including initialization and maintenance of supported emojis.
  - Generates and returns suggestions based on user input and preferences.
- Updates in NlpManager to Include Emoji Suggestions:
  - Adds emoji suggestions when applicable and available.
- Create Custom EmojiSuggestionCandidate Class:
  - Encapsulates individual emoji suggestions for seamless integration.

Future Actions:
- Introduce Espresso tests in Florisboard to validate the emoji suggestion flow.

* Fix review comments

* Addressed review comments

- Added logic to dynamically get the locale file.
- Currently only supports English as related files are added.
- To support other locales in future, we can just add the related file.
- Added en.txt and en_US.txt and updated root.txt to match emojicon 44.1
  version.
2024-04-03 16:43:17 +02:00
Patrick Goldinger
632c4a7134 Merge pull request #2422 from florisboard/fix-clipboard-history-large-item-handling
Fix huge clipboard text items causing clipboard history crash
2024-03-23 15:15:23 +01:00
Patrick Goldinger
43e618333a Fix huge clipboard text items causing clipboard history crash (#2420) 2024-03-15 23:55:49 +01:00
Patrick Goldinger
6e1c7716dc Add generated schema 2 of clipboard database 2024-03-15 19:43:55 +01:00
Patrick Goldinger
b2a1e82963 Release v0.4.0-beta01 2024-03-10 23:09:01 +01:00
florisboard-bot
0dd1f90c83 Update translations from Crowdin 2024-03-10 22:59:09 +01:00
Lars Mühlbauer
22b7a675e4 Modularize lib.kotlin (#2404)
* extract dev.patrickgold.florisboard.lib.kotlin to org.florisboard.lib.kotlin

* apply review suggestions
2024-03-07 04:57:31 +01:00
Lars Mühlbauer
74dd67642c Fix random rotated images in threema (#2369)
* fix random rotated images in threema

* add filter for the projection

* do not filter only for orientation request but also for every other column

* Apply the suggestion

* get the orientation of the image on insert
2024-03-07 00:46:36 +01:00
Patrick Goldinger
44f0c9cd89 Merge pull request #2397 from vorgoron/feature/udmurt-layout
Add Udmurt layouts.
2024-02-29 17:13:19 +01:00
Lars Mühlbauer
28fdb423b4 Fix #2309, #2134, #2112, #2378 and some deprecation warnings (#2388)
* emoji history visibility when locked fix (#2309)

* Add POST_NOTIFICATIONS permission

* remove deprecation warning

* add better naming for readability

* rename QabType to QuickActionBarType for better readability

* add smartbar vibrations (#2134)

* add share to clipboard

* remove strings

* Add Notification permission to startup menu (#2378)

To display Notifications on Android 13+ the app nust request permission to do so.

* remove deprecation warnings (use defaultDeserializer instead of default)

* Rework NotificationPermissionState handeling on Android 13+.
If the permission is NOT_SET (the user installed the app when the permission wasn't necessary), restart the SetupScreen or add this option to the SetupScreen.
If the permission was granted or denied, the user will not be asked again even if he revokes the permission later in the settings.

* Add comments/docs to the NotificationSetup code

* Revert "remove strings"

This reverts commit ee8a62d647.

* fix crash when InputFeedbackManager is not initialized

* apply the usual formatting nitpicks

* Add the bottom sheet to CopyToClipboardActivity

* add strings

* reformat file

* fix resource context not initialized error

* apply the patch of patrick@patrickgold.dev;
Enhance the bottom sheet with swipe gestures;

* Update app/src/main/kotlin/dev/patrickgold/florisboard/FlorisCopyToClipboardActivity.kt

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

* Update app/src/main/res/values/themes.xml

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-02-29 16:41:23 +01:00
Grigory Grigorev
de169e9d0d Add udmurt layouts 2024-02-18 19:30:28 +04:00
Patrick Goldinger
ffbe7696a4 Merge pull request #2396 from florisboard/upgrade-project-dependencies
Upgrade project dependencies
2024-02-15 23:08:18 +01:00
Patrick Goldinger
57254e0ebe Upgrade about library and fix crash in third-party licenses screen 2024-02-15 03:16:28 +01:00
Patrick Goldinger
4b671b5794 Fix additional Kotlin migration issues 2024-02-15 02:39:47 +01:00
Patrick Goldinger
9cd413f2f3 Fix Android API level issues and suppress compose material import lints 2024-02-15 02:36:13 +01:00
Patrick Goldinger
777bf48b50 Fix usage of deprecated compose API 2024-02-15 02:32:21 +01:00
Patrick Goldinger
11d4ea206d Upgrade to Kotlin's new .entries shorthand for enums 2024-02-15 02:18:15 +01:00
Patrick Goldinger
8e7311ea01 Upgrade Kotlin to 1.9.22 & Upgrade project dependencies 2024-02-15 01:56:40 +01:00
Siddhesh Naik
e63186bebc Refine Clipboard Suggestion Validation to Prevent Empty and Invalid Items (#2387)
* Refine Clipboard Suggestion Validation to Prevent Empty and Invalid Items

Summary:
- This PR addresses an issue where empty or invalid clipboard items that
  could lead to incorrect suggestions.
- It introduces validation logic to ensure only meaningful content is suggested.

Context:
- The issue was observed when apps like KDE Connect added empty or special
  character-only items to the clipboard.
- The ClipboardSuggestionProvider previously lacked validation for such cases.

Changes:
- Added validation for empty clipboard items.
- Enhanced validation to handle special characters (newlines, tabs).
- Introduced private methods and constants for improved readability and maintainability.

* Update the validation with Regex
2024-02-06 04:54:48 +01:00
inson1
17ca0c1cb1 Update year in Copyright (#2391) 2024-02-04 18:59:49 +01:00
Patrick Goldinger
c9df7a9f49 Merge pull request #2372 from lm41/add-spacebar-character
Implement option to cycle throu the capitalization modes and add option to set spacebar to the spacebar character
2024-01-13 16:35:55 +01:00
lm41
0e9963bd3b refactor CapitalizationBehavior to use CapitalizationBehavior enum and resolve the requested changes 2024-01-13 15:31:25 +01:00
lm41
2cde597be6 add option to cycle through the captitalization cycle 2024-01-13 11:21:43 +01:00
Patrick Goldinger
5829ff5d07 Merge pull request #2371 from lm41/fix-wrong-primary-clipboard-entry-accessibility
fix primary clipboard entry accessible while phone is locked
2024-01-13 11:02:14 +01:00
Patrick Goldinger
9a7360bfee Merge pull request #2370 from lm41/fix-pinned-items-getting-unpinned
fix pinned items getting unpinned when copying the same content again
2024-01-13 10:56:03 +01:00
lm41
2d42ed1c06 add the option to select the spacebar character 2024-01-13 06:38:38 +01:00
lm41
031823c81c fix primary clipboard entry accessible while phone is locked 2024-01-13 03:51:29 +01:00
lm41
5b8b73ff16 fix pinned items getting unpinned when copying the same content again 2024-01-13 03:13:13 +01:00
Patrick Goldinger
80541095fd Merge pull request #2366 from lm41/issue-form
[Meta]: Switch to issue forms
2024-01-12 08:46:15 +01:00
lm41
ed7861ec12 Add issue forms 2024-01-12 02:04:58 +01:00
Patrick Goldinger
f6a1a091b5 Merge pull request #2364 from lm41/monochrome-icons
Add the monochrome icon variants
2024-01-12 00:13:26 +01:00
lm41
6d7bbc2df7 Add the monochrome icon variants 2024-01-10 23:15:56 +01:00
Patrick Goldinger
f7b65f788f Upgrade to Kotlin 1.9.21 2023-12-25 22:56:31 +01:00
Patrick Goldinger
af282693c8 Upgrade AGP to 8.2.0 & Add support for Android library modules 2023-12-25 19:50:04 +01:00
Patrick Goldinger
5bb7c6f786 Release v0.4.0-alpha06 2023-12-23 10:49:12 +01:00
Patrick Goldinger
7e1bce2cea Fix IME enabled/selected checker failing on API 34+ (#2344) 2023-12-23 10:34:09 +01:00
Patrick Goldinger
1c873e4026 Release v0.4.0-alpha05 2023-12-23 00:18:37 +01:00
Patrick Goldinger
964f5d38e5 Update texts in Settings 2023-12-23 00:08:41 +01:00
florisboard-bot
b3c0cf094a Update translations from Crowdin 2023-12-22 22:44:49 +01:00
János Benjamin Antal
6c7a4a6fc0 Add main symbols to Hungarian localization based on letter frequency (#2279) 2023-12-10 23:24:21 +01:00
Mohammad Sadegh At'hari
45aa02ca1f Add Arabic Kaf to the Persian popup (#2253)
* Remove redundant Kashida key in Persian layout

There is a Kashida(code: 1600) key inside
the popup of Dot key(code: 46). The Kashida is
a very low use character in Persian writing, so
removing it from the main layout improves the
layout usability by increasing the width of the
Space-bar.

* Add Arabic Kaf to the Persian popup

The Arabic Kaf (code: 1603) is part of the standard Persian
keyboard (ISIRI 9147), but it was missing in the current layout.

This commit adds the Arabic Kaf (code: 1603) to the popup of the Persian Kaf
(code: 1705) key, following the convention of other keys that have
both Arabic and Persian variants.
This improves the backward compatibility and accessibility of
the layout for users who need to type both scripts.

---------

Co-authored-by: Mohammad Sadegh At'hari <msadegh64@users.noreply.github.com>
2023-12-10 23:20:33 +01:00
Patrick Goldinger
2e8f06232a Merge pull request #2339 from florisboard/upgrade-and-cleanup
Upgrade traget SDK to 34 and cleanup code base
2023-12-10 23:16:42 +01:00
msrd0
9a2ba678d0 Add german variant of the dvorak layout (#2335)
* add dvorak-de layout

* fix dvorak_de modifiers

* reset app/build.gradle.kts
2023-12-10 13:38:55 +01:00
Lars Mühlbauer
4e73e2a2f7 Fix one-handed mode not extending to bottom of UI (#2340) 2023-12-10 13:25:31 +01:00
Patrick Goldinger
2a4b5b6d75 Update README.md 2023-12-10 13:01:10 +01:00
Patrick Goldinger
e5b51d8572 Upgrade Gradle to 8.1.1 2023-12-09 05:10:01 +01:00
Patrick Goldinger
a84df7d07c Migrate to using non-transitive R-classes 2023-12-09 04:58:43 +01:00
Patrick Goldinger
74f062cce7 Upgrade to target SDK 34 2023-12-09 04:52:04 +01:00
Patrick Goldinger
a4f6c0326f Move project version/buildtool meta to gradle.properties 2023-12-09 04:47:19 +01:00
Patrick Goldinger
e66bcc124f Merge pull request #2338 from florisboard/rework-build-system
Include new NLP submodule build system
2023-12-09 03:32:27 +01:00
Patrick Goldinger
6b00121a43 Include new icu4c build system 2023-12-09 03:18:41 +01:00
Patrick Goldinger
2813c64101 Upgrade Gradle to 8.1.1 and NDK to r26b 2023-12-09 02:58:45 +01:00
Patrick Goldinger
6542d43cf9 Update NLP submodule 2023-12-09 02:12:43 +01:00
klaurence
ac2df6f915 Fix wrong character in Thai number row layout (#2320)
* Update thai.json

* Update thai.json
2023-11-04 18:30:30 +01:00
Patrick Goldinger
fd98df7548 Merge pull request #2213 from 1fexd/feature/material-you-theme-colors
Implement support for Material You color selection in theme editor
2023-11-01 11:10:33 +01:00
Patrick Goldinger
d1415d6cfb Add discussion links into ROADMAP and CONTRIBUTING 2023-10-22 11:18:03 +02:00
Patrick Goldinger
3045e3e930 Merge pull request #2313 from florisboard/get-proj-back-on-track
Add new ROADMAP, CODE OF CONDUCT and rewrite CONTRIBUTING
2023-10-22 11:12:05 +02:00
Patrick Goldinger
a1b59d6e69 Adjust CONTRIBUTING file 2023-10-21 23:05:35 +02:00
Patrick Goldinger
1a0bccdf72 Add CODE OF CONDUCT
The code of conduct is based on the Contributor Covenant v2.1 standard
and has been llinked in the README
2023-10-21 15:27:04 +02:00
Patrick Goldinger
3529fa8d70 Add initial new ROADMAP 2023-10-21 15:09:52 +02:00
nettnikl
aa00eb6e79 Add Samsung Board inspired layouts for symbols (#2229)
* Add samsung board inspired layout

* Fix inconsistencies

* Rename western_samsung

* Update extension.json
2023-06-02 02:06:53 +02:00
OneSheepy
759a2ac7c7 Add Estonian layout (#2167)
* Added Estonian layout

* changed language code from 'ee' to 'et'

* added '.ee' TLD

---------

Co-authored-by: Kaspar Ormak <kaspar@messenger.ee>
2023-06-01 19:29:05 +02:00
phyrz91
f5e26917c3 Add Polish Fastlane translation (#2231)
Update polish translation

* Create short_description.txt

* Create full_description.txt
2023-06-01 19:23:18 +02:00
samo_lego
0d663bd8a1 Add Slovenian layout (#2233) 2023-06-01 12:30:32 +02:00
Clément Lyonnet
2d9605fbda Add Tamil layout (#2194)
Related to #261 & #368

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2023-06-01 12:16:42 +02:00
yanis867
50e2ab4275 Add New Kabyle (Taqbaylit) Popup Mapping (#2163) 2023-06-01 12:08:05 +02:00
Mohammad Sadegh At'hari
0708491056 Remove redundant Kashida key in Persian layout (#2227)
There is a Kashida(code: 1600) key inside
the popup of Dot key(code: 46). The Kashida is
a very low use character in Persian writing, so
removing it from the main layout improves the
layout usability by increasing the width of the
Space-bar.
2023-06-01 11:21:51 +02:00
1fexd
44e8a56610 feat: Refresh Material You colors on change 2023-05-21 20:34:44 +02:00
1fexd
158c83c972 chore: Bum Compose Material3 dependency 2023-05-17 17:53:04 +02:00
1fexd
46cced07c3 chore: Use AndroidVersion 2023-05-17 17:52:01 +02:00
1fexd
6597171011 chore: Update copyright year 2023-05-17 17:51:07 +02:00
1fexd
26ada18301 chore: Display serialized Material You color using serializer 2023-05-17 17:50:35 +02:00
1fexd
93ebbbb3de fix: Serialize Material You Light/Dark as dynamic-light-color/dynamic-dark-color 2023-05-17 17:47:23 +02:00
1fexd
215da1c0ab chore: Add SnyggMaterialYouDarkColorValue 2023-05-10 20:22:45 +02:00
1fexd
b599b807d8 feat: Implement support for Material You color selection in theme editor 2023-05-10 19:59:11 +02:00
Patrick Goldinger
deaf3295fd Merge pull request #2196 from florisboard/implement-latin-nlp-provider
Implement Latin NLP provider (part 1)
2023-05-07 18:00:54 +02:00
Patrick Goldinger
0abec78aae Remove hardcoded NDK path from build.gradle.kts (oops) 2023-05-07 15:42:21 +02:00
Patrick Goldinger
63fea7ece4 Upgrade JetPref library to 0.1.0-beta14 2023-05-07 14:45:58 +02:00
Patrick Goldinger
f11b3b837b Upgrade Kotlin to 1.8.21 / Upgrade and fix other libraries 2023-05-07 03:08:43 +02:00
Patrick Goldinger
6c879c46dc Upgrade target API level to 33 2023-05-06 20:00:08 +02:00
Patrick Goldinger
407a477c6a Update android.yml workflow 2023-05-06 19:09:26 +02:00
Patrick Goldinger
27af366234 Update nlp submodule ref 2023-05-06 19:06:17 +02:00
Patrick Goldinger
b76a25d649 Remove hardcoded ninja path from build.gradle.kts 2023-05-01 18:46:46 +02:00
Patrick Goldinger
8a2189c763 Update GitHub FlorisBoard CI workflow for new build config 2023-05-01 18:34:20 +02:00
Patrick Goldinger
c158eabedc Update nlp submodule reference to match new state with Android NDK support 2023-05-01 18:11:33 +02:00
Patrick Goldinger
ff97c6120a Adjust build system and FlorisApplication to load new ICU data properly 2023-05-01 16:44:08 +02:00
Patrick Goldinger
1314d0da93 Update build configuration for NLP subproject 2023-05-01 13:22:23 +02:00
Patrick Goldinger
1d9a5fb552 Upgrade Android NDK to r25c 2023-04-23 23:56:47 +02:00
Patrick Goldinger
4ef8e7be88 Move nlp submodule into cpp source set 2023-04-22 19:43:25 +02:00
Patrick Goldinger
a74e1fa489 Upgrade Gradle to 8.0 and AGP to 8.0.0 2023-04-22 14:32:22 +02:00
Patrick Goldinger
b9f9437fa7 Add nlp submodule 2023-04-22 14:09:37 +02:00
Patrick Goldinger
36200eba32 Remove icu4c submodule directory 2023-04-21 19:53:23 +02:00
Patrick Goldinger
d8af1a76e7 Remove submodule icu4c 2023-04-21 19:51:51 +02:00
BHydden
a47a6065df Update README.md (#2195)
Add a note on the main page explaining the current situation, as suggested in the main matrix channel

https://matrix.to/#/!LcLoPwndyZCssfevip:matrix.org/$miH4mas6b-JTKqjM2zyodK_AdLZLwAs0YfHZvakPNLA?via=matrix.org&via=tchncs.de&via=envs.net
2023-04-19 00:13:39 +02:00
moonbeamcelery
f6e58f7534 Fixes to Chinese shape-based layout: mixed language support (#2093)
* Bug fix: expected content cannot match

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Reset suggestions when switching subtypes

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Draft: record last candidate or gesture commit position to help determine composing range

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Let the NlpProvider handle last candidate or gesture commit position when determining composing range.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* draft: allow Enter to commit raw text for CJK

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add full-width comma to CJK symbols

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add minimal support for physical keyboard handling (space, enter)

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Force suggestion on for HanShapeBased to avoid user confusion

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Delete pushes lastCommitPosition back instead of resetting to -1

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: delete flogDebug without import

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: allow composing range to change based on subtype switch

* fix: bug where HanShapeBased force suggestion on not reflected in displayed candidates

* fix: for speed, stub out getListOfWords and getFrequencyForWord

* Polish LANGUAGEPACK.md. Add warning about phonetic input. Add translations.

* Move Chinese language pack README to another file

---------

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
2023-02-24 13:18:44 +01:00
Waelwindows
a5dab5fb5a Add Chinese Shape Based Layouts (#2054)
* feat(ime/nlp): Add `HanShapeBasedLanguageProvider`

* feat: Manually set default NLP to be HanShapeBased

* feat: Temporarily disable adding spaces

This commit should give insight into how the keyboard adds spaces, this
should then be refined into not adding a space after commiting a CJK
text suggestion

* fix(ime/nlp): Remove empty str suggest in HanShape

* feat(ime/nlp): Handle locale variants in HanShape

this should facilitate multiple layouts in the zh locale

* fix(ime/nlp): Handle query params in HanShape

This also helps performance as the DBC doesn't have to compile the query
for every string the user writes

* Space behavior QoL updates for Han shape-based layout (#1)

* Separate space behavior for zh* and latin, and allow space when there is no suggestion.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add checking if locale is CJK

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* refactor: Change predicate to a getter & rename

* chore: Remove TODO `supportsAutoSpace` message

* fix: Fix spaces after sugg. in non-space subtypes

* fix: Fix auto space predicate in `PhantomSpace`

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
Co-authored-by: waelwindows <waelwindows9922@gmail.com>

* Draft: editor screen exposes nlpProviders and shape-based Chinese input methods as variants

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Fix defaults for zhengma preset

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add word tables for added input methods

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Fix: bug in zhengma preset

* Draft: support composing with special characters by delegating nlpProvider to decide composing range.

* Catch SQLite errors such as layout (locale variant) not found (e.g. using HanShapeBased with JIS)

* fixup: remove TODO

* fix: partly addresses 2101, allow searching for locale in English for phones lacking system locale IME

* Adds support for importing "language packs" (sqlite3 db for HanShapeBased for now)

* Changes language pack to zip files. Adds a basic language pack class for storing metadata of IMEs.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Implement language pack as a type of Flex extension, and draft its import and view UI

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: input method name translation

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Trim down to zhengma, quickclassic, and cangjie for the barebones Chinese shape-based pack. Polish extension user documentation.

* Fix hack to allow multiple language pack extensions to co-exist.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Replace quickclassic with boshiamy

* Fix href in LANGUAGEPACKS.md

* build(nix): Clean up nix flake

* refactor: Encapsulate lanaguage pack query in HSB

* feat(ime/nlp): Implement `getListOfWords` in HSB

* feat(ime/nlp): Implement `getFrequencyForWord`

* chore: Normalize weights for freq in `han.sqlite3`

* chore(ime/nlp): Add some logging for HSB

* Update app/src/main/assets/ime/keyboard/org.florisboard.localization/extension.json

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
Co-authored-by: moonbeamcelery <114041522+moonbeamcelery@users.noreply.github.com>
Co-authored-by: moonbeamcelery <moonbeamcelery@proton.me>
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2023-01-15 17:22:10 +01:00
Softastur
9776ac1812 Add support for Asturian layout (#2138) 2023-01-04 01:31:08 +01:00
Md Rasel Hossain
099e5678f7 Add Bengali keyboard layout (#2077)
* Bengali keyboard layout

* Fix some popup keys - Bengali layout
2022-12-24 11:34:48 +01:00
Patrick Goldinger
3235472e0f Merge pull request #2108 from tsiflimagas/ci_deps
Update workflows dependencies
2022-11-08 00:58:30 +01:00
Kostas Giapis
19b934cb6c Update workflows dependencies 2022-11-06 00:39:24 +02:00
Patrick Goldinger
4b2211b5c0 Change default language display names from native to system 2022-09-15 23:58:54 +02:00
Iago
88bd544c90 Add spanish fastlane metadata (#2037)
* Add spanish fastlane metadata

* Copy es-ES metadata to androidbeta

* Remove icon

* Remove outdated changelog

* Remove outdated changelog (from beta)
2022-09-06 14:15:58 +02:00
Patrick Goldinger
31a01c8d39 Release v0.4.0-alpha04 2022-09-01 20:35:07 +02:00
florisboard-bot
d29859c6b3 Update translations from Crowdin 2022-09-01 20:30:52 +02:00
Patrick Goldinger
4c800f37f0 Comment out "auto0" placeholder logic as it is annoying (#1976) 2022-08-31 20:23:20 +02:00
Patrick Goldinger
470d302ed2 Merge pull request #2030 from florisboard/smartbar-rework-hotfixes
Smartbar rework hotfixes
2022-08-31 20:16:10 +02:00
Patrick Goldinger
ae2a1db1ef Change extended actions toggle so it closes actions overflow (#2035) 2022-08-30 18:06:24 +02:00
Patrick Goldinger
94b62b7224 Fix bottom sheet host UI causing issues in landscape input UI (#1760) 2022-08-30 17:20:55 +02:00
Patrick Goldinger
8fe84b999a Implement sticky action is overflow button if set to none (#2033) 2022-08-30 01:45:14 +02:00
Patrick Goldinger
da5b316acd Rework KeyboardState and its observing logic (#2025) 2022-08-30 00:58:07 +02:00
Patrick Goldinger
eb5fdbb08c Fix clipboard suggestions showing when they shouldn't (#2029) 2022-08-29 20:02:57 +02:00
Patrick Goldinger
ad73e3894c Fix moving all Smartbar actions to hidden causing crash (#2026) 2022-08-29 14:27:41 +02:00
Patrick Goldinger
26650d2a00 Release v0.4.0-alpha03 2022-08-28 21:52:32 +02:00
florisboard-bot
4395eac500 Update translations from Crowdin 2022-08-28 21:34:01 +02:00
Patrick Goldinger
90e60a5e03 Fix KeyboardManager observer causing crash (#2020) 2022-08-28 15:49:50 +02:00
Patrick Goldinger
e647e0d248 Fix quick actions menu for RTL languages 2022-08-27 21:09:44 +02:00
Patrick Goldinger
31c046720a Fix Smartbar source string still using old label 2022-08-26 21:07:34 +02:00
Patrick Goldinger
03b70b43a6 Update privacy policy link to new location
See https://github.com/florisboard/florisboard/discussions/2021
2022-08-25 22:39:57 +02:00
Patrick Goldinger
de2b3b9433 Merge pull request #2012 from florisboard/smartbar-actions-rework
Smartbar Quick Action Rework + directly related keyboard logic changes + incognito mode
2022-08-23 23:40:57 +02:00
Patrick Goldinger
a51f671c3c Clean up changes and fix theme element translations 2022-08-23 22:30:12 +02:00
Patrick Goldinger
314cdf79bf Fix numeric and telpad layouts row height being miscalculated 2022-08-23 21:48:40 +02:00
Patrick Goldinger
d7137b41fe Adapt all default themes to new Smartbar rules 2022-08-23 16:44:44 +02:00
Patrick Goldinger
acad9f66a6 Fix actions editor screen not clearing flag sometimes 2022-08-23 16:15:59 +02:00
Patrick Goldinger
8d0565854c Fix NLP manager bindings not setting private session flag 2022-08-23 16:08:26 +02:00
Patrick Goldinger
6932fecbbd Improve actions overflow theme and style capabilities 2022-08-23 15:32:51 +02:00
Patrick Goldinger
3e6ed3d7b0 Fix state bug with drag marker in customize action order screen 2022-08-23 14:44:47 +02:00
Patrick Goldinger
85e76892b7 Fix quick actions overflow crashing in landscape mode (#2020) 2022-08-23 14:24:14 +02:00
Patrick Goldinger
65cbc4bea3 Implement Smartbar action order customization screen (#1612) 2022-08-23 14:08:24 +02:00
Patrick Goldinger
79d177144a Add autocorrect toggle placeholder message 2022-08-22 12:56:24 +02:00
Patrick Goldinger
8cb2b0bfa7 Implement incognito mode and toggle (#153, #617) 2022-08-22 12:20:19 +02:00
Patrick Goldinger
201de6a6db Adjust and fix keyboard height calculation (#1561) 2022-08-21 23:03:21 +02:00
Patrick Goldinger
f65b11bc6d Remove obsolete clipboard cursor row 2022-08-20 14:45:51 +02:00
Patrick Goldinger
86031bb428 Fix candidate row scrollbar height being too tall 2022-08-20 13:46:06 +02:00
Patrick Goldinger
58f62e1bd5 Animate background color and add ripple effect to quick action 2022-08-20 13:42:21 +02:00
Patrick Goldinger
6212e35382 Fix FlorisImeTheme not initializing MaterialTheme at all 2022-08-20 13:41:36 +02:00
Patrick Goldinger
c8d0c6269f Properly implement actions overflow panel 2022-08-19 18:55:40 +02:00
Patrick Goldinger
e6f40932ed Rework Smartbar themeing and make minor sizing adjustments 2022-08-18 22:49:41 +02:00
Patrick Goldinger
f8af02c400 Add support for tooltips on Smartbar actions (#1094) 2022-08-16 18:59:31 +02:00
Patrick Goldinger
932a7c3126 Add base logic and UI for Smartbar actions overflow menu 2022-08-14 13:12:35 +02:00
Patrick Goldinger
f0c2ac566f Move Smartbar display mode pref from Typing to Smartbar screen 2022-08-13 14:44:55 +02:00
Patrick Goldinger
19224e5f18 Rework Smartbar screen and introduce new Smartbar layouts 2022-08-13 14:36:28 +02:00
Patrick Goldinger
6c325af80e Remove SmartbarRowType enum and related resources
Is superseded by the fact that all surfaces (except candidates and inline autofill) are now action buttons and freely reorder-able. As such there is no need anymore to distinguish between row types.
2022-08-12 18:32:10 +02:00
Patrick Goldinger
bb82b78cb7 Fix auto action expansion interfering with arrow keys (#1674) 2022-08-11 21:34:06 +02:00
Patrick Goldinger
eb30eed735 Fix quick action icon size too small for landscape (#1781) 2022-08-11 18:51:30 +02:00
Patrick Goldinger
3198977143 Rework base implementation of QuickAction and it's composables 2022-08-11 18:49:33 +02:00
Patrick Goldinger
f3b3c21aaa Add Incognito mode and Autocorrect toggle icons and key codes
For later use in the quick actions rework as a placeholder before it gets implemented in the logic
2022-08-11 18:48:05 +02:00
Patrick Goldinger
0606afbb64 Rework ComputingEvaluator interface and eliminate RenderInfo 2022-08-09 23:33:50 +02:00
Patrick Goldinger
5362df02a5 Merge pull request #2003 from florisboard/improve-sounds-and-vibration-screen
Improve sounds and vibration screen
2022-08-09 16:46:27 +02:00
Patrick Goldinger
3d15bd7f46 Transform "Use vibrator directly" into list pref (#1919) 2022-08-06 11:13:05 +02:00
Patrick Goldinger
15e94ecf2c Merge audio/vibration enable and ignore system prefs (#1919)
The enable pref is now a list preference with a built-in switch, this means the force-on (ignore) toggle is now a list pref, which can be used if audio/vibration is enabled via the built-in switch.
2022-08-06 10:25:16 +02:00
Patrick Goldinger
ebb3873fe4 Improve vibration duration and strength error messages (#1919) 2022-08-04 23:50:26 +02:00
Patrick Goldinger
c1231cd964 Add preview for vibration duration/strength (#1173)
Issue that remains for clicks on the slider bar: https://issuetracker.google.com/issues/181415195
2022-08-04 22:40:48 +02:00
Patrick Goldinger
53ab0a3fa0 Release v0.4.0-alpha02 2022-08-03 23:14:59 +02:00
Patrick Goldinger
aeeff67d2e Adjust Settings UI home message and version number (#1942) 2022-08-03 23:12:33 +02:00
florisboard-bot
4343703eb3 Update translations from Crowdin 2022-08-03 23:00:58 +02:00
Patrick Goldinger
5f09bdbce2 Add implementation for notifySuggestionReverted() 2022-08-03 12:18:25 +02:00
Kostas Giapis
3a3e3625f2 Fix uppercase Greek vowels popups (#1981)
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-08-02 21:47:42 +02:00
Patrick Goldinger
bdf14c1997 Add numeric row manual shifting symbols (#1988) 2022-08-01 13:09:04 +02:00
Patrick Goldinger
d6e064ae00 Fix composer not allowing multiple code points (#1984) 2022-08-01 11:54:41 +02:00
Patrick Goldinger
1012094568 Fix accent ordering of z in Polish popup mapping (#1960) 2022-07-31 09:29:46 +02:00
Patrick Goldinger
4117537ff2 Disable unnecessary app icon sync in Settings UI for Android 10+ 2022-07-29 20:18:18 +02:00
Patrick Goldinger
2a72cb70d6 Remove deprecated Accompanist Insets library 2022-07-28 22:36:05 +02:00
Patrick Goldinger
b1cd9d9389 Rework and improve splash screen of Settings UI
Especially fixes the splash screen for Android 7-11 devices, which utilize the SplashScreen compat library and where the app icon did not draw correctly.

Additionally an unnecessary intermediate splash screen background step has been removed, which should improve Settings UI cold startup time slightly and make it seem more snappy.
2022-07-28 22:25:15 +02:00
Patrick Goldinger
568dfc973d Upgrade Compose to 1.2.0 / Upgrade other dependencies 2022-07-28 16:53:26 +02:00
Patrick Goldinger
2e74cec0db Upgrade Kotlin to 1.7.10 and Compose Compiler to 1.3.0-rc01 2022-07-28 15:51:57 +02:00
Patrick Goldinger
db378159d6 Decouple Jetpack Compose Compiler version from other Compose packages
This change has been done as Google decouples the Compiler release from the rest of Compose packages to allow for faster upgrades of the Kotlin version.

Source: https://android-developers.googleblog.com/2022/06/independent-versioning-of-Jetpack-Compose-libraries.html
2022-07-28 15:37:38 +02:00
Patrick Goldinger
50ff2d8f1b Merge pull request #1974 from florisboard/networkutils-and-clipboard-fixes
Clipboard and NetworkUtils regex fixes
2022-07-27 20:47:34 +02:00
Patrick Goldinger
061495fb27 Improve host regex accuracy for clipboard URL extraction (#1971) 2022-07-27 17:01:47 +02:00
Patrick Goldinger
40cb59ddfd Fix extracted URLs not checking for duplicates (#1971) 2022-07-27 16:51:06 +02:00
Patrick Goldinger
38affddc9e Fix extracted phone numbers not stripping parentheses (#1971) 2022-07-27 16:47:24 +02:00
Patrick Goldinger
17dcb90473 Partly disable smart clipboard on Android 7.0 and 7.1 (#1970)
Android 7.0 and 7.1 do not support named regex groups natively, which causes a crash.
2022-07-27 14:44:32 +02:00
Patrick Goldinger
772402b46f Fix domains get extracted from emails in clipboard (#1971) 2022-07-27 13:58:40 +02:00
Patrick Goldinger
29bd8a289c Add clipboard phone number detection (#1889, #1971) 2022-07-27 13:42:17 +02:00
Patrick Goldinger
79d9e73608 Fix phantom spacing for 1 letter words (#1940) 2022-07-26 15:44:12 +02:00
Patrick Goldinger
b04f8d75f3 Adjust AutoTextKey behavior to respect subtype locale (#1840) 2022-07-26 15:43:19 +02:00
Kostas Giapis
32b1d123d2 Add circumflex popups to Turkish layout (#1962)
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-07-26 15:37:45 +02:00
Patrick Goldinger
b576cafaa4 Upgrade dependencies and adapt API changes 2022-07-24 17:50:15 +02:00
Patrick Goldinger
312ef93ffc Fix auto-spacing incorrectly triggered (#1947)
Issue only occurred for non-Appender composers
2022-07-19 00:07:34 +02:00
Patrick Goldinger
a1dda0c247 Upgrade JetPref to 0.1.0-beta12 2022-07-11 01:27:29 +02:00
Patrick Goldinger
0c36b96922 Update README.md to fix inconsistency with roadmap 2022-07-07 23:56:30 +02:00
Patrick Goldinger
07e92f052b Release v0.4.0-alpha01 2022-07-06 17:56:53 +02:00
florisboard-bot
244c834de9 Update translations from Crowdin 2022-07-06 17:51:08 +02:00
Vlad
61b5c2cffd Correct layout name for RU&UA (ЙЦУКЕН) (#1681) 2022-07-06 16:39:44 +02:00
Leonardo Hernández
1441bd63cb Refactor and improve C++ codebase (#1895)
* close unused fd

dup2 doesn't close old fds, it only duplicates them.

* use `extern "C"` by block instead individual

also formatting changes for function parameters

* fix a memory leak

* cpp refactor: add utils::log() which takes log_priority

* std{out,err} logger: various improvements

- use std::thread rather than pthread
- redirect std{out,err} to stdin to avoid read() calls
- don't use global variables, for avoid spawning unneeded threads use a static function variable
- check for errors in pipe()
- use a lambda function for thread
2022-07-06 16:15:27 +02:00
Patrick Goldinger
e7d0db0fc0 Merge pull request #1913 from florisboard/sug04-prepare-UI-logic-interface
0.4/Phase 1: Prepare UI, suggestions interface and adjust logic
2022-07-06 11:48:00 +02:00
Patrick Goldinger
a87d340b25 Adjust experimental and NYI banners in Typing screen 2022-07-06 02:11:24 +02:00
Patrick Goldinger
3f0d90cb7c Add auto-spacing after punctuation (#375)
Key notes:
- It only works in rich editors
- It intentionally does NOT work in URL, EMAIL and PASSWORD text fields
- May break for exotic characters (aka everything not representable with one char in UTF-16)
- There's no hardcoded language restriction, however it is tailored towards symbols used mostly in Latin-based languages atm
- Performance checking needs to be redone for the commitChar() method
2022-07-06 01:35:02 +02:00
Patrick Goldinger
b9e9f9b122 Implement suggestion user removal 2022-07-05 02:21:57 +02:00
Patrick Goldinger
f2d1cf3baf Rework clipboard suggestions logic and allow for multiple items (#739) 2022-07-05 01:07:58 +02:00
Patrick Goldinger
cf1112327a Rework typing preference screen and integrate spelling 2022-07-04 23:29:15 +02:00
Patrick Goldinger
c2cb28668d Implement candidate auto-commit logic 2022-07-04 19:30:39 +02:00
Patrick Goldinger
75f4fcb91a Expand provider API with suggestions removal and notify events 2022-07-04 02:50:18 +02:00
Patrick Goldinger
3d92bd0584 Document EditorContent getters and companion object 2022-07-04 23:10:03 +02:00
Patrick Goldinger
52ca98a14d Improve NlpManager and provider API 2022-07-02 20:40:37 +02:00
Patrick Goldinger
629a73a5cf Document and improve SpellingResult 2022-07-01 20:02:10 +02:00
Patrick Goldinger
077ec43855 Add Liberapay option to FUNDING.yml (#1434) 2022-07-01 17:18:17 +02:00
Patrick Goldinger
3ecd3618cb Add baseline for keyboard and provider logic bridge 2022-07-01 01:27:41 +02:00
Patrick Goldinger
38bc34913b Rework and improve internal APK assets file handling 2022-06-30 00:08:03 +02:00
Patrick Goldinger
c733e5ceea Extend Android asset manager API to simplify usage 2022-06-29 22:24:05 +02:00
Patrick Goldinger
e2536ceb92 Remove duplicate NATIVE_NULLPTR 2022-06-28 23:10:13 +02:00
Patrick Goldinger
c17b6f073d Switch from LiveData to StateFlow in some manager classes 2022-06-28 22:10:22 +02:00
Patrick Goldinger
936b177776 Rework spell checker config and add utility script 2022-06-27 22:42:59 +02:00
Patrick Goldinger
7d8036fe69 Remove Nuspell spell check implementation (#1921) 2022-06-27 18:49:59 +02:00
Patrick Goldinger
6d08d1a265 Add sentence break iterator caching 2022-06-27 16:25:57 +02:00
Patrick Goldinger
48aba1c055 Add skeleton for new NLP provider API 2022-06-26 23:49:42 +02:00
Patrick Goldinger
0b3d3317bf Add secondary text UI implementation for candidates 2022-06-25 16:42:59 +02:00
Patrick Goldinger
d1fbdc581b Update roadmap's milestone 0.4 phase 1 2022-06-24 18:46:08 +02:00
Patrick Goldinger
044170eb4b Fix auto-capitalization issues with invalid initial state (#1915) 2022-06-24 03:25:28 +02:00
Patrick Goldinger
a7c16b3ceb Improve state reset mechanism for restarts (#1916) 2022-06-24 01:18:21 +02:00
Patrick Goldinger
dd12be2275 Rework and document candidate item API 2022-06-24 00:39:44 +02:00
Patrick Goldinger
1049bc543a Move package smartbar from ime.text to ime 2022-06-23 19:50:22 +02:00
Patrick Goldinger
5c5ad3cd32 Remove unused TextProcessor class 2022-06-21 14:48:35 +02:00
Patrick Goldinger
6fce521122 Fix candidate completion logic not behaving as expected 2022-06-20 23:02:39 +02:00
Patrick Goldinger
2af9941ea6 Add Costa Rican colón currency set (#1914) 2022-06-20 22:00:47 +02:00
Patrick Goldinger
9b24f742d1 Disable auto-capitalization for Thai language (#1908) 2022-06-20 00:05:44 +02:00
Patrick Goldinger
b36bcf7733 Tie composing region indicator to suggestion enabled state (#1911) 2022-06-19 23:46:14 +02:00
Patrick Goldinger
9559dbdcd6 Update roadmap for 0.4 milestone 2022-06-19 21:53:42 +02:00
Patrick Goldinger
668dd4b5bf Fix changelog for 0.3.16 accidentally stored in beta metafolder 2022-06-13 10:57:29 +02:00
601 changed files with 49097 additions and 20948 deletions

View File

@@ -9,7 +9,7 @@ insert_final_newline = true
max_line_length = 120
trim_trailing_whitespace = true
[{*.har,*.json,*yml}]
[{*.har,*.json,*yml,*.sh}]
indent_size = 2
[*.kt]

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use_flake

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,3 @@
github: [patrickgold]
liberapay: patrickgold
custom: ["https://paypal.me/devpatrickgold"]

View File

@@ -1,34 +0,0 @@
---
name: Bug report
about: Create a report to help FlorisBoard improve
title: ''
labels: bug
assignees: ''
---
<!--
Thank you for your help in making FlorisBoard better!
Guide to a good bug-report:
• Please search existing bug/crash reports reports to avoid creating duplicates.
• Give your bug report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe the bug in a short but concise way.
• If you have a screenshot or screen recording of the bug, link them at the end of this issue.
• Also make sure to fill out the environment information. This info is valuable when trying to fix your described bug.
-->
#### Short description
Describe the bug in a short but concise way.
#### Steps to reproduce
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See error
#### Environment information
- FlorisBoard Version: <!-- e.g. 0.X.X -->
- Install Source: <!-- Google PlayStore/F-Droid/GitHub/? -->
- Device: <!-- e.g. OnePlus 7T -->
- Android: <!-- e.g. 10, Stock -->

64
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,64 @@
name: Bug Report
description: Create a report to help FlorisBoard improve
labels:
- "bug"
body:
- type: markdown
attributes:
value: |
Thank you for your help in making FlorisBoard better!
Guide to a good bug-report:
• Please search existing bug/crash reports reports to avoid creating duplicates.
• Give your bug report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe the bug in a short but concise way.
• If you have a screenshot or screen recording of the bug, link them at the end of this issue.
• Also make sure to fill out the environment information. This info is valuable when trying to fix your described bug.
- type: textarea
id: description
attributes:
label: Short description
description: Describe the bug in a short but concise way.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
value: |
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See error
validations:
required: true
- type: input
id: florisversion
attributes:
label: FlorisBoard Version
placeholder: e.g. 0.X.X
validations:
required: true
- type: dropdown
id: installsource
attributes:
label: Install Source
options:
- Google PlayStore
- F-Droid
- GitHub
validations:
required: true
- type: input
id: device
attributes:
label: Device
placeholder: e.g. OnePlus 7T
validations:
required: true
- type: input
id: androidversion
attributes:
label: Android
placeholder: e.g. 10, Stock
validations:
required: true

View File

@@ -1,28 +0,0 @@
---
name: Crash report
about: Create a report with a generated crash log attached to help FlorisBoard improve
title: ''
labels: bug
assignees: ''
---
<!--
Thank you for your help in making FlorisBoard better!
Guide to a good crash-report:
• Please search existing bug/crash reports to avoid creating duplicates.
• Give your crash report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe what you were doing what could've led to the crash and whether the crash is random or reproducible.
-->
#### Short description
Describe what you were doing that could've led to the crash.
#### Steps to reproduce
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See crash
<!-- Paste the generated crash log below -->

38
.github/ISSUE_TEMPLATE/crash_report.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: Crash report
description: Create a report with a generated crash log attached to help FlorisBoard improve
labels:
- "bug"
body:
- type: markdown
attributes:
value: |
Thank you for your help in making FlorisBoard better!
Guide to a good crash-report:
• Please search existing bug/crash reports to avoid creating duplicates.
• Give your crash report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe what you were doing what could've led to the crash and whether the crash is random or reproducible.
- type: textarea
id: description
attributes:
label: Short description
description: Describe the bug in a short but concise way.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
value: |
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See crash
validations:
required: true
- type: textarea
id: crashlog
attributes:
label: Crash log
description: Paste the generated crash log below
validations:
required: true

View File

@@ -1,18 +0,0 @@
---
name: Feature request / Suggestion
about: Suggest an idea for this project
title: ''
labels: proposal
assignees: ''
---
<!--
Thank you for your help in making FlorisBoard better!
Guide to a good feature-request:
• Please search existing proposals to avoid creating duplicates.
• If you have multiple ideas which are not directly connected to other, file a new issue for each idea. This makes it easier to implement your proposals.
• Describe your idea in a short but concise way.
• If you have any examples, e.g. screenshots or other keyboards have the proposed feature implemented, feel free to post them after your description.
-->

View File

@@ -0,0 +1,22 @@
name: Feature request / Suggestion
description: Suggest an idea for this project
labels:
- "proposal"
body:
- type: markdown
attributes:
value: |
Thank you for your help in making FlorisBoard better!
Guide to a good feature-request:
• Please search existing proposals to avoid creating duplicates.
• If you have multiple ideas which are not directly connected to other, file a new issue for each idea. This makes it easier to implement your proposals.
• Describe your idea in a short but concise way.
• If you have any examples, e.g. screenshots or other keyboards have the proposed feature implemented, feel free to post them after your description.
- type: textarea
id: feature
attributes:
label: Feature idea
description: Please explain your idea in a precise way.
validations:
required: true

View File

@@ -2,38 +2,40 @@ name: FlorisBoard CI
on:
push:
branches: [ master ]
branches: [ main ]
paths-ignore:
- ".github/ISSUE_TEMPLATE/**"
- ".github/FUNDING.yml"
- ".editorconfig"
- "fastlane/**"
- "CONTRIBUTING.md"
- "CODE_OF_CONDUCT.md"
- "LICENSE"
- "README.md"
- "ROADMAP.md"
pull_request:
branches: [ master ]
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Checkout submodules
run: git submodule update --init --recursive
- name: set up JDK 11
uses: actions/setup-java@v1
- uses: actions/checkout@v4
with:
java-version: 11
- name: Setup CMake and Ninja
uses: lukka/get-cmake@v3.20.1
submodules: recursive
- uses: gradle/actions/wrapper-validation@v3
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: temurin
- name: Set up CMake and Ninja
uses: lukka/get-cmake@latest
- name: Build with Gradle
# MUST call gradlew separately because of an OSS license plugin issue.
# See https://github.com/google/play-services-plugins/issues/199
run: ./gradlew clean && ./gradlew assembleDebug
- uses: actions/upload-artifact@v2
run: ./gradlew clean assembleDebug
- uses: actions/upload-artifact@v4
with:
name: app-debug.apk
path: app/build/outputs/apk/debug/app-debug.apk

View File

@@ -2,7 +2,7 @@ name: Crowdin Upload Sources
on:
push:
branches: [ master ]
branches: [ main ]
paths:
- "app/src/main/res/values/strings.xml"
- ".github/workflows/crowdin-upload.yml"
@@ -13,9 +13,9 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Upload
uses: crowdin/github-action@1.4.0
uses: crowdin/github-action@v2
with:
config: "crowdin.yml"
upload_sources: true

View File

@@ -0,0 +1,61 @@
name: Validate no translated strings.xml included
on:
pull_request_target:
branches: [ main ]
jobs:
validate:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Precheck if validation is required
id: precheck
run: |
pr_author="${{ github.event.pull_request.user.login }}"
if [[ "$pr_author" == "florisboard-bot" ]]; then
echo "PR is by florisboard-bot, skipping validation!"
echo "require_validation=false" >> "$GITHUB_OUTPUT"
else
echo "PR is not by florisboard-bot, requiring validation!"
echo "require_validation=true" >> "$GITHUB_OUTPUT"
fi
- name: Fetch PR changed files manually
id: fetch_changed_files
if: steps.precheck.outputs.require_validation == 'true'
run: |
pr_files="$(curl -sSf https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files?per_page=1000)" || exit 11
changed_files="$(jq -r '.[].filename' <<< "$pr_files")" || exit 12
illegal_changes_list="$(grep -E '^app/src/main/res/values-.+/strings.xml$' <<< "$changed_files")" || true
if [ -n "$illegal_changes_list" ]; then
echo -e "Illegal changes detected:\n$illegal_changes_list"
else
echo "No illegal changes detected"
fi
echo "illegal_changes_list<<EOF" >> "$GITHUB_OUTPUT"
echo "$illegal_changes_list" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
- name: Create comment if illegal files detected
uses: peter-evans/create-or-update-comment@v4
if: steps.precheck.outputs.require_validation == 'true' && steps.fetch_changed_files.outputs.illegal_changes_list != ''
with:
issue-number: ${{ github.event.pull_request.number }}
body: |
⚠️ Illegal changes detected
Hey there!
We detected illegal changes that disobey the [contribution guidelines](https://github.com/florisboard/florisboard/blob/main/CONTRIBUTING.md#translation). This is a kind reminder that pull requests must not contain translated `strings.xml` files, as those are exclusively managed from Crowdin.
Please remove changes to the following files:
```
${{ steps.fetch_changed_files.outputs.illegal_changes_list }}
```
- name: Fail workflow if illegal files detected
if: steps.precheck.outputs.require_validation == 'true' && steps.fetch_changed_files.outputs.illegal_changes_list != ''
run: echo -e "Illegal changes detected:\n${{ steps.fetch_changed_files.outputs.illegal_changes_list }}" && exit 1

17
.gitignore vendored
View File

@@ -1,7 +1,11 @@
# Built application files
*.apk
*.aab
*.ap_
# dotenv
.env
# Files for the ART/Dalvik VM
*.dex
@@ -43,3 +47,16 @@ crowdin.properties
# C++
.cxx/
# Nix stuff
.direnv/
result
# VSCode
.vscode/
# Rust
debug/
target/
**/*.rs.bk
*.pdb

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "app/src/main/icu4c"]
path = app/src/main/icu4c
url = https://github.com/florisboard/icu4c

226
.idea/icon.svg generated Normal file
View File

@@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="vector"
width="108"
height="108"
viewBox="0 0 108 108"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs10">
<radialGradient
gradientUnits="userSpaceOnUse"
r="20.594"
cx="54.141998"
cy="48.769001"
id="gradient_0"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#55E032FF"
id="stop1" />
<stop
offset="1"
stop-color="#227C53FF"
id="stop2" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="20.594"
cx="54.141998"
cy="48.769001"
id="gradient_1"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#55E032FF"
id="stop3" />
<stop
offset="1"
stop-color="#227C53FF"
id="stop4" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="12.849"
cx="54.029999"
cy="39.144001"
id="gradient_2"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#FE7901FF"
id="stop5" />
<stop
offset="1"
stop-color="#FEBE01FF"
id="stop6" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="20.594"
cx="54.141998"
cy="48.769001"
id="gradient_3"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#55E032FF"
id="stop7" />
<stop
offset="1"
stop-color="#227C53FF"
id="stop8" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="17.913"
cx="54.131001"
cy="49.819"
id="gradient_4"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#FE7901FF"
id="stop9" />
<stop
offset="1"
stop-color="#FEBE01FF"
id="stop10" />
</radialGradient>
</defs>
<path
fill="url(#gradient_0)"
d="m 12.291915,34.438502 0.434238,0.0066 c 20.014377,0.256595 36.184221,16.58873 36.184221,36.666707 v 6.504782 C 46.434346,77.090222 43.999987,76.362108 41.642388,75.436613 27.045007,69.710386 16.044337,56.538532 13.081437,41.131892 12.655973,38.923423 12.392799,36.686445 12.289722,34.440694 Z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_0"
style="fill:url(#gradient_0);stroke-width:2.19311" />
<path
fill="url(#gradient_1)"
d="m 41.438428,33.83978 c 1.451843,-7.875479 5.219616,-15.404446 11.305513,-21.490344 0.497838,-0.497837 1.004447,-0.980322 1.524216,-1.449649 0.517575,0.469327 1.026378,0.951812 1.526409,1.449649 6.074931,6.077125 9.842705,13.595127 11.29674,21.459641 -5.296375,4.153762 -9.689186,9.412854 -12.829729,15.428571 -3.136156,-5.974047 -7.53774,-11.23314 -12.823149,-15.395674 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_1"
style="fill:url(#gradient_1);stroke-width:2.19311" />
<path
fill="url(#gradient_2)"
d="M 33.758135,28.900884 C 35.892037,20.613098 40.199317,12.774901 46.684361,6.2876637 48.478331,4.4936948 50.377569,2.8642095 52.362338,1.4035943 L 54.268157,0 56.176168,1.4035943 c 1.984769,1.4628084 3.884009,3.0901005 5.677977,4.8840694 6.480658,6.4806583 10.790132,14.3210483 12.924033,22.6022543 -2.015473,1.030764 -3.949802,2.199695 -5.783247,3.49802 C 67.332549,24.486141 63.437574,16.961559 57.307815,10.833993 56.548998,10.072982 55.768249,9.3492537 54.965567,8.6584222 L 54.265964,8.0553153 53.56636,8.6584222 C 52.765872,9.3492537 51.985123,10.072982 51.226304,10.833993 45.089966,16.970332 41.190606,24.503686 39.53261,32.414255 37.694779,31.111545 35.764837,29.933841 33.753749,28.900884 Z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_2"
style="fill:url(#gradient_2);stroke-width:2.19311" />
<path
fill="url(#gradient_3)"
d="m 96.244398,34.438502 -0.434237,0.0066 c -20.01657,0.256595 -36.186415,16.58873 -36.186415,36.666707 v 6.506976 C 79.890332,73.322449 95.279427,55.74901 96.244398,34.440694 Z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_3"
style="fill:url(#gradient_3);stroke-width:2.19311" />
<path
fill="url(#gradient_4)"
d="m 12.68887,25.874383 0.149132,0.0022 c 4.506853,0.05702 8.996162,0.787328 13.290282,2.168991 11.959063,3.851112 21.891685,12.759549 27.168322,24.058483 l 0.973744,2.083461 0.969357,-2.085654 C 62.347596,36.789522 77.776168,26.104661 95.702698,25.876577 l 0.149133,-0.0022 c 0.291684,2.098811 0.443009,4.241486 0.445201,6.421443 l -0.510995,0.0066 C 74.600536,32.576546 57.485458,49.860493 57.485458,71.111788 v 6.917088 c -1.048309,0.155711 -2.046178,0.188608 -3.079135,0.192995 h -0.13378 c -1.068047,0 -2.144867,-0.07238 -3.212915,-0.219313 v -6.89077 c 0,-21.251295 -17.117271,-38.535242 -38.300578,-38.809382 l -0.510997,-0.0066 c 0,-2.147061 0.149133,-4.296315 0.445203,-6.421443 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_4"
style="fill:url(#gradient_4);stroke-width:2.19311" />
<path
fill="#53cd53"
d="m 101.9772,99.716601 c 0,-2.46287 -1.997925,-4.462992 -4.460795,-4.462992 H 85.243728 c -2.460676,0 -4.460798,1.997929 -4.460798,4.462992 v 3.822599 c 0,2.46068 1.997928,4.4608 4.460798,4.4608 h 12.272677 c 2.460676,0 4.460795,-1.99793 4.460795,-4.4608 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_5"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 78.620517,84.818763 c 0,-2.460676 -1.997928,-4.460798 -4.460797,-4.460798 h -6.096864 c -2.460676,0 -4.460798,1.997929 -4.460798,4.460798 v 3.824795 c 0,2.460676 1.997929,4.460798 4.460798,4.460798 h 6.096864 c 2.460676,0 4.460797,-1.997929 4.460797,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_6"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 61.450612,84.818763 c 0,-2.460676 -1.997929,-4.460798 -4.460798,-4.460798 h -6.09467 c -2.460676,0 -4.460798,1.997929 -4.460798,4.460798 v 3.824795 c 0,2.460676 1.997929,4.460798 4.460798,4.460798 h 6.09467 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_7"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 27.11738,84.818763 c 0,-2.460676 -1.997929,-4.460798 -4.460798,-4.460798 h -6.096863 c -2.460676,0 -4.460798,1.997929 -4.460798,4.460798 v 3.824795 c 0,2.460676 1.997929,4.460798 4.460798,4.460798 h 6.096863 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_8"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 95.78823,84.818763 c 0,-2.460676 -1.997929,-4.460798 -4.460798,-4.460798 h -6.09467 c -2.462869,0 -4.462991,1.997929 -4.462991,4.460798 v 3.824795 c 0,2.460676 1.997928,4.460798 4.462991,4.460798 h 6.09467 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_9"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 21.038062,69.923119 c 0,-2.46287 -1.997928,-4.462991 -4.460797,-4.462991 h -6.09467 c -2.4606765,0 -4.4607984,1.997929 -4.4607984,4.462991 v 3.822601 c 0,2.460676 1.9979288,4.460798 4.4607984,4.460798 h 6.09467 c 2.460676,0 4.460797,-1.997928 4.460797,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_10"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 101.9772,69.923119 c 0,-2.46287 -1.997925,-4.462991 -4.460795,-4.462991 h -6.09467 c -2.460676,0 -4.460797,1.997929 -4.460797,4.462991 v 3.822601 c 0,2.460676 1.997928,4.460798 4.460797,4.460798 h 6.09467 c 2.460676,0 4.460795,-1.997928 4.460795,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_11"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 44.282899,84.818763 c 0,-2.460676 -1.997928,-4.460798 -4.460798,-4.460798 h -6.09467 c -2.462869,0 -4.462991,1.997929 -4.462991,4.460798 v 3.824795 c 0,2.460676 1.99793,4.460798 4.462991,4.460798 h 6.09467 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_12"
style="stroke-width:2.19311" />
<path
fill="#fe9801"
d="m 27.21607,99.716601 c 0,-2.46287 -1.997928,-4.462992 -4.460798,-4.462992 H 10.482595 c -2.4606765,0 -4.4607984,1.997929 -4.4607984,4.462992 v 3.822599 c 0,2.46068 1.9979288,4.4608 4.4607984,4.4608 h 12.272677 c 2.460676,0 4.460798,-1.99793 4.460798,-4.4608 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_13"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 83.756795,67.041365 c 0.655742,0.776363 1.054889,1.783003 1.054889,2.881754 v 3.822601 c 0,2.460676 -1.997928,4.460798 -4.460798,4.460798 h -6.096863 c -1.557112,0 -2.927809,-0.798293 -3.723911,-2.006701 4.91258,-2.307158 9.377765,-5.414803 13.226683,-9.158452 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_14"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 24.529503,66.738714 c 3.796284,3.76558 8.20664,6.919282 13.066585,9.263722 -0.774169,1.320257 -2.210661,2.204082 -3.848919,2.204082 h -6.096862 c -2.460676,0 -4.460798,-1.997928 -4.460798,-4.460798 v -3.822601 c 0,-1.247883 0.510996,-2.375144 1.337801,-3.186598 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_15"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 14.015705,51.362778 c 1.868535,4.322632 4.359915,8.346999 7.366677,11.950289 h -4.822663 c -2.460676,0 -4.460798,-1.997928 -4.460798,-4.460797 v -3.824795 c 0,-1.517637 0.758819,-2.85763 1.916784,-3.664697 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_16"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 94.369284,51.764118 c 0.87286,0.813646 1.418946,1.975997 1.418946,3.263357 v 3.824795 c 0,2.460676 -1.997929,4.460797 -4.460798,4.460797 h -4.116479 c 2.897106,-3.471703 5.313921,-7.355711 7.156137,-11.548949 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_17"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 78.782808,99.819677 c 0,-2.432165 -1.971611,-4.40597 -4.403777,-4.40597 H 33.738397 c -2.432166,0 -4.405969,1.973805 -4.405969,4.40597 v 3.774353 c 0,2.43217 1.973803,4.40378 4.405969,4.40378 h 40.640634 c 2.432166,0 4.403777,-1.97161 4.403777,-4.40378 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_18"
style="stroke-width:2.19311" />
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

133
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,133 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -1,105 +1,97 @@
# Contributing
# Contribution guidelines
First off, thanks for considering contributing to FlorisBoard!
Thanks for considering contributing to FlorisBoard!
There are several ways to contribute to FlorisBoard. This document provides some general guidelines for each type of
contribution.
There are several ways to contribute to FlorisBoard. This document provides some general guidelines for each type of contribution.
## Giving general feedback
## General contributions
NEW! You can now [give general feedback](https://github.com/florisboard/florisboard/discussions/new?category=feedback)
directly here on GitHub. This is the preferred way to give feedback, as it allows not only for me to read and respond to
feedback, but for everyone in this community.
### Translation
Optionally you can also use the review function within Google Play or email me
at [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev). I love to hear from you! Note, that the amount of
feedback emails I get is overwhelmingly high - so if I don't answer or answer really late, I apologize - I guarantee
though that I read through every email and that I will use every feedback to improve FlorisBoard :)
To make FlorisBoard accessible in as many languages as possible, the platform [Crowdin](https://crowdin.florisboard.patrickgold.dev) is used to crowdsource and manage translations. The list of languages in Crowdin covers a good range of languages, but feel free to send an email to [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev) to request a new language.
## Translations
> [!IMPORTANT]
> This is the only source of translations - **PRs that add/update translations are not accepted.**
To make FlorisBoard accessible in as many languages as possible, the
platform [Crowdin](https://crowdin.florisboard.patrickgold.dev) is used to crowdsource and manage translations. This is
the only source of translations from now on - **PRs that add/update translations are no longer accepted.** The list of
languages in Crowdin covers the top 20 languages, but feel free to email me at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev) to request a language and I'll add it.
### Feedback
## Adding a new feature or making large changes
You can [give general feedback](https://github.com/florisboard/florisboard/discussions/new?category=feedback) directly here on GitHub. This is the preferred way to give feedback, as it allows not only for me to read and respond to feedback, but for everyone in this community.
If you intend to add a new feature or to make large changes, please discuss this first through a proposal on GitHub.
Discussing your idea enables both you and the dev team that we are on the same page before you start on working on your
change. If you have any questions, feel free to ask for help at any time!
### Bug reporting
## Adding a new keyboard layout
This kind of contribution is the most important, as it tells where FlorisBoard has flaws and thus should be improved to maximize stability and user experience. To make this process as smooth as possible, please use the pre-made [issue template](.github/ISSUE_TEMPLATE/bug_report.md) for bug reporting. This makes it easy for us to understand what the bug is and how to solve it.
Adding a layout to FlorisBoard is very simple and does not require any coding skills, although you should understand the
basics of the JSON syntax (it is very easy though by just looking at some other layout files). Most of the time is
enough to look at the existing layout files, but the following attempts to help you in creating layouts from scratch.
#### Capturing error logs
### Adding the layout
Logs are captured by FlorisBoard's crash handler, which gives you the ability to copy it to the clipboard and paste it in GitHub. This is the preferred way to capture logs.
Since v0.3.14-beta06 it is possible to add custom layouts for all types using the new extension format, Flex.
Alternatively, you can also use ADB (Android Debug Bridge) to capture the error log. This is recommended for experienced users only.
Keyboard layout assets are grouped in [`app/src/main/assets/ime/keyboard`](app/src/main/assets/ime/keyboard) and are
further sub-grouped into the following:
### Feature proposals
- `org.florisboard.composers`: Defines standard composers for interpreting input, currently supports basic typing and
Korean input. Most of the time you won't need to add new composers, so if you don't know what they are always
assume `appender` (the default composer which does not alter input in any way) is in use.
- `org.florisboard.currencysets`: Lists all currency sets, which can be chosen for each subtype. If you consider adding
a new one, make sure that the first currency symbol matches the name of the currency set and also ensure that you have
exactly 6 currency symbols. This is important as the symbol layouts have exactly 6 slots available to fill these
defined currency symbols in.
- `org.florisboard.layouts`: Contains the actual layout files for all layout types.
- `org.florisboard.localization`: Contains all popup mappings and subtype presets (formally the `config.json` file). The
subtype presets are a list of all pre-made subtypes. Each time the user selects a language in the `Subtype Add`
-dialog, all options configured here will get selected if found in the presets. The language tag must adhere to the
IETF BCP 47 code ([ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
and [ISO 3166-1 region code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)). For
example, Dutch as spoken in Belgium is `nl-be`.
Use the feature proposal issue template to suggest a new idea or improvement for this project.
To add a new layout, head to above directory and add the necessary files to each extension group.
## Code contributions
For the `code` field of each key, make sure to use the UTF-8 code. An useful tool for finding the correct code
is [unicode-table.com](https://unicode-table.com/en/). From there, you search for your letter and then use the HTML
code, but without the `&#;`
For internal codes of functional or UI keys, see
[`app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt`](app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt)
.
You are always welcome to contribute new features or work on existing issues, there are a lot to choose from :) It is always best to quickly ask if someone is already working on this issue to avoid duplicate issues.
The label is equally important and should always match up with the defined code. If `code` and `label` don't match up,
FlorisBoard won't crash but it will most likely lead to confusion in the key processing logic.
> [!NOTE]
> If you intend to implement a bigger feature please coordinate with us so we can prevent that there's a major difference in expected implementation.
Any accents or diacritics that should be exposed via long press can be added
at [`app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/<languageTag>.json`](app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings)
. For each key, you can add 1 main and several relevant accents. The main accent should be used for accents which are
important for the language you add. The main field is used for determining if a hint or an accent should take priority,
so please make sure to leave main empty and just use relevant for accents which are not-so important.
If you are overwhelmed by the code don't hesistate to ask for help in the [dev chat](https://matrix.to/#/#florisboard-dev:matrix.org) or the discussions tab! Some issues are also marked as good first issue, which are easy to do tasks.
For popups of non-`characters` layout, simply add the popup directly to each key via the `popup` field.
### System requirements for development
## Adding a new dictionary for a language
- Desktop PC with Linux or WSL2 (Windows)
- MacOS and Windows without WSL2 probably works too however there's no official support
- At least 16GB of RAM (because of Android Studio)
- The following tools must be installed:
- Android Studio (bundles SDK and NDK)
- Java 17
- CMake 3.22+
- Clang 15+
- Git
- [Rust](https://www.rust-lang.org/tools/install)
- Utilities (optional)
- Python 3.10+
- Bash, realpath, grep, ...
Currently the suggestions implementation is highly experimental and not available until 0.4.0, so dictionaries are
currently not accepted.
### Manual build without Android Studio
## Bug reporting
If you want to manually build the project without Android Studio you must ensure that the Android SDK and NDK are properly installed on your system. Then issue
This kind of contribution is the most important, as it tells where FlorisBoard has flaws and thus should be improved to
maximize stability and user experience. To make this process as smooth as possible, please use the
pre-made [issue template](.github/ISSUE_TEMPLATE/bug_report.md)
for bug reporting. This makes it easy for us to understand what the bug is and how to solve it.
```./gradlew clean && ./gradlew assembleDebug```
### Capturing error logs
and Gradle should take care of every build task.
Logs are captured by FlorisBoard's crash handler, which gives you the ability to copy it to the clipboard and paste it
in GitHub. This is the preferred way to capture logs.
## Joining the team
Alternatively, you can also use ADB (Android Debug Bridge) to capture the error log. This is recommended for experienced
users only.
If you want to join the core maintainer/moderator team on a volunteer basis and be part of this project's journey that's great to hear!
### Basic Requirements
- A passion for seeing FlorisBoard flourish
- Good English skills for team and public communication
- A GitHub account and a Matrix handle
### Why Join
You'll have the chance to work directly with me and other team members. While the general idea is for us to work on all kinds of different aspects of the project as a team, if you're particularly interested in a specific area (e.g., UI, extensions, text processing), that's totally okay too!
### Available Roles
Currently the following roles are available and need help:
Role Description | Required Dev Experience
---|---
Software Developer (Kotlin) for Core App | Java/Kotlin development experience (on Android)
Software Developer (Rust) for Native Core | Some Rust development experience
GitHub Issues/Discussions Moderator | None
Crowdin Translation Verifier | Language proficiency for the language you want to verify
Interested? Feel free to dm me ([@patrickgold](https://matrix.to/#/@patrickgold:matrix.org)) on Matrix or send an email to [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev).
## Donating
If none of the above options are feasible for you but you still want to show your support, you can also buy me a coffee,
so I can stay up all night and chase away bugs or add new cool stuff :)
Alternatively you can also show your support by buying me a coffee, so I can stay up all night and chase away bugs or add new cool stuff :)
See the `Sponsors` button for available options!

143
LANGUAGEPACKS-CHINESE.md Normal file
View File

@@ -0,0 +1,143 @@
# Chinese language pack
[简体中文翻译点这里](#简体中文翻译)
[繁体中文翻譯點這裡](#繁体中文翻譯)
## Default barebones Chinese shape-based pack
Default barebones Chinese shape-based language pack which are always available.
Please download the [full Chinese language pack](#full-chinese-shape-based-pack) to access input methods such as wubi, quick cangjie, and other versions of these input methods.
This pack is released under the same license as Florisboard.
## Full Chinese shape-based pack
Chinese shape-based language pack based on fcitx5-table-extra.
This pack is released under a separate license. Please visit to download: [TODO: add link to release page](https://)
:no_entry: :no_entry: **WARNING** :no_entry: :no_entry:
- **Input methods that include pinyin, jyutping, zhuyin as (auxiliary) functions are only provided for convenience. Currently, FlorisBoard lacks phonetic input algorithms. These functions currently have poor user experience and are not recommended for daily use.**
The following input methods are included in this language pack:
- 中文 (中国) [T9笔画] / Chinese (China) [T9]
- 中文 (中国) [五笔98] / Chinese (China) [WUBI98]
- ~中文 (中国) [五笔98-拼音混打] / Chinese (China) [WUBI98PINYIN]~
- 中文 (中国) [五笔98-单字] / Chinese (China) [WUBI98SINGLE]
- 中文 (中国) [五笔-大字库] / Chinese (China) [WUBILARGE]
- 中文 (中国) [郑码] / Chinese (China) [ZHENGMA]
- 中文 (中国) [郑码-大字库] / Chinese (China) [ZHENGMALARGE]
- ~中文 (中国) [郑码-拼音混打] / Chinese (China) [ZHENGMAPINYIN]~
- ~中文 (香港) [廣東拼音] / Chinese (Hong Kong) [CANTONESE]~
- ~中文 (香港) [港式廣東話] / Chinese (Hong Kong) [CANTONHK]~
- 中文 (香港) [輕鬆-大字庫] / Chinese (Hong Kong) [EASYLARGE]
- ~中文 (香港) [粤語拼音-表格] / Chinese (Hong Kong) [JYUTPINGTABLE]~
- 中文 (香港) [速成三代] / Chinese (Hong Kong) [QUICK3]
- 中文 (香港) [經典速成] / Chinese (Hong Kong) [QUICKCLASSIC]
- 中文 (香港) [筆順五碼] / Chinese (Hong Kong) [STROKE5]
- 中文 (台灣) [行列] / Chinese (Taiwan) [ARRAY30]
- 中文 (台灣) [行列-大字库] / Chinese (Taiwan) [ARRAY30LARGE]
- 中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]
- 中文 (台灣) [倉頡三代] / Chinese (Taiwan) [CANGJIE3]
- 中文 (台灣) [倉頡五代] / Chinese (Taiwan) [CANGJIE5]
- 中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]
- 中文 (台灣) [速成五代] / Chinese (Taiwan) [QUICK5]
- 中文 (台灣) [快倉六] / Chinese (Taiwan) [SCJ6]
- ~中文 (台灣) [吳語注音] / Chinese (Taiwan) [WU]~
Third-party license: [https://github.com/fcitx/fcitx5-table-extra/blob/master/LICENSES/GPL-3.0-or-later.txt]
# 简体中文翻译
## 默认中文形码语言包
请下载[完整中文语言包](#fcitx5-中文形码语言包)来获得五笔、快速仓颉等输入法,及这些输入法的其他版本。
这一语言包的使用许可与FlorisBoard相同。
## Fcitx5 中文形码语言包
这一语言包由另一使用许可提供。下载请访问:[TODO: add link to release page](https://)
:no_entry: :no_entry: **注意** :no_entry: :no_entry:
- **含拼音、粤拼、注音等功能的输入法仅为便利提供。目前FlorisBoard缺乏音码输入算法这些功能目前使用体验不佳暂不推荐日常使用。**
语言包内含以下输入法:
- 中文 (中国) [T9笔画] / Chinese (China) [T9]
- 中文 (中国) [五笔98] / Chinese (China) [WUBI98]
- ~中文 (中国) [五笔98-拼音混打] / Chinese (China) [WUBI98PINYIN]~
- 中文 (中国) [五笔98-单字] / Chinese (China) [WUBI98SINGLE]
- 中文 (中国) [五笔-大字库] / Chinese (China) [WUBILARGE]
- 中文 (中国) [郑码] / Chinese (China) [ZHENGMA]
- 中文 (中国) [郑码-大字库] / Chinese (China) [ZHENGMALARGE]
- ~中文 (中国) [郑码-拼音混打] / Chinese (China) [ZHENGMAPINYIN]~
- ~中文 (香港) [廣東拼音] / Chinese (Hong Kong) [CANTONESE]~
- ~中文 (香港) [港式廣東話] / Chinese (Hong Kong) [CANTONHK]~
- 中文 (香港) [輕鬆-大字庫] / Chinese (Hong Kong) [EASYLARGE]
- ~中文 (香港) [粤語拼音-表格] / Chinese (Hong Kong) [JYUTPINGTABLE]~
- 中文 (香港) [速成三代] / Chinese (Hong Kong) [QUICK3]
- 中文 (香港) [經典速成] / Chinese (Hong Kong) [QUICKCLASSIC]
- 中文 (香港) [筆順五碼] / Chinese (Hong Kong) [STROKE5]
- 中文 (台灣) [行列] / Chinese (Taiwan) [ARRAY30]
- 中文 (台灣) [行列-大字库] / Chinese (Taiwan) [ARRAY30LARGE]
- 中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]
- 中文 (台灣) [倉頡三代] / Chinese (Taiwan) [CANGJIE3]
- 中文 (台灣) [倉頡五代] / Chinese (Taiwan) [CANGJIE5]
- 中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]
- 中文 (台灣) [速成五代] / Chinese (Taiwan) [QUICK5]
- 中文 (台灣) [快倉六] / Chinese (Taiwan) [SCJ6]
- ~中文 (台灣) [吳語注音] / Chinese (Taiwan) [WU]~
第三方许可证: [https://github.com/fcitx/fcitx5-table-extra/blob/master/LICENSES/GPL-3.0-or-later.txt]
# 繁体中文翻譯
## 預設中文形碼語言包
請下載[完整中文語言包](#fcitx5-中文形碼語言包)來獲得五筆、快速倉頡等輸入法,及這些輸入法的其他版本。
這一語言包的使用許可與FlorisBoard相同。
## Fcitx5 中文形碼語言包
這一語言包由另一使用許可提供。下載請訪問:[TODO: add link to release page](https://)
:no_entry: :no_entry: **注意** :no_entry: :no_entry:
- **含拼音、粵拼、注音等功能的輸入法僅為便利提供。目前FlorisBoard缺乏音碼輸入算法這些功能目前使用體驗不佳暫不推薦日常使用。**
語言包內含以下輸入法:
- 中文 (中国) [T9笔画] / Chinese (China) [T9]
- 中文 (中国) [五笔98] / Chinese (China) [WUBI98]
- ~中文 (中国) [五笔98-拼音混打] / Chinese (China) [WUBI98PINYIN]~
- 中文 (中国) [五笔98-单字] / Chinese (China) [WUBI98SINGLE]
- 中文 (中国) [五笔-大字库] / Chinese (China) [WUBILARGE]
- 中文 (中国) [郑码] / Chinese (China) [ZHENGMA]
- 中文 (中国) [郑码-大字库] / Chinese (China) [ZHENGMALARGE]
- ~中文 (中国) [郑码-拼音混打] / Chinese (China) [ZHENGMAPINYIN]~
- ~中文 (香港) [廣東拼音] / Chinese (Hong Kong) [CANTONESE]~
- ~中文 (香港) [港式廣東話] / Chinese (Hong Kong) [CANTONHK]~
- 中文 (香港) [輕鬆-大字庫] / Chinese (Hong Kong) [EASYLARGE]
- ~中文 (香港) [粤語拼音-表格] / Chinese (Hong Kong) [JYUTPINGTABLE]~
- 中文 (香港) [速成三代] / Chinese (Hong Kong) [QUICK3]
- 中文 (香港) [經典速成] / Chinese (Hong Kong) [QUICKCLASSIC]
- 中文 (香港) [筆順五碼] / Chinese (Hong Kong) [STROKE5]
- 中文 (台灣) [行列] / Chinese (Taiwan) [ARRAY30]
- 中文 (台灣) [行列-大字库] / Chinese (Taiwan) [ARRAY30LARGE]
- 中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]
- 中文 (台灣) [倉頡三代] / Chinese (Taiwan) [CANGJIE3]
- 中文 (台灣) [倉頡五代] / Chinese (Taiwan) [CANGJIE5]
- 中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]
- 中文 (台灣) [速成五代] / Chinese (Taiwan) [QUICK5]
- 中文 (台灣) [快倉六] / Chinese (Taiwan) [SCJ6]
- ~中文 (台灣) [吳語注音] / Chinese (Taiwan) [WU]~
第三方許可證: [https://github.com/fcitx/fcitx5-table-extra/blob/master/LICENSES/GPL-3.0-or-later.txt]

16
LANGUAGEPACKS.md Normal file
View File

@@ -0,0 +1,16 @@
# Language Packs
## Languages
- [Summary](#summary)
- [Chinese / 中文](LANGUAGEPACKS-CHINESE.md)
## Summary
Stub.
This page should describe how language packs work, how to import them, and point to the location of downloadable
language packs.
The homepage of default language packs included in FlorisBoard should link to this page.

View File

@@ -1,7 +1,7 @@
<img align="left" width="80" height="80"
src=".github/repo_icon.png" alt="App icon">
# FlorisBoard [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.patrickgold.dev) [![Matrix badge](https://img.shields.io/badge/chat-%23florisboard%3amatrix.org-blue)](https://matrix.to/#/#florisboard:matrix.org) ![FlorisBoard CI](https://github.com/florisboard/florisboard/workflows/FlorisBoard%20CI/badge.svg?event=push)
# FlorisBoard [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.patrickgold.dev) [![Matrix badge](https://img.shields.io/badge/chat-%23florisboard%3amatrix.org-blue)](https://matrix.to/#/#florisboard:matrix.org) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) [![FlorisBoard CI](https://github.com/florisboard/florisboard/actions/workflows/android.yml/badge.svg?event=push)](https://github.com/florisboard/florisboard/actions/workflows/android.yml)
**FlorisBoard** is a free and open-source keyboard for Android 7.0+
devices. It aims at being modern, user-friendly and customizable while
@@ -10,18 +10,18 @@ fully respecting your privacy. Currently in early-beta state.
<table>
<tr>
<th align="center" width="50%">
<h3>Stable <a href="https://github.com/florisboard/florisboard/releases/latest"><img alt="Latest stable release" src="https://img.shields.io/github/v/release/florisboard/florisboard"></a></h3>
<h3>Stable <a href="https://github.com/florisboard/florisboard/releases/latest"><img alt="Latest stable release" src="https://img.shields.io/github/v/release/florisboard/florisboard?sort=semver&display_name=tag&color=28a745"></a></h3>
</th>
<th align="center" width="50%">
<h3>Beta <a href="https://github.com/florisboard/florisboard/releases"><img alt="Latest beta release" src="https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases"></a></h3>
<h3>Preview <a href="https://github.com/florisboard/florisboard/releases"><img alt="Latest preview release" src="https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases&sort=semver&display_name=tag&color=fd7e14"></a></h3>
</th>
</tr>
<tr>
<td valign="top">
<p><i>Major versions only, 1 release per 1-5 months</i><br><br>Updates are more polished, new features are matured and tested through to ensure a stable experience.</p>
<p><i>Major versions only</i><br><br>Updates are more polished, new features are matured and tested through to ensure a stable experience.</p>
</td>
<td valign="top">
<p><i>Beta versions, up to 1-2 releases per week</i><br><br>Updates contain new features that may not be fully matured yet and bugs are more likely to occur. Allows you to give early feedback.</p>
<p><i>Major + Alpha/Beta/Rc versions</i><br><br>Updates contain new features that may not be fully matured yet and bugs are more likely to occur. Allows you to give early feedback.</p>
</td>
</tr>
<tr>
@@ -34,6 +34,11 @@ fully respecting your privacy. Currently in early-beta state.
</p>
<p>
**Obtainium**: [Auto-import stable config][obtainium_stable]
</p>
<p>
**Manual**: Download and install the APK from the release page.
</p>
@@ -42,7 +47,12 @@ fully respecting your privacy. Currently in early-beta state.
<p><a href="https://apt.izzysoft.de/fdroid/index/apk/dev.patrickgold.florisboard.beta"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" height="64" alt="IzzySoft repo badge"></a></p>
<p>
**Google Play**: Join the [FlorisBoard Test Group](https://groups.google.com/g/florisboard-public-alpha-test), then visit the [beta testing page](https://play.google.com/apps/testing/dev.patrickgold.florisboard.beta). Once joined and installed, updates will be delivered like for any other app. ([Store entry](https://play.google.com/store/apps/details?id=dev.patrickgold.florisboard.beta))
**Google Play**: Join the [FlorisBoard Test Group](https://groups.google.com/g/florisboard-public-alpha-test), then visit the [preview testing page](https://play.google.com/apps/testing/dev.patrickgold.florisboard.beta). Once joined and installed, updates will be delivered like for any other app. ([Store entry](https://play.google.com/store/apps/details?id=dev.patrickgold.florisboard.beta))
</p>
<p>
**Obtainium**: [Auto-import preview config][obtainium_preview]
</p>
<p>
@@ -54,26 +64,33 @@ fully respecting your privacy. Currently in early-beta state.
</tr>
</table>
Beginning with v0.4.0 FlorisBoard will follow [SemVer](https://semver.org/#summary) versioning scheme and enter the public beta on Google Play.
Beginning with v0.6.0 FlorisBoard will enter the public beta on Google Play.
## Highlighted features
- Integrated clipboard manager / history
- Advanced theming support and customization
- Integrated extension support (still evolving)
- Emoji keyboard
- Spell checking service
- Glide typing (currently English only)
- Emoji keyboard / history / suggestions
Word suggestions are not included in the current releases and are a major goal for the v0.4.0 milestone.
> [!IMPORTANT]
> Word suggestions/spell checking are not included in the current releases
> and are a major goal for the v0.5 milestone.
Feature roadmap: See [ROADMAP.md](ROADMAP.md)
## Contributing
Wanna contribute to FlorisBoard? That's great to hear! There are lots of
different ways to help out. Bug reporting, making pull requests,
translating FlorisBoard to make it more accessible, etc. For more
information see the [contributing guidelines](CONTRIBUTING.md). Thank
you for your help!
Want to contribute to FlorisBoard? That's great to hear! There are lots of
different ways to help out, please see the [contribution guidelines](CONTRIBUTING.md) for more info.
## Addons Store
The official [Addons Store](https://beta.addons.florisboard.org) offers the possibility for the community to share and download FlorisBoard extensions.
Instructions on how to publish addons can be found [here](https://github.com/florisboard/florisboard/wiki/How-to-publish-on-FlorisBoard-Addons).
Many thanks to Ali ([@4H1R](https://github.com/4H1R)) for implementing the store!
> [!NOTE]
> During the initial beta release phase, the Addons Store _will_ only accept theme extensions.
> Later on we plan to add support for language packs and keyboard extensions.
## List of permissions FlorisBoard requests
Please refer to this [page](https://github.com/florisboard/florisboard/wiki/List-of-permissions-FlorisBoard-requests)
@@ -82,8 +99,6 @@ to get more information on this topic.
## Used libraries, components and icons
* [AndroidX libraries](https://github.com/androidx/androidx) by
[Android Jetpack](https://github.com/androidx)
* [Accompanist Compose UI libraries](https://github.com/google/accompanist/) by
[Google](https://github.com/google)
* [AboutLibraries](https://github.com/mikepenz/AboutLibraries) by
[mikepenz](https://github.com/mikepenz)
* [Google Material icons](https://github.com/google/material-design-icons) by
@@ -94,16 +109,12 @@ to get more information on this topic.
[Kotlin](https://github.com/Kotlin)
* [KotlinX serialization library](https://github.com/Kotlin/kotlinx.serialization) by
[Kotlin](https://github.com/Kotlin)
* [ICU4C](https://github.com/unicode-org/icu) by
[The Unicode Consortium](https://github.com/unicode-org)
* [Nuspell](https://github.com/nuspell/nuspell) by
[Nuspell](https://github.com/nuspell)
Many thanks to [Nikolay Anzarov](https://www.behance.net/nikolayanzarov) ([@BloodRaven0](https://github.com/BloodRaven0)) for designing and providing the main app icons to this project!
## License
```
Copyright 2020-2022 Patrick Goldinger
Copyright 2020-2024 Patrick Goldinger
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -117,3 +128,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
<!-- BEGIN SECTION: obtainium_links -->
<!-- auto-generated link templates, do NOT edit by hand -->
<!-- see fastlane/update-readme.sh -->
[obtainium_preview]: https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22%3A%22dev.patrickgold.florisboard.beta%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fflorisboard%2Fflorisboard%22%2C%22author%22%3A%22florisboard%22%2C%22name%22%3A%22FlorisBoard%20Preview%22%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Atrue%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22preview%5C%22%7D%22%7D%0A
[obtainium_stable]: https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22%3A%22dev.patrickgold.florisboard%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fflorisboard%2Fflorisboard%22%2C%22author%22%3A%22florisboard%22%2C%22name%22%3A%22FlorisBoard%20Stable%22%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22stable%5C%22%7D%22%7D%0A
<!-- END SECTION: obtainium_links -->

View File

@@ -1,75 +1,68 @@
# Roadmap
# FlorisBoard's feature roadmap & milestones
This feature roadmap intents to provide transparency to what is planned to be added to FlorisBoard in the foreseeable future. Note that there are no ETAs for any version milestones down below, experience has shown these won't hold anyways.
This feature roadmap intents to provide transparency to what I want to add to FlorisBoard in the foreseeable future.
Note that there are no ETAs for any version milestones down below, experience says these won't hold anyways.
Each major milestone has associated alpha/beta releases, so if you are interested in previewing features quicker, keep an eye out! Each major 0.x release has also patch releases after the initial major release, which will be published on both the stable and beta tracks.
I try my best to release regularly, though some features take a lot longer than others and thus releases can be spaced
out a bit on the stable track. If you are interested in following the development more closely, make sure to follow
along the beta track releases! These are generally more unstable but you get new stuff faster and can provide early
feedback, which helps a lot!
## 0.4
## 0.3.x
**Main focus**: Getting the project back on track, see [this announcement](https://github.com/florisboard/florisboard/discussions/2314) for details. Note that this has also replaced the previous roadmap, however this step is necessary for getting the project back on track again.
Releases in this section still follow the old versioning scheme, meaning the patch number is a feature upgrade. As this
naming convention is more confusing than useful, beginning with v0.4.0 development a new release/development cycle will
be introduced.
This includes, but is not exclusive to:
- Fixing the most reported bugs/issues
- Merging in the Material You theme PR -> Adds Material You support (v0.4.0-alpha05)
- Merging in other external PRs as best as possible
- Reworking the Settings UI warning boxes and hiding any UI for features related to word suggestions until they are ready
- Remove existing glide/swipe typing (see 0.5 milestone)
- Improvements in clipboard / emoji functionality (v0.4.0-beta01/beta02)
- Prepare project to have native code implemented in [Rust](https://www.rust-lang.org/) (v0.4.0-beta02)
- - Upgrade Settings UI to Material 3 (v0.4.0-beta03)
- Add support for importing extensions via system file handler APIs (relevant for Addons store) (v0.4.0-beta03)
### 0.3.15 & 0.3.16 (currently 0.3.15 done, 0.3.16 in work)
Note that the previous versioning scheme has been dropped in favor of using a major.minor.patch versioning scheme, so versions like `0.3.16` are a thing of the past :)
- Hotfix releases for possible bugs in the preference rework (in work)
- Lots and lots of bug fixing in general (in work)
- Preparation work for 0.4.0, fixing text state logic and use break iterator (done)
- Reducing or getting rid of input lag some devices experience (done)
- Clean up of project structure for better future development (done)
## 0.5
## 0.4.0
- Implement predictive text support / spell checking
- Consider adding proximity-based key typo detection
- Add new extension type: Language Pack
- Basically groups all locale-relevant data (predictive base model, emoji suggestion data, ...)
in a dynamically importable extension file
- New keyboard layout engine + file syntax based on the upcoming Unicode Keyboard v3 standard
- RFC document with technical details will be released later
- New text processing logic (maybe moved back to 0.6)
- RFC document with technical details will be released later
- Add Tablet mode / Optimizations for landscape input based on new keyboard layout engine
- Reimplementation of glide typing with the new layout engine and predictive text core
- Add support for any remaining new features introduced with Android 13
- Re-adding word suggestions (at least for Latin-based languages at first)
- Importing the dictionaries as well as management relies on the Flex extension core and UI in Kotlin
- Actually parsing and generating suggestions happens in C++ to avoid another OOM catastrophe like in 0.3.9/10
- The actual format of the dictionary and word list source is not decided yet
- Community repository on GitHub for theme sharing across users (may be 0.5.0)
With this release the versioning scheme changes: the second number now indicates new features, changes in the third "
patch" number now indicates bug fixes and minor feature additions for the stable track. The development cycle for each
0.x release will have `-alphaXX` (optional and only for large releases), `-betaXX` and `-rcXX` (release candidate)
releases on the beta track for interested people to follow along the development. The first release to follow the new
scheme will be `0.4.0-alpha01` on the beta track.
## 0.5.0
## 0.6
- Complete rework of the Emoji panel
- Recently used / Emoji history (already implemented with 0.3.14)
- Emoji search
- Emoji suggestions when using :emoji_name: syntax
- Kaomoji panel implementation (the third tab which currently has "not yet implemented")
- Smartbar customization improvements
- Quick actions customization (order and which buttons to show)
- Prepare FlorisBoard repository and app store presence for public beta release on Google Play (will go live with stable
0.5.0!!)
- Recently used / Emoji history (already implemented with 0.3.14)
- Emoji search
- Emoji suggestions when using :emoji_name: syntax (already implemented with v0.4.0-beta02)
- Maybe: consider upgrading to emoji2 for better unified system-wide emoji styles
- Prepare FlorisBoard repository and app store presence for public beta release on Google Play (will go live with stable 0.6)
- Rework branding images and texts of FlorisBoard for the app stores
- Focus on stability and experience improvements of the app and keyboard
- Add support for new features introduced with Android 14
- Not finalized, but planned: raise minimum required Android version from Android 7 (SDK level 24) to Android 8 (SDK level 26)
## 0.6.0
## Backlog / Planned (unassigned)
**Features that MAY be added (even in versions mentioned above) or dismissed**
- Full on-board layout editor which allows users to create their own layouts without writing a JSON file
- Import/Export of custom layout files packed in Flex extensions
## Backlog / Features that MAY be added, even in versions not mentioned above if the feature implementation fits perfectly with another feature
- Theme rework part II
- Adaptive themes v2
- Voice-to-text with Mozilla's open-source voice service
- Voice-to-text with Mozilla's open-source voice service (or any other oss voice provider)
- Text translation
- Glide typing better word detection
- Proximity-based key typo detection
- Floating keyboard
- Tablet mode / Optimizations for landscape input
- Stickers/GIFs
- Kaomoji panel implementation
- FlorisBoard landing web page for presentation
- Implementing additional layouts
- Support for Tasker/Automate/MacroDroid plugins
- Support for WearOS/Smartwatches
- Handwriting
- ...

2
app/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
# Exclude auto-generated icu4c assets
src/main/assets/icu4c/

View File

@@ -14,26 +14,33 @@
* limitations under the License.
*/
// Suppress needed until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed
@file:Suppress("DSL_SCOPE_VIOLATION")
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag
import java.io.ByteArrayOutputStream
import java.io.File
plugins {
alias(libs.plugins.agp.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.plugin.compose)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.ksp)
alias(libs.plugins.mannodermaus.android.junit5)
alias(libs.plugins.mikepenz.aboutlibraries)
}
val projectMinSdk: String by project
val projectTargetSdk: String by project
val projectCompileSdk: String by project
val projectBuildToolsVersion: String by project
val projectNdkVersion: String by project
val projectVersionCode: String by project
val projectVersionName: String by project
val projectVersionNameSuffix = projectVersionName.substringAfter("-", "")
android {
namespace = "dev.patrickgold.florisboard"
compileSdk = 31
buildToolsVersion = "31.0.0"
ndkVersion = "22.1.7171670"
compileSdk = projectCompileSdk.toInt()
buildToolsVersion = projectBuildToolsVersion
ndkVersion = projectNdkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -43,23 +50,23 @@ android {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = listOf(
"-Xallow-result-return-type",
"-Xopt-in=kotlin.RequiresOptIn",
"-Xopt-in=kotlin.contracts.ExperimentalContracts",
"-Xjvm-default=compatibility",
"-opt-in=kotlin.contracts.ExperimentalContracts",
"-Xjvm-default=all-compatibility",
)
}
defaultConfig {
applicationId = "dev.patrickgold.florisboard"
minSdk = 24
targetSdk = 31
versionCode = 86
versionName = "0.3.16"
minSdk = projectMinSdk.toInt()
targetSdk = projectTargetSdk.toInt()
versionCode = projectVersionCode.toInt()
versionName = projectVersionName.substringBefore("-")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "BUILD_COMMIT_HASH", "\"${getGitCommitHash()}\"")
buildConfigField("String", "FLADDONS_API_VERSION", "\"v~draft2\"")
buildConfigField("String", "FLADDONS_STORE_URL", "\"beta.addons.florisboard.org\"")
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
@@ -67,25 +74,10 @@ android {
arg("room.expandProjection", "true")
}
externalNativeBuild {
cmake {
cFlags("-fvisibility=hidden", "-DU_STATIC_IMPLEMENTATION=1")
cppFlags("-fvisibility=hidden", "-std=c++17", "-fexceptions", "-ffunction-sections", "-fdata-sections", "-DU_DISABLE_RENAMING=1", "-DU_STATIC_IMPLEMENTATION=1")
arguments("-DANDROID_STL=c++_static")
}
}
ndk {
abiFilters += listOf("armeabi-v7a", "arm64-v8a")
}
sourceSets {
maybeCreate("main").apply {
assets {
srcDirs("src/main/assets", "src/main/icu4c/prebuilt/assets")
}
jniLibs {
srcDirs("src/main/icu4c/prebuilt/jniLibs")
srcDirs("src/main/assets")
}
java {
srcDirs("src/main/kotlin")
@@ -104,32 +96,18 @@ android {
}
buildFeatures {
buildConfig = true
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.androidx.compose.get()
}
externalNativeBuild {
cmake {
path("src/main/cpp/CMakeLists.txt")
}
}
buildTypes {
named("debug") {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug-${getGitCommitHash(short = true)}"
versionNameSuffix = "-debug+${getGitCommitHash(short = true)}"
isDebuggable = true
isJniDebuggable = false
ndk {
// For running FlorisBoard on the emulator
abiFilters += listOf("x86", "x86_64")
}
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_debug")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_debug_round")
resValue("drawable", "floris_app_icon_foreground", "@drawable/ic_app_icon_debug_foreground")
@@ -138,7 +116,7 @@ android {
create("beta") {
applicationIdSuffix = ".beta"
versionNameSuffix = ""
versionNameSuffix = projectVersionNameSuffix
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
isMinifyEnabled = true
@@ -151,6 +129,8 @@ android {
}
named("release") {
versionNameSuffix = projectVersionNameSuffix
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
isMinifyEnabled = true
isShrinkResources = true
@@ -165,11 +145,6 @@ android {
initWith(getByName("release"))
signingConfig = signingConfigs.getByName("debug")
matchingFallbacks += listOf("release")
ndk {
// For running FlorisBoard on the emulator
abiFilters += listOf("x86", "x86_64")
}
}
}
@@ -187,19 +162,22 @@ android {
}
}
composeCompiler {
// DO NOT ENABLE STRONG SKIPPING! This project currently relies on
// recomposition on parent state change to update the UI correctly.
featureFlags.add(ComposeFeatureFlag.StrongSkipping.disabled())
}
tasks.withType<Test> {
useJUnitPlatform()
}
dependencies {
implementation(libs.accompanist.flowlayout)
implementation(libs.accompanist.insets)
implementation(libs.accompanist.systemuicontroller)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.autofill)
implementation(libs.androidx.collection.ktx)
implementation(libs.androidx.compose.material)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.runtime.livedata)
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.tooling.preview)
@@ -207,18 +185,26 @@ dependencies {
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.emoji2)
implementation(libs.androidx.emoji2.views)
implementation(libs.androidx.exifinterface)
implementation(libs.androidx.material.icons)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.profileinstaller)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
implementation(libs.cache4k)
implementation(libs.jetpref.datastore.model)
implementation(libs.jetpref.datastore.ui)
implementation(libs.jetpref.material.ui)
implementation(libs.kotlinx.coroutines)
implementation(libs.kotlinx.serialization.json)
implementation(libs.mikepenz.aboutlibraries.core)
implementation(libs.mikepenz.aboutlibraries.compose)
implementation(libs.patrickgold.compose.tooltip)
implementation(libs.patrickgold.jetpref.datastore.model)
implementation(libs.patrickgold.jetpref.datastore.ui)
implementation(libs.patrickgold.jetpref.material.ui)
implementation(project(":lib:android"))
implementation(project(":lib:kotlin"))
implementation(project(":lib:native"))
implementation(project(":lib:snygg"))
testImplementation(libs.equalsverifier)
testImplementation(libs.kotest.assertions.core)

3
app/lint.xml Normal file
View File

@@ -0,0 +1,3 @@
<lint>
<issue id="UsingMaterialAndMaterial3Libraries" severity="ignore" />
</lint>

View File

@@ -0,0 +1,68 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "dc886df9792fe6b6ad532cc7aa7c4a84",
"entities": [
{
"tableName": "clipboard_files",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER NOT NULL, `_display_name` TEXT NOT NULL, `_size` INTEGER NOT NULL, `orientation` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL, PRIMARY KEY(`_id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "displayName",
"columnName": "_display_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "size",
"columnName": "_size",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "orientation",
"columnName": "orientation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "mimeTypes",
"columnName": "mimeTypes",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_clipboard_files__id",
"unique": false,
"columnNames": [
"_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_clipboard_files__id` ON `${TABLE_NAME}` (`_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'dc886df9792fe6b6ad532cc7aa7c4a84')"
]
}
}

View File

@@ -0,0 +1,92 @@
{
"formatVersion": 1,
"database": {
"version": 3,
"identityHash": "282a1b421e498fd0e21c055b6a4315e0",
"entities": [
{
"tableName": "clipboard_history",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` INTEGER NOT NULL, `text` TEXT, `uri` TEXT, `creationTimestampMs` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `isRemoteDevice` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "uri",
"columnName": "uri",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "creationTimestampMs",
"columnName": "creationTimestampMs",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "mimeTypes",
"columnName": "mimeTypes",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isSensitive",
"columnName": "isSensitive",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isRemoteDevice",
"columnName": "isRemoteDevice",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"_id"
]
},
"indices": [
{
"name": "index_clipboard_history__id",
"unique": false,
"columnNames": [
"_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_clipboard_history__id` ON `${TABLE_NAME}` (`_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '282a1b421e498fd0e21c055b6a4315e0')"
]
}
}

View File

@@ -19,6 +19,9 @@
<!-- Permission needed to vibrate if the user has key press vibration enabled -->
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- Permission needed to create notifications on devices running Android 13+ -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- Android 11+ only: Define that FlorisBoard requests to see all apps that
ship with an IME or Spell Check service. This is used to guide the user
in the Settings Ui why FlorisBoard may not be working.
@@ -39,10 +42,11 @@
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/floris_app_icon"
android:label="@string/floris_app_name"
android:enableOnBackInvokedCallback="true"
android:roundIcon="@mipmap/floris_app_icon_round"
android:supportsRtl="true"
android:theme="@style/FlorisAppTheme"
tools:targetApi="s">
tools:targetApi="tiramisu">
<!-- Allow app to be profiled for benchmarking and baseline profile generation -->
<profileable android:shell="true"/>
@@ -80,10 +84,26 @@
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:windowSoftInputMode="adjustResize"
android:theme="@style/FlorisAppTheme"
android:exported="false">
android:theme="@style/FlorisAppTheme.Splash"
android:exported="true">
<intent-filter>
<data android:scheme="florisboard" android:host="app-ui"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="ui" android:host="florisboard" android:pathPrefix="/" />
</intent-filter>
<intent-filter android:label="Import Extension">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="content"/>
<data android:mimeType="application/vnd.florisboard.extension+zip"/>
<data android:mimeType="application/octet-stream"/><!-- Firefox looking at you :eyes: -->
</intent-filter>
<intent-filter android:label="Import Extension">
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.florisboard.extension+zip"/>
<data android:mimeType="application/octet-stream"/><!-- Firefox looking at you :eyes: -->
</intent-filter>
</activity>
@@ -95,7 +115,7 @@
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:targetActivity="dev.patrickgold.florisboard.app.FlorisAppActivity"
android:theme="@style/FlorisAppTheme"
android:theme="@style/FlorisAppTheme.Splash"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
@@ -103,24 +123,6 @@
</intent-filter>
</activity-alias>
<!-- Import File Bridging Activity -->
<activity
android:name="dev.patrickgold.florisboard.app.ext.ImportFileActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:windowSoftInputMode="adjustResize"
android:theme="@style/FlorisAppTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="*" android:host="*" android:pathPattern=".*\\.flex"/>
<data android:scheme="*" android:host="*" android:pathPattern=".*\\.xpi"/>
</intent-filter>
</activity>
<!-- Crash Dialog Activity -->
<activity
android:name="dev.patrickgold.florisboard.lib.crashutility.CrashDialogActivity"
@@ -128,6 +130,18 @@
android:label="@string/crash_dialog__title"
android:theme="@style/CrashDialogTheme"/>
<!-- Copy to Clipboard Activity -->
<activity
android:name="dev.patrickgold.florisboard.ime.clipboard.FlorisCopyToClipboardActivity"
android:theme="@style/FlorisAppTheme.Transparent"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
<!-- Clipboard Media File Provider -->
<provider
android:name="dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardMediaProvider"

View File

@@ -57,12 +57,89 @@
"ừz": "ư", "ửz": "ư", "ữz": "ư", "ứz": "ư", "ựz": "ư",
"ỳz": "y", "ỷz": "y", "ỹz": "y", "ýz": "y", "ỵz": "y",
"áf": "à", "ár": "ả", "áx": "ã", "áj": "ạ",
"às": "á", "àr": "ả", "àx": "ã", "àj": "ạ",
"ảs": "á", "ảf": "à", "ảx": "ã", "ảj": "ạ",
"ãs": "á", "ãf": "à", "ãr": "ả", "ãj": "ạ",
"ạs": "á", "ạf": "à", "ạr": "ả", "ạx": "ã",
"ấf": "ầ", "ấr": "ẩ", "ấx": "ẫ", "ấj": "ậ",
"ầs": "ấ", "ầr": "ẩ", "ầx": "ẫ", "ầj": "ậ",
"ẩs": "ấ", "ẩf": "ầ", "ẩx": "ẫ", "ẩj": "ậ",
"ẫs": "ấ", "ẫf": "ầ", "ẫr": "ẩ", "ẫj": "ậ",
"ậs": "ấ", "ậf": "ầ", "ậr": "ẩ", "ậx": "ẫ",
"ắf": "ằ", "ắr": "ẳ", "ắx": "ẵ", "ắj": "ặ",
"ằs": "ắ", "ằr": "ẳ", "ằx": "ẵ", "ằj": "ặ",
"ẳs": "ắ", "ẳf": "ằ", "ẳx": "ẵ", "ẳj": "ặ",
"ẵs": "ắ", "ẵf": "ằ", "ẵr": "ẳ", "ẵj": "ặ",
"ặs": "ắ", "ặf": "ằ", "ặr": "ẳ", "ặx": "ẵ",
"éf": "è", "ér": "ẻ", "éx": "ẽ", "éj": "ẹ",
"ès": "é", "èr": "ẻ", "èx": "ẽ", "èj": "ẹ",
"ẻs": "é", "ẻf": "è", "ẻx": "ẽ", "ẻj": "ẹ",
"ẽs": "é", "ẽf": "è", "ẽr": "ẻ", "ẽj": "ẹ",
"ẹs": "é", "ẹf": "è", "ẹr": "ẻ", "ẹx": "ẽ",
"ếf": "ề", "ếr": "ể", "ếx": "ễ", "ếj": "ệ",
"ềs": "ế", "ềr": "ể", "ềx": "ễ", "ềj": "ệ",
"ểs": "ế", "ểf": "ề", "ểx": "ễ", "ểj": "ệ",
"ễs": "ế", "ễf": "ề", "ễr": "ể", "ễj": "ệ",
"ệs": "ế", "ệf": "ề", "ệr": "ể", "ệx": "ễ",
"íf": "ì", "ír": "ỉ", "íx": "ĩ", "íj": "ị",
"ìs": "í", "ìr": "ỉ", "ìx": "ĩ", "ìj": "ị",
"ỉs": "í", "ỉf": "ì", "ỉx": "ĩ", "ỉj": "ị",
"ĩs": "í", "ĩf": "ì", "ĩr": "ỉ", "ĩj": "ị",
"ịs": "í", "ịf": "ì", "ịr": "ỉ", "ịx": "ĩ",
"óf": "ò", "ór": "ỏ", "óx": "õ", "ój": "ọ",
"òs": "ó", "òr": "ỏ", "òx": "õ", "òj": "ọ",
"ỏs": "ó", "ỏf": "ò", "ỏx": "õ", "ỏj": "ọ",
"õs": "ó", "õf": "ò", "õr": "ỏ", "õj": "ọ",
"ọs": "ó", "ọf": "ò", "ọr": "ỏ", "ọx": "õ",
"ốf": "ồ", "ốr": "ổ", "ốx": "ỗ", "ốj": "ộ",
"ồs": "ố", "ồr": "ổ", "ồx": "ỗ", "ồj": "ộ",
"ổs": "ố", "ổf": "ồ", "ổx": "ỗ", "ổj": "ộ",
"ỗs": "ố", "ỗf": "ồ", "ỗr": "ổ", "ỗj": "ộ",
"ộs": "ố", "ộf": "ồ", "ộr": "ổ", "ộx": "ỗ",
"ớf": "ờ", "ớr": "ở", "ớx": "ỡ", "ớj": "ợ",
"ờs": "ớ", "ờr": "ở", "ờx": "ỡ", "ờj": "ợ",
"ởs": "ớ", "ởf": "ờ", "ởx": "ỡ", "ởj": "ợ",
"ỡs": "ớ", "ỡf": "ờ", "ỡr": "ở", "ỡj": "ợ",
"ợs": "ớ", "ợf": "ờ", "ợr": "ở", "ợx": "ỡ",
"úf": "ù", "úr": "ủ", "úx": "ũ", "új": "ụ",
"ùs": "ú", "ùr": "ủ", "ùx": "ũ", "ùj": "ụ",
"ủs": "ú", "ủf": "ù", "ủx": "ũ", "ủj": "ụ",
"ũs": "ú", "ũf": "ù", "ũr": "ủ", "ũj": "ụ",
"ụs": "ú", "ụf": "ù", "ụr": "ủ", "ụx": "ũ",
"ứf": "ừ", "ứr": "ử", "ứx": "ữ", "ứj": "ự",
"ừs": "ứ", "ừr": "ử", "ừx": "ữ", "ừj": "ự",
"ửs": "ứ", "ửf": "ừ", "ửx": "ữ", "ửj": "ự",
"ữs": "ứ", "ữf": "ừ", "ữr": "ử", "ữj": "ự",
"ựs": "ứ", "ựf": "ừ", "ựr": "ử", "ựx": "ữ",
"ýf": "ỳ", "ýr": "ỷ", "ýx": "ỹ", "ýj": "ỵ",
"ỳs": "ý", "ỳr": "ỷ", "ỳx": "ỹ", "ỳj": "ỵ",
"ỷs": "ý", "ỷf": "ỳ", "ỷx": "ỹ", "ỷj": "ỵ",
"ỹs": "ý", "ỹf": "ỳ", "ỹr": "ỷ", "ỹj": "ỵ",
"ỵs": "ý", "ỵf": "ỳ", "ỵr": "ỷ", "ỵx": "ỹ",
"gias": "giá", "giaf": "già", "giar": "giả", "giax": "giã", "giaj": "giạ",
"gía": "giá", "gìa": "già", "gỉa": "giả", "gĩa": "giã", "gịa": "giạ",
"gíă": "giắ", "gìă": "giằ", "gỉă": "giẳ", "gĩă": "giẵ", "gịă": "giặ",
"gíâ": "giấ", "gìâ": "giầ", "gỉâ": "giẩ", "gĩẫ": "giẫ", "gịâ": "giậ",
"gíe": "gié", "gìe": "giè", "gỉe": "giẻ", "gĩe": "giẽ", "gịe": "giẹ",
"gíê": "giế", "gìê": "giề", "gỉê": "giể", "gĩê": "giễ", "gịê": "giệ",
"gío": "gió", "gìo": "giò", "gỉo": "giỏ", "gĩo": "giõ", "gịo": "giọ",
"gíô": "giố", "gìô": "giồ", "gỉô": "giổ", "gĩô": "giỗ", "gịô": "giộ",
"gíơ": "giớ", "gìơ": "giờ", "gỉơ": "giở", "gĩơ": "giỡ", "gịơ": "giợ",
"gius": "giú", "giuf": "giù", "giur": "giủ", "giux": "giũ", "giuj": "giụ",
"gíu": "giú", "gìu": "giù", "gỉu": "giủ", "gĩu": "giũ", "gịu": "giụ",
"gíư": "giứ", "gìư": "giừ", "gỉư": "giử", "gĩư": "giữ", "gịư": "giự",
"ghíê": "ghiế", "ghìê": "ghiề", "ghỉê": "ghiể", "ghĩê": "ghiễ", "ghịê": "ghiệ",
"acw": "ăc", "amw": "ăm", "anw": "ăn", "apw": "ăp", "atw": "ăt", "angw": "ăng",
"aca": "âc", "ama": "âm", "ana": "ân", "apa": "âp", "ata": "ât", "aua": "âu", "aya": "ây", "anga": "âng",
"eme": "êm", "ene": "ên", "epe": "êp", "ete": "êt", "enhe": "ênh",
"oio": "ôi","omo": "ôm", "ono": "ôn", "opo": "ôp", "oto": "ôt", "ongo": "ông",
"oiw": "ơi", "omw": "ơm", "onw": "ơn", "opw": "ơp", "otw": "ơt",
"uaw": "ưa", "uiw": "ưi", "umw": "ưm", "unw": "ưn", "utw": "ưt", "uuw": "ưu", "ungw": "ưng",
"uaw": "ưa", "ucw": "ưc", "uiw": "ưi", "umw": "ưm", "unw": "ưn", "utw": "ưt", "uuw": "ưu", "ungw": "ưng",
"ieme": "iêm", "iene": "iên", "iepe": "iêp", "iete": "iêt", "ieue": "iêu", "ienge": "iêng",
"uocw": "ươc", "uoiw": "ươi", "uomw": "ươm", "uonw": "ươn", "uotw": "ươt", "uongw": "ương",
"uoco": "uôc", "uoio": "uôi", "uomo": "uôm", "uono": "uôn", "uoto": "uôt", "uongo": "uông",
@@ -79,7 +156,7 @@
"ême": "eme", "êne": "ene", "êpe": "epe", "ête": "ete",
"ôio": "oio", "ômo": "omo", "ôno": "ono", "ôpo": "opo", "ôto": "oto", "ôngo": "ongo",
"ơmw": "omw", "ơnw": "onw", "ơpw": "opw", "ơtw": "otw",
"ưaw": "uaw", "ưiw": "uiw", "ưmw": "umw", "ưnw": "unw" , "ưtw": "utw", "ưuw": "uuw", "ưngw": "ungw",
"ưaw": "uaw", "ưcw": "ucw", "ưiw": "uiw", "ưmw": "umw", "ưnw": "unw" , "ưtw": "utw", "ưuw": "uuw", "ưngw": "ungw",
"iême": "ieme", "iêne": "iene", "iêpe": "iepe", "iête": "iete", "iêue": "ieue", "iênge": "ienge",
"ươcw": "uocw", "ươiw": "uoiw", "ươmw": "uomw", "ươnw": "uonw", "ươtw": "uotw", "ươngw": "uongw",
"uyêne": "uyene", "uyêt": "uyete",
@@ -138,6 +215,7 @@
"inhs": "ính", "inhf": "ình", "inhr": "ỉnh", "inhx": "ĩnh", "inhj": "ịnh",
"ías": "ias", "ìaf": "iaf", "ỉar": "iar", "ĩax": "iax", "ịaj": "iaj",
"iás": "ias", "iàf": "iaf", "iảr": "iar", "iãx": "iax", "iạj": "iaj",
"ícs": "ics", "ịcj": "icj",
"íms": "ims", "ìmf": "imf", "ỉmr": "imr", "ĩmx": "imx", "ịmj": "imj",
"íns": "ins", "ìnf": "inf", "ỉnr": "inr", "ĩnx": "inx", "ịnj": "inj",
@@ -385,6 +463,8 @@
"ưas": "ứa", "ưaf": "ừa", "ưar": "ửa", "ưax": "ữa", "ưaj": "ựa",
"úaw": "ứa", "ùaw": "ừa", "ủaw": "ửa", "ũaw": "ữa", "ụaw": "ựa",
"ưcs": "ức", "ưcj": "ực",
"úcw": "ức", "ụcw": "ực",
"ưis": "ứi", "ưif": "ừi", "ưir": "ửi", "ưix": "ữi", "ưij": "ựi",
"úiw": "ứi", "ùiw": "ừi", "ủiw": "ửi", "ũiw": "ữi", "ụiw": "ựi",
"ưms": "ứm", "ưmf": "ừm", "ưmr": "ửm", "ưmx": "ữm", "ưmj": "ựm",
@@ -403,6 +483,8 @@
"ửar": "ưar", "ửaw": "ủaw", "ưarw": "uarw", "ủawr": "uawr",
"ữax": "ưax", "ữaw": "ũaw", "ưaxw": "uaxw", "ũawx": "uawx",
"ựaj": "ưaj", "ựaw": "ụaw", "ưajw": "uajw", "ụawj": "uawj",
"ứcs": "ưcs", "ứcw": "úcw", "ưcsw": "ucsw", "úcws": "ucws",
"ựcj": "ưcj", "ựcw": "ụcw", "ưcjw": "ucjw", "ụcwj": "ucwj",
"ứis": "ưis", "ứiw": "úiw", "ưisw": "uisw", "úiws": "uiws",
"ừif": "ưif", "ừiw": "ùiw", "ưifw": "uifw", "ùiwf": "uiwf",
"ửir": "ưir", "ửiw": "ủiw", "ưirw": "uirw", "ủiwr": "uiwr",
@@ -450,6 +532,11 @@
"iénge": "iếng", "iènge": "iềng", "iẻnge": "iểng", "iẽnge": "iễng", "iẹnge": "iệng",
"iêngs": "iếng", "iêngf": "iềng", "iêngr": "iểng", "iêngx": "iễng", "iêngj": "iệng",
"iếs": "iês", "iếe": "iée", "iêse": "iese", "iées": "iees",
"iềf": "iêf", "iềe": "ièe", "iêfe": "iefe", "ièef": "ieef",
"iểr": "iêr", "iểe": "iẻe", "iêre": "iere", "iẻer": "ieer",
"iễx": "iêx", "iễe": "iẽe", "iêxe": "iexe", "iẽex": "ieex",
"iệj": "iêj", "iệe": "iẹe", "iêje": "ieje", "iẹej": "ieej",
"iếms": "iêms", "iếme": "iéme", "iêmse": "iemse", "iémes": "iemes",
"iềmf": "iêmf", "iềme": "ième", "iêmfe": "iemfe", "ièmef": "iemef",
"iểmr": "iêmr", "iểme": "iẻme", "iêmre": "iemre", "iẻmer": "iemer",

View File

@@ -32,6 +32,18 @@
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "bangladeshi_taka",
"label": "Bangladeshi taka (৳)",
"slots": [
{ "code": 2547, "label": "৳" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "bitcoin",
@@ -45,6 +57,18 @@
{ "code": 165, "label": "¥" }
]
},
{
"id": "costa_rican_colon",
"label": "Costa Rican colón (₡)",
"slots": [
{ "code": 8353, "label": "₡" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "dollar",
"label": "Dollar ($)",

View File

@@ -42,6 +42,12 @@
"label": "AZERTY",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "bengali_bd",
"label": "বাংলা",
"authors": [ "iamrasel" ],
"direction": "ltr"
},
{
"id": "bepo",
@@ -98,12 +104,25 @@
"authors": [ "blucin" ],
"direction": "ltr"
},
{
"id": "colemak_dhm",
"label": "ColemakDHm",
"authors": [ "SteveP", "oneilljp" ],
"direction": "ltr"
},
{
"id": "danish",
"label": "Danish (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "diktor",
"label": "Diktor",
"authors": [ "kuroya2mouse" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:diktor"
},
{
"id": "dvorak",
"label": "Dvorak",
@@ -111,6 +130,13 @@
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak"
},
{
"id": "dvorak_de",
"label": "Dvorak (DE)",
"authors": [ "msrd0" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak_de"
},
{
"id": "dvorak_es",
"label": "Dvorak (ÑÇ)",
@@ -130,6 +156,12 @@
"authors": [ "jeremiah-miller", "patrickgold" ],
"direction": "ltr"
},
{
"id": "estonian",
"label": "Estonian",
"authors": [ "OneSheepy" ],
"direction": "ltr"
},
{
"id": "faroese",
"label": "Faroese (QWERTY)",
@@ -199,13 +231,13 @@
},
{
"id": "jcuken_russian",
"label": "Russian (JCUKEN)",
"label": "Russian (ЙЦУКЕН)",
"authors": [ "williamtheaker" ],
"direction": "ltr"
},
{
"id": "jcuken_ukrainian",
"label": "Ukrainian (JCUKEN)",
"label": "Ukrainian (ЙЦУКЕН)",
"authors": [ "williamtheaker", "33kk" ],
"direction": "ltr"
},
@@ -324,6 +356,12 @@
"authors": ["GrbavaCigla"],
"direction": "ltr"
},
{
"id": "slovenian",
"label": "Slovenian (QWERTZ)",
"authors": ["samo_lego"],
"direction": "ltr"
},
{
"id": "spanish",
"label": "Spanish (QWERTY)",
@@ -354,6 +392,12 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "tamil",
"label": "Tamil",
"authors": [ "Clem0908" ],
"direction": "ltr"
},
{
"id": "thai_kedmanee",
"label": "Thai Kedmanee",
@@ -378,6 +422,18 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "udmurt_compact",
"label": "Udmurt (3 чур)",
"authors": [ "vorgoron" ],
"direction": "ltr"
},
{
"id": "udmurt_extended",
"label": "Udmurt (4 чур)",
"authors": [ "vorgoron" ],
"direction": "ltr"
},
{
"id": "urdu_phonetic",
"label": "Urdu Phonetic",
@@ -396,6 +452,12 @@
"label": "Workman",
"authors": [ "icyphox" ],
"direction": "ltr"
},
{
"id": "jcuken_interslavic",
"label": "Interslavic (ЈЦУКЕН)",
"authors": [ "victorbnl" ],
"direction": "ltr"
}
],
"charactersMod": [
@@ -417,12 +479,24 @@
"authors": [ "HeiWiper" ],
"direction": "rtl"
},
{
"id": "diktor",
"label": "Diktor",
"authors": [ "kuroya2mouse" ],
"direction": "ltr"
},
{
"id": "dvorak",
"label": "Dvorak",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "dvorak_de",
"label": "Dvorak (DE)",
"authors": [ "msrd0" ],
"direction": "ltr"
},
{
"id": "hebrew",
"label": "עברית",
@@ -500,6 +574,12 @@
"label": "Western Arabic (PC)",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "bengali",
"label": "Bengali",
"authors": [ "iamrasel" ],
"direction": "ltr"
}
],
"numericRow": [
@@ -572,7 +652,7 @@
{
"id": "tamil",
"label": "Tamil",
"authors": [ "yashpalgoyal1304" ],
"authors": [ "Clem0908" ],
"direction": "ltr"
},
{
@@ -667,6 +747,12 @@
"label": "Western (Additional symbols)",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "western_samsung",
"label": "Western (Samsung)",
"authors": [ "nettnikl" ],
"direction": "ltr"
}
],
"symbolsMod": [
@@ -726,6 +812,12 @@
"label": "Western",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "western_samsung",
"label": "Western (Samsung)",
"authors": [ "nettnikl" ],
"direction": "ltr"
}
],
"symbols2Mod": [

View File

@@ -0,0 +1,49 @@
[
[
{ "$": "auto_text_key", "code": 1383, "label": "է" },
{ "$": "auto_text_key", "code": 1385, "label": "թ" },
{ "$": "auto_text_key", "code": 1411, "label": "փ" },
{ "$": "auto_text_key", "code": 1393, "label": "ձ" },
{ "$": "auto_text_key", "code": 1403, "label": "ջ" },
{ "$": "auto_text_key", "code": 1408, "label": "ր" },
{ "$": "auto_text_key", "code": 1401, "label": "չ" },
{ "$": "auto_text_key", "code": 1395, "label": "ճ" },
{ "$": "auto_text_key", "code": 1386, "label": "ժ" },
{ "$": "auto_text_key", "code": 1390, "label": "ծ" }
],
[
{ "$": "auto_text_key", "code": 1412, "label": "ք" },
{ "$": "auto_text_key", "code": 1400, "label": "ո" },
{ "$": "auto_text_key", "code": 1381, "label": "ե" },
{ "$": "auto_text_key", "code": 1404, "label": "ռ" },
{ "$": "auto_text_key", "code": 1407, "label": "տ" },
{ "$": "auto_text_key", "code": 1384, "label": "ը" },
{ "$": "auto_text_key", "code": 1410, "label": "ւ" },
{ "$": "auto_text_key", "code": 1387, "label": "ի" },
{ "$": "auto_text_key", "code": 1413, "label": "օ" },
{ "$": "auto_text_key", "code": 1402, "label": "պ" }
],
[
{ "$": "auto_text_key", "code": 1377, "label": "ա" },
{ "$": "auto_text_key", "code": 1405, "label": "ս" },
{ "$": "auto_text_key", "code": 1380, "label": "դ" },
{ "$": "auto_text_key", "code": 1414, "label": "ֆ" },
{ "$": "auto_text_key", "code": 1379, "label": "գ" },
{ "$": "auto_text_key", "code": 1392, "label": "հ" },
{ "$": "auto_text_key", "code": 1397, "label": "յ" },
{ "$": "auto_text_key", "code": 1391, "label": "կ" },
{ "$": "auto_text_key", "code": 1388, "label": "լ" },
{ "$": "auto_text_key", "code": 1389, "label": "խ" }
],
[
{ "$": "auto_text_key", "code": 1382, "label": "զ" },
{ "$": "auto_text_key", "code": 1394, "label": "ղ" },
{ "$": "auto_text_key", "code": 1409, "label": "ց" },
{ "$": "auto_text_key", "code": 1406, "label": "վ" },
{ "$": "auto_text_key", "code": 1378, "label": "բ" },
{ "$": "auto_text_key", "code": 1398, "label": "ն" },
{ "$": "auto_text_key", "code": 1396, "label": "մ" },
{ "$": "auto_text_key", "code": 1399, "label": "շ" }
]
]

View File

@@ -0,0 +1,112 @@
[
[
{ "$": "case_selector",
"lower": { "code": 2457, "label": "ঙ" },
"upper": { "code": 2434, "label": "ং" }
},
{ "$": "case_selector",
"lower": { "code": 2479, "label": "য" },
"upper": { "code": 2527, "label": "য়" }
},
{ "$": "case_selector",
"lower": { "code": 2465, "label": "ড" },
"upper": { "code": 2466, "label": "ঢ" }
},
{ "$": "case_selector",
"lower": { "code": 2474, "label": "প" },
"upper": { "code": 2475, "label": "ফ" }
},
{ "$": "case_selector",
"lower": { "code": 2463, "label": "ট" },
"upper": { "code": 2464, "label": "ঠ" }
},
{ "$": "case_selector",
"lower": { "code": 2458, "label": "চ" },
"upper": { "code": 2459, "label": "ছ" }
},
{ "$": "case_selector",
"lower": { "code": 2460, "label": "জ" },
"upper": { "code": 2461, "label": "ঝ" }
},
{ "$": "case_selector",
"lower": { "code": 2489, "label": "হ" },
"upper": { "code": 2462, "label": "ঞ" }
},
{ "$": "case_selector",
"lower": { "code": 2455, "label": "গ" },
"upper": { "code": 2456, "label": "ঘ" }
},
{ "$": "case_selector",
"lower": { "code": 2524, "label": "ড়" },
"upper": { "code": 2525, "label": "ঢ়" }
}
],
[
{ "$": "case_selector",
"lower": { "code": 2499, "label": "ৃ" },
"upper": { "code": 2435, "label": "ঃ" }
},
{ "$": "case_selector",
"lower": { "code": 2497, "label": "ু" },
"upper": { "code": 2498, "label": "ূ" }
},
{ "$": "case_selector",
"lower": { "code": 2495, "label": "ি" },
"upper": { "code": 2496, "label": "ী" }
},
{ "$": "case_selector",
"lower": { "code": 2494, "label": "া" },
"upper": { "code": 2437, "label": "অ" }
},
{ "$": "case_selector",
"lower": { "code": 2509, "label": "্" },
"upper": { "code": 2433, "label": "ঁ" }
},
{ "$": "case_selector",
"lower": { "code": 2476, "label": "ব" },
"upper": { "code": 2477, "label": "ভ" }
},
{ "$": "case_selector",
"lower": { "code": 2453, "label": "ক" },
"upper": { "code": 2454, "label": "খ" }
},
{ "$": "case_selector",
"lower": { "code": 2468, "label": "ত" },
"upper": { "code": 2469, "label": "থ" }
},
{ "$": "case_selector",
"lower": { "code": 2470, "label": "দ" },
"upper": { "code": 2471, "label": "ধ" }
}
],
[
{ "$": "case_selector",
"lower": { "$": "multi_text_key", "codePoints": [2509, 2480], "label": "্র" },
"upper": { "$": "multi_text_key", "codePoints": [2509, 2479], "label": "্য" }
},
{ "$": "case_selector",
"lower": { "code": 2507, "label": "ো" },
"upper": { "code": 2508, "label": "ৌ" }
},
{ "$": "case_selector",
"lower": { "code": 2503, "label": "ে" },
"upper": { "code": 2504, "label": "ৈ" }
},
{ "$": "case_selector",
"lower": { "code": 2480, "label": "র" },
"upper": { "code": 2482, "label": "ল" }
},
{ "$": "case_selector",
"lower": { "code": 2472, "label": "ন" },
"upper": { "code": 2467, "label": "ণ" }
},
{ "$": "case_selector",
"lower": { "code": 2488, "label": "স" },
"upper": { "code": 2487, "label": "ষ" }
},
{ "$": "case_selector",
"lower": { "code": 2478, "label": "ম" },
"upper": { "code": 2486, "label": "শ" }
}
]
]

View File

@@ -0,0 +1,46 @@
[
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 108, "label": "l" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "case_selector",
"lower": { "code": 59, "label": ";", "popup": {
"relevant": [
{ "code": 58, "label": ":" }
]
} },
"upper": { "code": 58, "label": ":", "popup": {
"relevant": [
{ "code": 59, "label": ";" }
]
} }
}
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 111, "label": "o" }
],
[
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 104, "label": "h" }
]
]

View File

@@ -0,0 +1,49 @@
[
[
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1100, "label": "ь" },
{ "$": "auto_text_key", "code": 1103, "label": "я" },
{ "$": "case_selector",
"lower": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 46, "label": "." }
]
} },
"upper": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 44, "label": "," }
]
} }
},
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1074, "label": "в" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1076, "label": "д" },
{ "$": "auto_text_key", "code": 1095, "label": "ч" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1097, "label": "щ" }
],
[
{ "$": "auto_text_key", "code": 1091 , "label": "у" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1077 , "label": "е" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1085 , "label": "н" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1081 , "label": "й" }
],
[
{ "$": "auto_text_key", "code": 1101 , "label": "э" },
{ "$": "auto_text_key", "code": 1093 , "label": "х" },
{ "$": "auto_text_key", "code": 1099 , "label": "ы" },
{ "$": "auto_text_key", "code": 1102 , "label": "ю" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" },
{ "$": "auto_text_key", "code": 1075 , "label": "г" }
]
]

View File

@@ -0,0 +1,71 @@
[
[
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "shift_state_selector",
"shiftedManual": { "code": 59, "label": ";", "popup": {
"relevant": [
{ "code": 44, "label": "," }
]
} },
"default": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 59, "label": ";" }
]
} }
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 58, "label": ":", "popup": {
"relevant": [
{ "code": 46, "label": "." }
]
} },
"default": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 58, "label": ":" }
]
} }
},
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "shift_state_selector",
"shiftedManual": { "code": 223, "label": "ß", "popup": {
"relevant": [
{ "code": 63, "label": "?" }
]
} },
"default": { "code": 63, "label": "?", "popup": {
"relevant": [
{ "code": 223, "label": "ß" }
]
} }
}
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 111, "label": "o" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 108, "label": "l" }
],
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 118, "label": "v" }
]
]

View File

@@ -0,0 +1,38 @@
[
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 111, "label": "o" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 252, "label": "ü" }
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 108, "label": "l" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 228, "label": "ä" }
],
[
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 245, "label": "õ" }
]
]

View File

@@ -0,0 +1,36 @@
[
[
{ "$": "auto_text_key", "code": 1112, "label": "ј" },
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1091, "label": "у" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1077, "label": "е" },
{ "$": "auto_text_key", "code": 1085, "label": "н" },
{ "$": "auto_text_key", "code": 1114, "label": "њ" },
{ "$": "auto_text_key", "code": 1075, "label": "г" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1093, "label": "х" }
],
[
{ "$": "auto_text_key", "code": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1099 , "label": "ы" },
{ "$": "auto_text_key", "code": 1074 , "label": "в" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1113 , "label": "љ" },
{ "$": "auto_text_key", "code": 1078 , "label": "ж" }
],
[
{ "$": "auto_text_key", "code": 1108 , "label": "є" },
{ "$": "auto_text_key", "code": 1095 , "label": "ч" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" }
]
]

View File

@@ -0,0 +1,37 @@
[
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 111, "label": "o" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 353, "label": "š" }
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 108, "label": "l" },
{ "$": "auto_text_key", "code": 269, "label": "č" }
],
[
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 382, "label": "ž" }
]
]

View File

@@ -0,0 +1,98 @@
[
[
{ "$": "case_selector",
"lower": { "code": 2974, "label": "ஞ" },
"upper": { "code": 2998, "label": "ஶ" }
},
{ "$": "case_selector",
"lower": { "code": 2993, "label": "ற" },
"upper": { "code": 2999, "label": "ஷ" }
},
{ "$": "case_selector",
"lower": { "code": 2984, "label": "ந" },
"upper": { "code": 3000, "label": "ஸ" }
},
{ "$": "case_selector",
"lower": { "code": 2970, "label": "ச" },
"upper": { "code": 3001, "label": "ஹ" }
},
{ "$": "case_selector",
"lower": { "code": 2997, "label": "வ" },
"upper": { "code": 2972, "label": "ஜ" }
},
{ "$": "case_selector",
"lower": { "code": 2992, "label": "ர" },
"upper": { "code": 2994, "label": "ல" }
},
{ "$": "case_selector",
"lower": { "code": 3016, "label": "ை" },
"upper": { "code": 2960, "label": "ஐ" }
},
{ "$": "case_selector",
"lower": { "code": 3018, "label": "ொ" },
"upper": { "code": 3019, "label": "ோ" }
},
{ "$": "case_selector",
"lower": { "code": 3007, "label": "ி" },
"upper": { "code": 3008, "label": "ீ" }
},
{ "$": "case_selector",
"lower": { "code": 3009, "label": "ு" },
"upper": { "code": 3010, "label": "ூ" }
}
],
[
{ "$": "auto_text_key", "code": 2991, "label": "ய" },
{ "$": "auto_text_key", "code": 2995, "label": "ள" },
{ "$": "auto_text_key", "code": 2985, "label": "ன" },
{ "$": "auto_text_key", "code": 2965, "label": "க" },
{ "$": "auto_text_key", "code": 2986, "label": "ப" },
{ "$": "case_selector",
"lower": { "code": 3006, "label": "ா" },
"upper": { "code": 2996, "label": "ழ" }
},
{ "$": "case_selector",
"lower": { "code": 2980, "label": "த" },
"upper": { "code": 2990, "label": "ம" }
},
{ "$": "case_selector",
"lower": { "code": 2975, "label": "ட" },
"upper": { "code": 2969, "label": "ங" }
},
{ "$": "case_selector",
"lower": { "code": 3021, "label": "்" },
"upper": { "code": 2947, "label": "ஃ" }
},
{ "$": "case_selector",
"lower": { "code": 2951, "label": "இ" },
"upper": { "code": 2952, "label": "ஈ" }
}
],
[
{ "$": "auto_text_key", "code": 2979, "label": "ண" },
{ "$": "case_selector",
"lower": { "code": 2962, "label": "ஒ" },
"upper": { "code": 2963, "label": "ஓ" }
},
{ "$": "case_selector",
"lower": { "code": 2953, "label": "உ" },
"upper": { "code": 2954, "label": "ஊ" }
},
{ "$": "case_selector",
"lower": { "code": 2958, "label": "எ" },
"upper": { "code": 2959, "label": "ஏ" }
},
{ "$": "case_selector",
"lower": { "code": 3014, "label": "ெ" },
"upper": { "code": 3015, "label": "ே" }
},
{ "$": "case_selector",
"lower": { "code": 2964, "label": "ஔ" },
"upper": { "code": 3020, "label": "ௌ" }
},
{ "$": "case_selector",
"lower": { "code": 2949, "label": "அ" },
"upper": { "code": 2950, "label": "ஆ" }
}
]
]

View File

@@ -0,0 +1,39 @@
[
[
{ "$": "auto_text_key", "code": 1081, "label": "й" },
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1091, "label": "у" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1077, "label": "е" },
{ "$": "auto_text_key", "code": 1085, "label": "н" },
{ "$": "auto_text_key", "code": 1075, "label": "г" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1097, "label": "щ" },
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1093, "label": "х" }
],
[
{ "$": "auto_text_key", "code": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1099 , "label": "ы" },
{ "$": "auto_text_key", "code": 1074 , "label": "в" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1076 , "label": "д" },
{ "$": "auto_text_key", "code": 1078 , "label": "ж" },
{ "$": "auto_text_key", "code": 1101 , "label": "э" }
],
[
{ "$": "auto_text_key", "code": 1103 , "label": "я" },
{ "$": "auto_text_key", "code": 1095 , "label": "ч" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1100 , "label": "ь" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1102 , "label": "ю" }
]
]

View File

@@ -0,0 +1,48 @@
[
[
{ "$": "auto_text_key", "code": 1081, "label": "ё" },
{ "$": "auto_text_key", "code": 1245, "label": "ӝ" },
{ "$": "auto_text_key", "code": 1255, "label": "ӧ" },
{ "$": "auto_text_key", "code": 1269, "label": "ӵ" },
{ "$": "auto_text_key", "code": 1253, "label": "ӥ" },
{ "$": "auto_text_key", "code": 1247, "label": "ӟ" },
{ "$": "auto_text_key", "code": 1100, "label": "ь" },
{ "$": "auto_text_key", "code": 1098, "label": "ъ" },
{ "$": "auto_text_key", "code": 1093, "label": "х" },
{ "$": "auto_text_key", "code": 1101, "label": "э" }
],
[
{ "$": "auto_text_key", "code": 1081, "label": "й" },
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1091, "label": "у" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1077, "label": "е" },
{ "$": "auto_text_key", "code": 1085, "label": "н" },
{ "$": "auto_text_key", "code": 1075, "label": "г" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1097, "label": "щ" },
{ "$": "auto_text_key", "code": 1079, "label": "з" }
],
[
{ "$": "auto_text_key", "code": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1099 , "label": "ы" },
{ "$": "auto_text_key", "code": 1074 , "label": "в" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1076 , "label": "д" },
{ "$": "auto_text_key", "code": 1078 , "label": "ж" }
],
[
{ "$": "auto_text_key", "code": 1103 , "label": "я" },
{ "$": "auto_text_key", "code": 1095 , "label": "ч" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1102 , "label": "ю" }
]
]

View File

@@ -0,0 +1,16 @@
[
[
{ "code": -11, "label": "shift", "type": "modifier" },
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "$": "auto_text_key", "code": 1092, "label": "ф", "groupId": 1 },
{ "code": -227, "label": "language_switch", "type": "system_gui" },
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "$": "auto_text_key", "code": 1078, "label": "ж", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -0,0 +1,16 @@
[
[
{ "code": -11, "label": "shift", "type": "modifier" },
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "$": "auto_text_key", "code": 228, "label": "ä", "groupId": 1 },
{ "code": -227, "label": "language_switch", "type": "system_gui" },
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "$": "auto_text_key", "code": 246, "label": "ö", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -14,7 +14,6 @@
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "code": 8204, "label": "half_space" },
{ "code": 1600, "label": "kashida" },
{ "code": 46, "label": ".", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]

View File

@@ -1,12 +0,0 @@
[
[
{ "code": -35, "label": "clipboard_select_all", "type": "enter_editing" },
{ "code": -31, "label": "clipboard_copy", "type": "enter_editing" },
{ "code": -32, "label": "clipboard_cut", "type": "enter_editing" },
{ "code": -21, "label": "arrow_left", "type": "navigation" },
{ "code": -22, "label": "arrow_right", "type": "navigation" },
{ "code": -33, "label": "clipboard_paste", "type": "enter_editing" },
{ "code": -38, "label": "clipboard_clear_primary_clip", "type": "system_gui"},
{ "code": -213, "label": "ime_ui_mode_clipboard", "type": "system_gui"}
]
]

View File

@@ -0,0 +1,48 @@
[
[
{ "code": 43, "label": "+", "popup": {
"relevant": [
{ "code": 45, "label": "-" },
{ "code": 215, "label": "×" },
{ "code": 247, "label": "÷" }
]
} },
{ "code": 2535, "label": "১", "type": "numeric" },
{ "code": 2536, "label": "২", "type": "numeric" },
{ "code": 2537, "label": "৩", "type": "numeric" },
{ "code": 37, "label": "%" }
],
[
{ "code": 40, "label": "(", "popup": {
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 2538, "label": "", "type": "numeric" },
{ "code": 2539, "label": "৫", "type": "numeric" },
{ "code": 2540, "label": "৬", "type": "numeric" },
{ "code": 32, "label": "space" }
],
[
{ "code": 41, "label": ")", "popup": {
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
{ "code": 2541, "label": "", "type": "numeric" },
{ "code": 2542, "label": "৮", "type": "numeric" },
{ "code": 2543, "label": "৯", "type": "numeric" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "code": 44, "label": "," },
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "code": 2534, "label": "", "type": "numeric" },
{ "code": 61, "label": "=" },
{ "code": 46, "label": "." },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -54,7 +54,7 @@
{ "code": 3672, "label": "๘", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
} },
{ "code": 3672, "label": "", "type": "numeric", "popup": {
{ "code": 3673, "label": "", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "⁹" }
} },
{ "code": 3664, "label": "", "type": "numeric", "popup": {

View File

@@ -1,68 +1,200 @@
[
[
{ "code": 49, "label": "1", "type": "numeric", "popup": {
"main": { "code": 185, "label": "¹" },
"relevant": [
{ "code": 8537, "label": "" },
{ "code": 8528, "label": "⅐" },
{ "code": 8539, "label": "⅛" },
{ "code": 8529, "label": "⅑" },
{ "code": 8530, "label": "" },
{ "code": 189, "label": "½" },
{ "code": 8531, "label": "⅓" },
{ "code": 188, "label": "¼" },
{ "code": 8533, "label": "" }
]
} },
{ "code": 50, "label": "2", "type": "numeric", "popup": {
"main": { "code": 178, "label": "²" },
"relevant": [
{ "code": 8532, "label": "" },
{ "code": 8534, "label": "" }
]
} },
{ "code": 51, "label": "3", "type": "numeric", "popup": {
"main": { "code": 179, "label": "³" },
"relevant": [
{ "code": 8535, "label": "" },
{ "code": 190, "label": "¾" },
{ "code": 8540, "label": "⅜" }
]
} },
{ "code": 52, "label": "4", "type": "numeric", "popup": {
"main": { "code": 8308, "label": "" },
"relevant": [
{ "code": 8536, "label": "⅘" }
]
} },
{ "code": 53, "label": "5", "type": "numeric", "popup": {
"main": { "code": 8309, "label": "⁵" },
"relevant": [
{ "code": 8538, "label": "" },
{ "code": 8541, "label": "⅝" }
]
} },
{ "code": 54, "label": "6", "type": "numeric", "popup": {
"main": { "code": 8310, "label": "" }
} },
{ "code": 55, "label": "7", "type": "numeric", "popup": {
"main": { "code": 8311, "label": "" },
"relevant": [
{ "code": 8542, "label": "⅞" }
]
} },
{ "code": 56, "label": "8", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
} },
{ "code": 57, "label": "9", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "" }
} },
{ "code": 48, "label": "0", "type": "numeric", "popup": {
"main": { "code": 8304, "label": "" },
"relevant": [
{ "code": 8709, "label": "" },
{ "code": 8319, "label": "ⁿ" }
]
} }
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 33, "label": "!", "type": "numeric", "popup": {
"main": { "code": 161, "label": "¡" }
}
},
"default": {
"code": 49, "label": "1", "type": "numeric", "popup": {
"main": { "code": 185, "label": "¹" },
"relevant": [
{ "code": 8537, "label": "" },
{ "code": 8528, "label": "" },
{ "code": 8539, "label": "⅛" },
{ "code": 8529, "label": "⅑" },
{ "code": 8530, "label": "" },
{ "code": 189, "label": "½" },
{ "code": 8531, "label": "⅓" },
{ "code": 188, "label": "¼" },
{ "code": 8533, "label": "" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 64, "label": "@", "type": "numeric" },
"default": {
"code": 50, "label": "2", "type": "numeric", "popup": {
"main": { "code": 178, "label": "²" },
"relevant": [
{ "code": 8532, "label": "" },
{ "code": 8534, "label": "" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 35, "label": "#", "type": "numeric", "popup": {
"main": { "code": 8470, "label": "" }
}
},
"default": {
"code": 51, "label": "3", "type": "numeric", "popup": {
"main": { "code": 179, "label": "³" },
"relevant": [
{ "code": 8535, "label": "" },
{ "code": 190, "label": "¾" },
{ "code": 8540, "label": "⅜" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": -801, "label": "currency_slot_1", "type": "numeric", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
}
},
"default": {
"code": 52, "label": "4", "type": "numeric", "popup": {
"main": { "code": 8308, "label": "⁴" },
"relevant": [
{ "code": 8536, "label": "⅘" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 37, "label": "%", "type": "numeric", "popup": {
"main": { "code": 8240, "label": "‰" },
"relevant": [
{ "code": 8453, "label": "℅" }
]
}
},
"default": {
"code": 53, "label": "5", "type": "numeric", "popup": {
"main": { "code": 8309, "label": "⁵" },
"relevant": [
{ "code": 8538, "label": "⅚" },
{ "code": 8541, "label": "⅝" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 94, "label": "^", "type": "numeric", "popup": {
"main": { "code": 8593, "label": "↑" },
"relevant": [
{ "code": 8592, "label": "←" },
{ "code": 8595, "label": "↓" },
{ "code": 8594, "label": "→" }
]
}
},
"default": {
"code": 54, "label": "6", "type": "numeric", "popup": {
"main": { "code": 8310, "label": "⁶" }
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 38, "label": "&", "type": "numeric" },
"default": {
"code": 55, "label": "7", "type": "numeric", "popup": {
"main": { "code": 8311, "label": "⁷" },
"relevant": [
{ "code": 8542, "label": "⅞" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 42, "label": "*", "type": "numeric", "popup": {
"main": { "code": 8224, "label": "†" },
"relevant": [
{ "code": 9733, "label": "★" },
{ "code": 8225, "label": "‡" }
]
}
},
"default": {
"code": 56, "label": "8", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"$": "layout_direction_selector",
"ltr": {
"code": 40, "label": "(", "type": "numeric", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
}
},
"rtl": {
"code": 41, "label": "(", "type": "numeric", "popup": {
"main": { "code": 62, "label": "<" },
"relevant": [
{ "code": 93, "label": "[" },
{ "code": 125, "label": "{" }
]
}
}
},
"default": {
"code": 57, "label": "9", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "⁹" }
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"$": "layout_direction_selector",
"ltr": {
"code": 41, "label": ")", "type": "numeric", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
}
},
"rtl": {
"code": 40, "label": ")", "type": "numeric", "popup": {
"main": { "code": 60, "label": ">" },
"relevant": [
{ "code": 91, "label": "]" },
{ "code": 123, "label": "}" }
]
}
}
},
"default": {
"code": 48, "label": "0", "type": "numeric", "popup": {
"main": { "code": 8304, "label": "⁰" },
"relevant": [
{ "code": 8709, "label": "∅" },
{ "code": 8319, "label": "ⁿ" }
]
}
}
}
]
]

View File

@@ -8,15 +8,13 @@
},
"half": { "code": 64, "label": "@" }
},
{ "code": 12306, "label": "〒", "popup": {
"main": { "code": 12320, "label": "〠" }
}
},
{
"$": "char_width_selector",
"full": { "code": 65283, "label": "", "popup": {
"main": { "code": 35, "label": "#" },
"relevant": [
{ "code": 12306, "label": "〒"},
{ "code": 12320, "label": "〠" },
{ "code": 8470, "label": "№" }
]
}
@@ -24,6 +22,8 @@
"half": { "code": 35, "label": "#", "popup": {
"main": { "code": 65283, "label": "" },
"relevant": [
{ "code": 12306, "label": "〒"},
{ "code": 12320, "label": "〠" },
{ "code": 8470, "label": "№" }
]
}
@@ -99,14 +99,18 @@
"full": { "code": 65291, "label": "", "popup": {
"main": { "code": 43, "label": "+" },
"relevant": [
{ "code": 177, "label": "±" }
{ "code": 177, "label": "±" },
{ "code": 61, "label": "=" },
{ "code": 65309, "label": "" }
]
}
},
"half": { "code": 43, "label": "+", "popup": {
"main": { "code": 65291, "label": "" },
"relevant": [
{ "code": 177, "label": "±" }
{ "code": 177, "label": "±" },
{ "code": 61, "label": "=" },
{ "code": 65309, "label": "" }
]
}
}
@@ -117,16 +121,20 @@
"main": { "code": 12302, "label": "『" },
"relevant": [
{ "code": 12304, "label": "【" },
{ "code": 12310, "label": "〖" }
{ "code": 12310, "label": "〖" },
{ "code": 65288, "label": "" },
{ "code": 65339, "label": "" }
]
}
},
"half": { "code": 65378, "label": "「", "popup": {
"main": { "code": 12301, "label": "" },
"main": { "code": 12300, "label": "" },
"relevant": [
{ "code": 12303, "label": "" },
{ "code": 12302, "label": "" },
{ "code": 12304, "label": "【" },
{ "code": 12310, "label": "〖" }
{ "code": 12310, "label": "〖" },
{ "code": 40, "label": "(" },
{ "code": 91, "label": "[" }
]
}
}
@@ -137,7 +145,9 @@
"main": { "code": 12303, "label": "』" },
"relevant": [
{ "code": 12305, "label": "】" },
{ "code": 12311, "label": "〗" }
{ "code": 12311, "label": "〗" },
{ "code": 65289, "label": "" },
{ "code": 65341, "label": "" }
]
}
},
@@ -146,7 +156,9 @@
"relevant": [
{ "code": 12303, "label": "』" },
{ "code": 12305, "label": "】" },
{ "code": 12311, "label": "〗" }
{ "code": 12311, "label": "〗" },
{ "code": 41, "label": ")" },
{ "code": 93, "label": "]" }
]
}
}

View File

@@ -0,0 +1,85 @@
[
[
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 215, "label": "×" },
{ "code": 247, "label": "÷" },
{ "code": 61, "label": "=", "popup": {
"main": { "code": 8776, "label": "≈" },
"relevant": [
{ "code": 8800, "label": "≠" },
{ "code": 8801, "label": "≡" }
]
} },
{ "code": 47, "label": "/" },
{ "code": 95, "label": "_" },
{ "code": 60, "label": "<" },
{ "code": 62, "label": ">" },
{ "code": 91, "label": "[", "popup": {
"main": { "code": 12302, "label": "『" },
"relevant": [
{ "code": 12300, "label": "「" },
{ "code": 12308, "label": "" },
{ "code": 12304, "label": "【" }
]
} },
{ "code": 93, "label": "]", "popup": {
"main": { "code": 12303, "label": "』" },
"relevant": [
{ "code": 12301, "label": "」" },
{ "code": 12309, "label": "" },
{ "code": 12305, "label": "】" }
]
} }
],
[
{ "code": 33, "label": "!", "popup": {
"main": { "code": 161, "label": "¡" }
} },
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#", "popup": {
"main": { "code": 8470, "label": "№" }
} },
{ "code": -801, "label": "currency_slot_1", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
} },
{ "code": 37, "label": "%", "popup": {
"main": { "code": 1642, "label": "٪" },
"relevant": [
{ "code": 8240, "label": "‰" }
]
} },
{ "code": 94, "label": "^" },
{ "code": 38, "label": "&" },
{ "code": 42, "label": "*" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" }
],
[
{ "code": 45, "label": "-", "popup": {
"main": { "code": 8208, "label": "" },
"relevant": [
{ "code": 8211, "label": "" },
{ "code": 8212, "label": "—" }
]
} },
{ "code": 39, "label": "'" },
{ "code": 34, "label": "\"" },
{ "code": 58, "label": ":" },
{ "code": 59, "label": ";" },
{ "code": 44, "label": "," },
{ "code": 63, "label": "?", "popup": {
"main": { "code": 191, "label": "¿" },
"relevant": [
{ "code": 8253, "label": "‽" }
]
} }
]
]

View File

@@ -54,7 +54,9 @@
]
} }
},
{ "code": 8730, "label": "√" },
{ "code": 8730, "label": "√", "popup": {
"main": { "code": 10003, "label": "✓" }
} },
{ "code": 960, "label": "π", "popup": {
"main": { "code": 928, "label": "Π" },
"relevant": [
@@ -104,7 +106,7 @@
{ "code": 61, "label": "=", "popup": {
"main": { "code": 8800, "label": "≠" },
"relevant": [
{ "code": 61, "label": "=" },
{ "code": 65309, "label": "" },
{ "code": 8734, "label": "∞" },
{ "code": 8776, "label": "≈" }
]

View File

@@ -0,0 +1,45 @@
[
[
{ "code": 96, "label": "`" },
{ "code": 126, "label": "~" },
{ "code": 92, "label": "\\" },
{ "code": 124, "label": "|" },
{ "code": 123, "label": "{" },
{ "code": 125, "label": "}" },
{ "code": -802, "label": "currency_slot_2" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" },
{ "code": -806, "label": "currency_slot_6" }
],
[
{ "code": 176, "label": "°" },
{ "code": 8226, "label": "•" },
{ "code": 9675, "label": "○" },
{ "code": 9679, "label": "●" },
{ "code": 9633, "label": "□" },
{ "code": 9632, "label": "■" },
{ "code": 9828, "label": "♤", "popup": {
"main": { "code": 9824, "label": "♠️" }
} },
{ "code": 9825, "label": "♡", "popup": {
"main": { "code": 9829, "label": "♥️" }
} },
{ "code": 9671, "label": "◇", "popup": {
"main": { "code": 9670, "label": "◆" }
} },
{ "code": 9831, "label": "♧", "popup": {
"main": { "code": 9827, "label": "♣️" }
} }
],
[
{ "code": 9734, "label": "☆", "popup": {
"main": { "code": 9733, "label": "★" }
} },
{ "code": 9642, "label": "▪️" },
{ "code": 164, "label": "¤" },
{ "code":12298, "label": "《" },
{ "code":12299, "label": "》" },
{ "code": 161, "label": "¡" },
{ "code": 191, "label": "¿" }
]
]

View File

@@ -6,15 +6,28 @@
],
[
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "code": 12296, "label": "〈", "popup": {
"main": { "code": 12298, "label": "《" },
"relevant": [
{ "code": 8804, "label": "≤" },
{ "code": 8249, "label": "" },
{ "code": 10216, "label": "" },
{ "code": 65308, "label": "" }
]
} },
{ "$": "char_width_selector",
"full": { "code": 12296, "label": "〈", "popup": {
"main": { "code": 12298, "label": "《" },
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 8804, "label": "" },
{ "code": 8249, "label": "" },
{ "code": 10216, "label": "⟨" },
{ "code": 65308, "label": "" }
]
} },
"half": { "code": 60, "label": "<", "popup": {
"main": { "code": 12298, "label": "《" },
"relevant": [
{ "code": 12296, "label": "〈" },
{ "code": 8804, "label": "≤" },
{ "code": 8249, "label": "" },
{ "code": 10216, "label": "⟨" },
{ "code": 65308, "label": "" }
]
} }
},
{ "code": -205, "label": "view_numeric_advanced", "type": "system_gui" },
{ "code": 12288, "label": "空白" },
{ "code": -9701, "label": "char_width_switcher", "type": "system_gui", "popup": {
@@ -24,15 +37,28 @@
]
}
},
{ "code": 12297, "label": "〉", "popup": {
"main": { "code": 12299, "label": "》" },
"relevant": [
{ "code": 62, "label": ">" },
{ "code": 8805, "label": "" },
{ "code": 10217, "label": "" },
{ "code": 65310, "label": "" }
]
} },
{ "$": "char_width_selector",
"full": { "code": 12297, "label": "〉", "popup": {
"main": { "code": 12299, "label": "》" },
"relevant": [
{ "code": 62, "label": ">" },
{ "code": 8805, "label": "" },
{ "code": 8250, "label": "" },
{ "code": 10217, "label": "⟩" },
{ "code": 65310, "label": "" }
]
} },
"half": { "code": 62, "label": ">", "popup": {
"main": { "code": 12299, "label": "》" },
"relevant": [
{ "code": 12297, "label": "〉" },
{ "code": 8805, "label": "≥" },
{ "code": 8250, "label": "" },
{ "code": 10217, "label": "⟩" },
{ "code": 65310, "label": "" }
]
} }
},
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -8,11 +8,17 @@
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "$": "char_width_selector",
"full": { "code": 12289, "label": "、", "popup": {
"main": { "code": 44, "label": "," }
"main": { "code": 65292, "label": "" },
"relevant": [
{ "code": 44, "label": "," }
]
}
},
"half": { "code": 65380, "label": "、", "popup": {
"main": { "code": 44, "label": "," }
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 65292, "label": "" }
]
}
}
},

View File

@@ -17,15 +17,21 @@
{
"id": "default",
"label": "Default",
"symbolsPrecedingSpace": ".*[.,;:!?‽&%)\\]}»©®™\\p{L}0-9]",
"symbolsFollowingSpace": "[\\p{L}0-9].*"
"symbolsPrecedingAutoSpace": ".,?‽!\"&%)]}»",
"symbolsFollowingAutoSpace": "",
"symbolsPrecedingPhantomSpace": ".,;:?‽!&%)]}»©®™",
"symbolsFollowingPhantomSpace": "¿⸘¡([{",
"symbolsTerminatingSentence": ".?‽!"
}
],
"popupMappings": [
{ "id": "default", "authors": [ "patrickgold" ] },
{ "id": "ar", "authors": [ "HeiWiper" ] },
{ "id": "ast", "authors": [ "Softastur" ] },
{ "id": "bg", "authors": [ "iorvethe" ] },
{ "id": "bn-BD", "authors": [ "iamrasel" ] },
{ "id": "ca", "authors": [ "mikelloc" ] },
{ "id": "cjk", "authors": [ "moonbeamcelery" ] },
{ "id": "ckb", "authors": [ "GoRaN" ] },
{ "id": "cs", "authors": [ "stefan-misik" ] },
{ "id": "da", "authors": [ "patrickgold" ] },
@@ -35,6 +41,7 @@
{ "id": "en", "authors": [ "patrickgold" ] },
{ "id": "eo", "authors": [ "jeremiah-miller" ] },
{ "id": "es", "authors": [ "patrickgold" ] },
{ "id": "et", "authors": [ "OneSheepy" ] },
{ "id": "fa", "authors": [ "PHELAT" ] },
{ "id": "fa2", "authors": [ "M-Koushan" ] },
{ "id": "fa3", "authors": [ "SaeID-Rz" ] },
@@ -49,6 +56,7 @@
{ "id": "it", "authors": [ "patrickgold" ] },
{ "id": "iw", "authors": [ "Antony" ] },
{ "id": "ja-JP-jis", "authors": [ "waelwindows" ] },
{ "id": "kab", "authors": [ "yanis867" ] },
{ "id": "ko", "authors": [ "patrickgold", "Hayleia" ] },
{ "id": "ku", "authors": [ "GoRaN" ] },
{ "id": "lt", "authors": [ "patrickgold" ] },
@@ -65,6 +73,7 @@
{ "id": "sr", "authors": [ "hedidnothingwrong", "GrbavaCigla" ] },
{ "id": "sv", "authors": [ "patrickgold" ] },
{ "id": "tr", "authors": [ "kisekinopureya", "patrickgold", "dvrnynr" ] },
{ "id": "udm", "authors": [ "vorgoron" ] },
{ "id": "uk", "authors": [ "williamtheaker", "33kk", "honsiorovskyi" ] },
{ "id": "uk-cyr-ext", "authors": [ "williamtheaker", "33kk", "honsiorovskyi" ] },
{ "id": "ur-PK", "authors": [ "mubashir-rehman", "mirfatif" ] },
@@ -513,6 +522,15 @@
"characters": "org.florisboard.layouts:serbian_cyrillic"
}
},
{
"languageTag": "sl-SI",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:sl-SI",
"preferred": {
"characters": "org.florisboard.layouts:slovenian"
}
},
{
"languageTag": "lv-LV",
"composer": "org.florisboard.composers:appender",
@@ -633,6 +651,15 @@
"numericRow": "org.florisboard.layouts:warang_citi"
}
},
{
"languageTag": "udm",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:russian_ruble",
"popupMapping": "org.florisboard.localization:udm",
"preferred": {
"characters": "org.florisboard.layouts:udmurt_extended"
}
},
{
"languageTag": "ur-PK",
"composer": "org.florisboard.composers:appender",
@@ -641,6 +668,58 @@
"preferred": {
"characters": "org.florisboard.layouts:urdu_phonetic"
}
},
{
"languageTag": "zh-CN-zhengma",
"composer": "org.florisboard.composers:appender",
"nlpProviders": {
"spelling": "org.florisboard.nlp.providers.han.shape",
"suggestion": "org.florisboard.nlp.providers.han.shape"
},
"currencySet": "org.florisboard.currencysets:yen",
"popupMapping": "org.florisboard.localization:cjk",
"preferred": {
"characters": "org.florisboard.layouts:qwerty",
"symbols": "org.florisboard.layouts:cjk",
"symbols2": "org.florisboard.layouts:cjk"
}
},
{
"languageTag": "bn-BD",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:bangladeshi_taka",
"popupMapping": "org.florisboard.localization:bn-BD",
"preferred": {
"characters": "org.florisboard.layouts:bengali_bd",
"numericRow": "org.florisboard.layouts:bengali",
"numericAdvanced": "org.florisboard.layouts:bengali"
}
},
{
"languageTag": "ast",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:ast",
"preferred": {
"characters": "org.florisboard.layouts:qwerty"
}
},
{
"languageTag": "ta-lk",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:indian_rupee",
"preferred": {
"characters": "org.florisboard.layouts:tamil"
}
},
{
"languageTag": "kab",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:kab",
"preferred": {
"characters": "org.florisboard.layouts:qwerty"
}
}
]
}

View File

@@ -0,0 +1,115 @@
{
"all": {
"a": {
"main": { "$": "auto_text_key", "code": 225, "label": "á" },
"relevant": [
{ "$": "auto_text_key", "code": 170, "label": "ª" },
{ "$": "auto_text_key", "code": 229, "label": "å" },
{ "$": "auto_text_key", "code": 261, "label": "ą" },
{ "$": "auto_text_key", "code": 230, "label": "æ" },
{ "$": "auto_text_key", "code": 257, "label": "ā" },
{ "$": "auto_text_key", "code": 224, "label": "à" },
{ "$": "auto_text_key", "code": 228, "label": "ä" },
{ "$": "auto_text_key", "code": 226, "label": "â" },
{ "$": "auto_text_key", "code": 227, "label": "ã" }
]
},
"c": {
"main": { "$": "auto_text_key", "code": 231, "label": "ç" },
"relevant": [
{ "$": "auto_text_key", "code": 269, "label": "č" },
{ "$": "auto_text_key", "code": 263, "label": "ć" }
]
},
"e": {
"main": { "$": "auto_text_key", "code": 233, "label": "é" },
"relevant": [
{ "$": "auto_text_key", "code": 7497, "label": "ᵉ" },
{ "$": "auto_text_key", "code": 275, "label": "ē" },
{ "$": "auto_text_key", "code": 281, "label": "ę" },
{ "$": "auto_text_key", "code": 279, "label": "ė" },
{ "$": "auto_text_key", "code": 235, "label": "ë" },
{ "$": "auto_text_key", "code": 232, "label": "è" },
{ "$": "auto_text_key", "code": 234, "label": "ê" }
]
},
"h": {
"relevant": [
{ "$": "auto_text_key", "code": 7717, "label": "ḥ" }
]
},
"i": {
"main": { "$": "auto_text_key", "code": 237, "label": "í" },
"relevant": [
{ "$": "auto_text_key", "code": 299, "label": "ī" },
{ "$": "auto_text_key", "code": 238, "label": "î" },
{ "$": "auto_text_key", "code": 303, "label": "į" },
{ "$": "auto_text_key", "code": 236, "label": "ì" },
{ "$": "auto_text_key", "code": 239, "label": "ï" }
]
},
"l": {
"relevant": [
{ "$": "auto_text_key", "code": 7735, "label": "ḷ" }
]
},
"n": {
"relevant": [
{ "$": "auto_text_key", "code": 241, "label": "ñ" },
{ "$": "auto_text_key", "code": 324, "label": "ń" }
]
},
"o": {
"main": { "$": "auto_text_key", "code": 243, "label": "ó" },
"relevant": [
{ "$": "auto_text_key", "code": 186, "label": "º" },
{ "$": "auto_text_key", "code": 333, "label": "ō" },
{ "$": "auto_text_key", "code": 248, "label": "ø" },
{ "$": "auto_text_key", "code": 339, "label": "œ" },
{ "$": "auto_text_key", "code": 245, "label": "õ" },
{ "$": "auto_text_key", "code": 244, "label": "ô" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 242, "label": "ò" }
]
},
"r": {
"relevant": [
{ "$": "auto_text_key", "code": 691, "label": "ʳ" }
]
},
"s": {
"relevant": [
{ "$": "auto_text_key", "code": 223, "label": "ß" }
]
},
"u": {
"main": { "$": "auto_text_key", "code": 250, "label": "ú" },
"relevant": [
{ "$": "auto_text_key", "code": 7512, "label": "ᵘ" },
{ "$": "auto_text_key", "code": 363, "label": "ū" },
{ "$": "auto_text_key", "code": 249, "label": "ù" },
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "auto_text_key", "code": 251, "label": "û" }
]
},
"~right": {
"main": { "code": 58, "label": ":" },
"relevant": [
{ "code": 59, "label": ";" },
{ "code": 8230, "label": "…" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".es" },
{ "code": -255, "label": ".com.es" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -0,0 +1,153 @@
{
"all": {
"ঙ": {
"main": { "$": "auto_text_key", "code": 2434, "label": "ং" }
},
"য": {
"main": { "$": "auto_text_key", "code": 2527, "label": "য়" }
},
"ড": {
"main": { "$": "auto_text_key", "code": 2466, "label": "ঢ" }
},
"প": {
"main": { "$": "auto_text_key", "code": 2475, "label": "ফ" }
},
"ট": {
"main": { "$": "auto_text_key", "code": 2464, "label": "ঠ" }
},
"চ": {
"main": { "$": "auto_text_key", "code": 2459, "label": "ছ" }
},
"জ": {
"main": { "$": "auto_text_key", "code": 2461, "label": "ঝ" }
},
"হ": {
"main": { "$": "auto_text_key", "code": 2462, "label": "ঞ" }
},
"গ": {
"main": { "$": "auto_text_key", "code": 2456, "label": "ঘ" }
},
"ড়": {
"main": { "$": "auto_text_key", "code": 2525, "label": "ঢ়" }
},
"ৃ": {
"main": { "$": "auto_text_key", "code": 2443, "label": "ঋ" }
},
"ু": {
"main": { "$": "auto_text_key", "code": 2441, "label": "উ" }
},
"ি": {
"main": { "$": "auto_text_key", "code": 2439, "label": "ই" }
},
"া": {
"main": { "$": "auto_text_key", "code": 2438, "label": "আ" },
"relevant": [
{ "$": "auto_text_key", "code": 2437, "label": "অ" }
]
},
"্": {
"main": { "$": "auto_text_key", "code": 2433, "label": "ঁ" }
},
"ব": {
"main": { "$": "auto_text_key", "code": 2477, "label": "ভ" }
},
"ক": {
"main": { "$": "auto_text_key", "code": 2454, "label": "খ" }
},
"ত": {
"main": { "$": "auto_text_key", "code": 2469, "label": "থ" },
"relevant": [
{ "$": "auto_text_key", "code": 2510, "label": "ৎ" }
]
},
"দ": {
"main": { "$": "auto_text_key", "code": 2471, "label": "ধ" }
},
"ো": {
"main": { "$": "auto_text_key", "code": 2451, "label": "ও" }
},
"ে": {
"main": { "$": "auto_text_key", "code": 2447, "label": "এ" }
},
"র": {
"main": { "$": "auto_text_key", "code": 2482, "label": "ল" },
"relevant": [
{ "code": -255, "label": "র‌্য" }
]
},
"ন": {
"main": { "$": "auto_text_key", "code": 2467, "label": "ণ" }
},
"স": {
"main": { "$": "auto_text_key", "code": 2487, "label": "ষ" }
},
"ম": {
"main": { "$": "auto_text_key", "code": 2486, "label": "শ" }
},
"ূ": {
"main": { "$": "auto_text_key", "code": 2442, "label": "ঊ" }
},
"ী": {
"main": { "$": "auto_text_key", "code": 2440, "label": "ঈ" }
},
"ঁ": {
"main": { "$": "auto_text_key", "code": 2492, "label": "়" },
"relevant": [
{ "$": "auto_text_key", "code": 2500, "label": "ৄ" },
{ "$": "auto_text_key", "code": 2530, "label": "ৢ" },
{ "$": "auto_text_key", "code": 2531, "label": "ৣ" },
{ "$": "auto_text_key", "code": 2528, "label": "ৠ" },
{ "$": "auto_text_key", "code": 2444, "label": "ঌ" },
{ "$": "auto_text_key", "code": 2529, "label": "ৡ" },
{ "$": "auto_text_key", "code": 2544, "label": "ৰ" },
{ "$": "auto_text_key", "code": 2545, "label": "ৱ" },
{ "$": "auto_text_key", "code": 2493, "label": "ঽ" },
{ "$": "auto_text_key", "code": 2554, "label": "৺" },
{ "$": "auto_text_key", "code": 2519, "label": "ৗ" }
]
},
"ৌ": {
"main": { "$": "auto_text_key", "code": 2452, "label": "ঔ" }
},
"ৈ": {
"main": { "$": "auto_text_key", "code": 2448, "label": "ঐ" }
},
"~right": {
"main": { "code": 2404, "label": "।" },
"relevant": [
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#" },
{ "code": 8205, "label": ">⁞<" },
{ "code": 8204, "label": "<⁞>" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" },
{ "code": 2405, "label": "॥" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".com.bd" },
{ "code": -255, "label": ".bd" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -0,0 +1,117 @@
{
"all": {
"a": {
"relevant": [
{ "$": "auto_text_key", "code": 257, "label": "ā" },
{ "$": "auto_text_key", "code": 225, "label": "á" },
{ "$": "auto_text_key", "code": 462, "label": "ǎ" },
{ "$": "auto_text_key", "code": 224, "label": "à" },
{ "$": "auto_text_key", "code": 230, "label": "æ" },
{ "$": "auto_text_key", "code": 227, "label": "ã" },
{ "$": "auto_text_key", "code": 229, "label": "å" },
{ "$": "auto_text_key", "code": 226, "label": "â" },
{ "$": "auto_text_key", "code": 228, "label": "ä" }
]
},
"c": {
"relevant": [
{ "$": "auto_text_key", "code": 231, "label": "ç" }
]
},
"e": {
"relevant": [
{ "$": "auto_text_key", "code": 275, "label": "ē" },
{ "$": "auto_text_key", "code": 233, "label": "é" },
{ "$": "auto_text_key", "code": 283, "label": "ě" },
{ "$": "auto_text_key", "code": 232, "label": "è" },
{ "$": "auto_text_key", "code": 234, "label": "ê" },
{ "$": "auto_text_key", "code": 235, "label": "ë" }
]
},
"i": {
"relevant": [
{ "$": "auto_text_key", "code": 299, "label": "ī" },
{ "$": "auto_text_key", "code": 237, "label": "í" },
{ "$": "auto_text_key", "code": 464, "label": "ǐ" },
{ "$": "auto_text_key", "code": 236, "label": "ì" },
{ "$": "auto_text_key", "code": 239, "label": "ï" },
{ "$": "auto_text_key", "code": 238, "label": "î" }
]
},
"n": {
"relevant": [
{ "$": "auto_text_key", "code": 241, "label": "ñ" },
{ "$": "auto_text_key", "code": 324, "label": "ń" }
]
},
"o": {
"relevant": [
{ "$": "auto_text_key", "code": 333, "label": "ō" },
{ "$": "auto_text_key", "code": 243, "label": "ó" },
{ "$": "auto_text_key", "code": 466, "label": "ǒ" },
{ "$": "auto_text_key", "code": 242, "label": "ò" },
{ "$": "auto_text_key", "code": 245, "label": "õ" },
{ "$": "auto_text_key", "code": 339, "label": "œ" },
{ "$": "auto_text_key", "code": 248, "label": "ø" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 244, "label": "ô" }
]
},
"s": {
"relevant": [
{ "$": "auto_text_key", "code": 223, "label": "ß" }
]
},
"u": {
"relevant": [
{ "$": "auto_text_key", "code": 363, "label": "ū" },
{ "$": "auto_text_key", "code": 250, "label": "ú" },
{ "$": "auto_text_key", "code": 468, "label": "ǔ" },
{ "$": "auto_text_key", "code": 249, "label": "ù" },
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "auto_text_key", "code": 470, "label": "ǖ" },
{ "$": "auto_text_key", "code": 472, "label": "ǘ" },
{ "$": "auto_text_key", "code": 474, "label": "ǚ" },
{ "$": "auto_text_key", "code": 476, "label": "ǜ" },
{ "$": "auto_text_key", "code": 251, "label": "û" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -2,41 +2,74 @@
"all": {
"α": {
"relevant": [
{ "$": "auto_text_key", "code": 940, "label": "ά" }
{ "$": "case_selector",
"lower": { "code": 940, "label": "ά" },
"upper": { "code": 902, "label": "Ά" }
}
]
},
"ε": {
"relevant": [
{ "$": "auto_text_key", "code": 941, "label": "έ" }
{ "$": "case_selector",
"lower": { "code": 941, "label": "έ" },
"upper": { "code": 904, "label": "Έ" }
}
]
},
"η": {
"relevant": [
{ "$": "auto_text_key", "code": 942, "label": "ή" }
{ "$": "case_selector",
"lower": { "code": 942, "label": "ή" },
"upper": { "code": 905, "label": "Ή" }
}
]
},
"ι": {
"main": { "$": "auto_text_key", "code": 943, "label": "ί" },
"main": { "$": "case_selector",
"lower": { "code": 943, "label": "ί" },
"upper": { "code": 906, "label": "Ί" }
},
"relevant": [
{ "$": "auto_text_key", "code": 912, "label": "ΐ" },
{ "$": "auto_text_key", "code": 970, "label": "ϊ" }
{ "$": "case_selector",
"lower": { "code": 912, "label": "ΐ" },
"upper": { "$": "multi_text_key", "codePoints": [921, 776, 769], "label": "Ϊ́" }
},
{ "$": "case_selector",
"lower": { "code": 970, "label": "ϊ" },
"upper": { "code": 938, "label": "Ϊ" }
}
]
},
"ο": {
"relevant": [
{ "$": "auto_text_key", "code": 972, "label": "ό" }
{ "$": "case_selector",
"lower": { "code": 972, "label": "ό" },
"upper": { "code": 908, "label": "Ό" }
}
]
},
"υ": {
"main": { "$": "auto_text_key", "code": 973, "label": "ύ" },
"main": { "$": "case_selector",
"lower": { "code": 973, "label": "ύ" },
"upper": { "code": 910, "label": "Ύ" }
},
"relevant": [
{ "$": "auto_text_key", "code": 944, "label": "ΰ" },
{ "$": "auto_text_key", "code": 971, "label": "ϋ" }
{ "$": "case_selector",
"lower": { "code": 944, "label": "ΰ" },
"upper": { "$": "multi_text_key", "codePoints": [933, 776, 769], "label": "Ϋ́" }
},
{ "$": "case_selector",
"lower": { "code": 971, "label": "ϋ" },
"upper": { "code": 939, "label": "Ϋ" }
}
]
},
"ω": {
"relevant": [
{ "$": "auto_text_key", "code": 974, "label": "ώ" }
{ "$": "case_selector",
"lower": { "code": 974, "label": "ώ" },
"upper": { "code": 911, "label": "Ώ" }
}
]
},
"~right": {

View File

@@ -0,0 +1,120 @@
{
"all": {
"a": {
"relevant": [
{ "$": "auto_text_key", "code": 228, "label": "ä" },
{ "$": "auto_text_key", "code": 225, "label": "á" },
{ "$": "auto_text_key", "code": 226, "label": "â" },
{ "$": "auto_text_key", "code": 227, "label": "ã" },
{ "$": "auto_text_key", "code": 257, "label": "ā" },
{ "$": "auto_text_key", "code": 229, "label": "å" },
{ "$": "auto_text_key", "code": 230, "label": "æ" },
{ "$": "auto_text_key", "code": 224, "label": "à" }
]
},
"e": {
"relevant": [
{ "$": "auto_text_key", "code": 233, "label": "é" },
{ "$": "auto_text_key", "code": 275, "label": "ē" },
{ "$": "auto_text_key", "code": 281, "label": "ę" },
{ "$": "auto_text_key", "code": 279, "label": "ė" },
{ "$": "auto_text_key", "code": 232, "label": "è" },
{ "$": "auto_text_key", "code": 235, "label": "ë" },
{ "$": "auto_text_key", "code": 234, "label": "ê" }
]
},
"i": {
"relevant": [
{ "$": "auto_text_key", "code": 237, "label": "í" },
{ "$": "auto_text_key", "code": 299, "label": "ī" },
{ "$": "auto_text_key", "code": 236, "label": "ì" },
{ "$": "auto_text_key", "code": 303, "label": "į" },
{ "$": "auto_text_key", "code": 238, "label": "î" },
{ "$": "auto_text_key", "code": 239, "label": "ï" }
]
},
"o": {
"relevant": [
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 333, "label": "ō" },
{ "$": "auto_text_key", "code": 339, "label": "œ" },
{ "$": "auto_text_key", "code": 243, "label": "ó" },
{ "$": "auto_text_key", "code": 245, "label": "õ" },
{ "$": "auto_text_key", "code": 242, "label": "ò" },
{ "$": "auto_text_key", "code": 244, "label": "ô" },
{ "$": "auto_text_key", "code": 248, "label": "ø" }
]
},
"s": {
"relevant": [
{ "$": "auto_text_key", "code": 353, "label": "š" },
{ "$": "auto_text_key", "code": 223, "label": "ß" },
{ "$": "auto_text_key", "code": 347, "label": "ś" }
]
},
"u": {
"relevant": [
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "auto_text_key", "code": 363, "label": "ū" },
{ "$": "auto_text_key", "code": 251, "label": "û" },
{ "$": "auto_text_key", "code": 250, "label": "ú" },
{ "$": "auto_text_key", "code": 249, "label": "ù" }
]
},
"z": {
"relevant": [
{ "$": "auto_text_key", "code": 382, "label": "ž" },
{ "$": "auto_text_key", "code": 380, "label": "ż" },
{ "$": "auto_text_key", "code": 378, "label": "ź" }
]
},
"ä": {
"relevant": [
{ "$": "auto_text_key", "code": 230, "label": "æ" }
]
},
"ö": {
"relevant": [
{ "$": "auto_text_key", "code": 248, "label": "ø" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" },
{ "code": -255, "label": ".ee" }
]
}
}
}

View File

@@ -30,6 +30,7 @@
},
"ک": {
"relevant": [
{ "code": 1603, "label": "ك" },
{ "code": 1706, "label": "ڪ"}
]
},

View File

@@ -1,68 +1,62 @@
{
"all": {
"a": {
"relevant": [
{ "$": "auto_text_key", "code": 225, "label": "á" }
]
"main": { "$": "auto_text_key","code" : 225, "label": "á" }
},
"e": {
"relevant": [
{ "$": "auto_text_key", "code": 233, "label": "é" }
]
"main": {"$": "auto_text_key", "code" : 233, "label": "é" }
},
"i": {
"relevant": [
{ "$": "auto_text_key", "code": 237, "label": "í" }
]
"main": { "$": "auto_text_key" ,"code" : 237, "label": "í" }
},
"o": {
"main": { "$": "auto_text_key", "code" : 246, "label": "ö" },
"relevant": [
{ "$": "auto_text_key", "code": 243, "label": "ó" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 337, "label": "ő" }
{ "$": "auto_text_key", "code" : 243, "label": "ó" },
{ "$": "auto_text_key", "code" : 337, "label": "ő" }
]
},
"ö": {
"relevant": [
{ "$": "auto_text_key", "code": 337, "label": "ő" }
{ "$": "auto_text_key", "code" : 337, "label": "ő" }
]
},
"u": {
"main": { "$": "auto_text_key", "code" : 252, "label": "ü" },
"relevant": [
{ "$": "auto_text_key", "code": 250, "label": "ú" },
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "auto_text_key", "code": 369, "label": "ű" }
{ "$": "auto_text_key", "code" : 250, "label": "ú" },
{ "$": "auto_text_key", "code" : 369, "label": "ű" }
]
},
"ü": {
"relevant": [
{ "$": "auto_text_key", "code": 369, "label": "ű" }
{ "$": "auto_text_key", "code" : 369, "label": "ű" }
]
},
},
"~right": {
"main": { "code": 44, "label": "," },
"main": { "code" : 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code" : 37, "label": "%" },
{ "code" : 38, "label": "&" },
{ "code" : 43, "label": "+" },
{ "code" : 34, "label": "\"" },
{ "code" : 45, "label": "-" },
{ "code" : 58, "label": ":" },
{ "code" : 39, "label": "'" },
{ "code" : 64, "label": "@" },
{ "code" : 59, "label": ";" },
{ "code" : 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
"ltr": { "code" : 40, "label": "(" },
"rtl": { "code" : 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
"ltr": { "code" : 41, "label": ")" },
"rtl": { "code" : 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
{ "code" : 35, "label": "#" },
{ "code" : 33, "label": "!" },
{ "code" : 63, "label": "?" }
]
}
},
@@ -74,7 +68,7 @@
{ "code": -255, "label": ".net" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".eu" },
{ "code": -255, "label": ".gov.hu" }
{ "code": -255, "label": ".gov.hu" }
]
}
}

View File

@@ -0,0 +1,46 @@
{
"all": {
"ե": {
"main": { "$": "auto_text_key", "code": 1415, "label": "և" }
},
"յ": {
"main": { "$": "auto_text_key", "code": 1416, "label": "ֈ" }
},
"ա": {
"main": { "$": "auto_text_key", "code": 1376, "label": "ՠ" }
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 1417, "label": "։" },
{ "code": 1418, "label": "֊" },
{ "code": 1369, "label": "ՙ" },
{ "code": 1370, "label": "՚" },
{ "code": 1373, "label": "՝" },
{ "code": 1371, "label": "՛" },
{ "code": 1375, "label": "՟" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 46, "label": "." },
{ "code": 1372, "label": "՜" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" },
{ "code": 1374, "label": "՞" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".gr" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -0,0 +1,131 @@
{
"all": {
"w": {
"relevant": [
{ "$": "auto_text_key", "code": 695, "label": "ʷ" }
]
},
"e": {
"relevant": [
{ "$": "auto_text_key", "code": 234, "label": "ê" },
{ "$": "auto_text_key", "code": 578, "label": "ɂ" },
{ "$": "auto_text_key", "code": 233, "label": "é" },
{ "$": "auto_text_key", "code": 232, "label": "è" },
{ "$": "auto_text_key", "code": 235, "label": "ë" },
{ "$": "auto_text_key", "code": 477, "label": "ǝ" },
{ "$": "auto_text_key", "code": 603, "label": "ɛ" }
]
},
"r": {
"relevant":[
{ "$": "auto_text_key", "code": 7771, "label": "ṛ" }
]
},
"t": {
"relevant":[
{ "$": "auto_text_key", "code": 7789, "label": "ṭ" }
]
},
"y": {
"relevant":[
{ "$": "auto_text_key", "code": 255, "label": "ÿ" }
]
},
"u": {
"relevant":[
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 251, "label": "û" },
{ "$": "auto_text_key", "code": 249, "label": "ù" },
{ "$": "auto_text_key", "code": 252, "label": "ü" }
]
},
"i": {
"relevant":[
{ "$": "auto_text_key", "code": 239, "label": "ï" },
{ "$": "auto_text_key", "code": 238, "label": "î" }
]
},
"o": {
"relevant":[
{ "$": "auto_text_key", "code": 339, "label": "œ" },
{ "$": "auto_text_key", "code": 244, "label": "ô" }
]
},
"a": {
"relevant":[
{ "$": "auto_text_key", "code": 259, "label": "ă" },
{ "$": "auto_text_key", "code": 224, "label": "à" },
{ "$": "auto_text_key", "code": 226, "label": "â" },
{ "$": "auto_text_key", "code": 230, "label": "æ" }
]
},
"s": {
"relevant":[
{ "$": "auto_text_key", "code": 7779, "label": "ṣ" },
{ "$": "auto_text_key", "code": 353, "label": "š" }
]
},
"d": {
"relevant":[
{ "$": "auto_text_key", "code": 7693, "label": "ḍ" }
]
},
"g": {
"relevant":[
{ "$": "auto_text_key", "code": 487, "label": "ǧ" },
{ "$": "auto_text_key", "code": 611, "label": "ɣ" }
]
},
"h": {
"relevant":[
{ "$": "auto_text_key", "code": 7717, "label": "ḥ" }
]
},
"j": {
"relevant":[
{ "$": "auto_text_key", "code": 496, "label": "ǰ" }
]
},
"l": {
"relevant":[
{ "$": "auto_text_key", "code": 7735, "label": "ḷ" }
]
},
"z": {
"relevant":[
{ "$": "auto_text_key", "code": 7827, "label": "ẓ" },
{ "$": "auto_text_key", "code": 382, "label": "ž" }
]
},
"c": {
"relevant":[
{ "$": "auto_text_key", "code": 269, "label": "č" },
{ "$": "auto_text_key", "code": 231, "label": "ç" }
]
},
"b": {
"relevant":[
{ "$": "auto_text_key", "code": 7685, "label": "ḅ" },
{ "$": "auto_text_key", "code": 112, "label": "p" }
]
},
"n": {
"relevant":[
{ "$": "auto_text_key", "code": 331, "label": "ŋ" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".dz" },
{ "code": -255, "label": ".fr" },
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -43,8 +43,8 @@
},
"z": {
"relevant": [
{ "$": "auto_text_key", "code": 378, "label": "ź" },
{ "$": "auto_text_key", "code": 380, "label": "ż" }
{ "$": "auto_text_key", "code": 380, "label": "ż" },
{ "$": "auto_text_key", "code": 378, "label": "ź" }
]
},
"~right": {

View File

@@ -0,0 +1,56 @@
{
"all": {
"c": {
"relevant": [
{ "$": "auto_text_key", "code": 269, "label": "č" }
]
},
"s": {
"relevant": [
{ "$": "auto_text_key", "code": 353, "label": "š" }
]
},
"z": {
"relevant": [
{ "$": "auto_text_key", "code": 382, "label": "ž" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".eu" },
{ "code": -255, "label": ".si" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -1,5 +1,8 @@
{
"all": {
"a": {
"main": { "$": "auto_text_key", "code": 226, "label": "â" }
},
"c": {
"main": { "$": "auto_text_key", "code": 231, "label": "ç" }
},
@@ -10,13 +13,19 @@
"main": { "$": "case_selector",
"lower": { "code": 305, "label": "ı" },
"upper": { "code": 73, "label": "I" }
}
},
"relevant": [
{ "$": "auto_text_key", "code": 238, "label": "î" }
]
},
"ı": {
"main": { "$": "case_selector",
"lower": { "code": 105, "label": "i" },
"upper": { "code": 304, "label": "İ" }
}
},
"relevant": [
{ "$": "auto_text_key", "code": 238, "label": "î" }
]
},
"o": {
"main": { "$": "auto_text_key", "code": 246, "label": "ö" }
@@ -25,7 +34,10 @@
"main": { "$": "auto_text_key", "code": 351, "label": "ş" }
},
"u": {
"main": { "$": "auto_text_key", "code": 252, "label": "ü" }
"main": { "$": "auto_text_key", "code": 252, "label": "ü" },
"relevant": [
{ "$": "auto_text_key", "code": 251, "label": "û" }
]
},
"~right": {
"main": { "code": 44, "label": "," },

View File

@@ -0,0 +1,71 @@
{
"all": {
"о": {
"relevant": [
{ "$": "auto_text_key", "code": 1255, "label": "ӧ" }
]
},
"з": {
"relevant": [
{ "$": "auto_text_key", "code": 1247, "label": "ӟ" }
]
},
"ж": {
"relevant": [
{ "$": "auto_text_key", "code": 1245, "label": "ӝ" }
]
},
"ч": {
"relevant": [
{ "$": "auto_text_key", "code": 1269, "label": "ӵ" }
]
},
"и": {
"relevant": [
{ "$": "auto_text_key", "code": 1253, "label": "ӥ" }
]
},
"е": {
"relevant": [
{ "$": "auto_text_key", "code": 1105, "label": "ё" }
]
},
"ь": {
"relevant": [
{ "$": "auto_text_key", "code": 1098, "label": "ъ" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".ru" },
{ "code": -255, "label": ".udm.ru" }
]
}
}
}

View File

@@ -0,0 +1,32 @@
{
"$": "ime.extension.languagepack",
"meta": {
"id": "org.florisboard.hanshapebasedbasicpack",
"version": "0.0.0",
"title": "Default barebones Chinese shape-based pack",
"description": "默认中文形码语言包 / 預設中文形碼語言包 / Default barebones Chinese shape-based language pack which are always available.\n请访问下面的主页链接下载更多输入法 / 請訪問下面的主頁鏈接下載更多輸入法 / Please visit the homepage linked below to download more input methods.",
"maintainers": [ "patrickgold <patrick@patrickgold.dev>", "waelwindows", "moonbeamcelery" ],
"homepage": "https://github.com/florisboard/florisboard/blob/master/LANGUAGEPACKS-CHINESE.md#default-barebones-chinese-shape-based-pack",
"license": "apache-2.0"
},
"items": [
{
"id": "zh_CN_zhengma",
"label": "中文 (中国) [郑码] / Chinese (China) [ZHENGMA]",
"authors": [ "waelwindows", "moonbeamcelery" ],
"hanShapeBasedKeyCode": "abcdefghijklmnopqrstuvwxyz"
},
{
"id": "zh_TW_boshiamy",
"label": "中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]",
"authors": [ "waelwindows", "moonbeamcelery" ],
"hanShapeBasedKeyCode": ",.'abcdefghijklmnopqrstuvwxyz[]"
},
{
"id": "zh_TW_cangjielarge",
"label": "中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]",
"authors": [ "waelwindows", "moonbeamcelery" ],
"hanShapeBasedKeyCode": "abcdefghijklmnopqrstuvwxyz&"
}
]
}

View File

@@ -0,0 +1,23 @@
{
"$": "ime.extension.languagepack",
"meta": {
"id": "org.florisboard.languagepack",
"version": "0.0.0",
"title": "Default language pack",
"description": "Default language pack which are always available.",
"maintainers": [ "patrickgold <patrick@patrickgold.dev>" ],
"license": "apache-2.0"
},
"items": [
{
"id": "de_DE_neobone",
"label": "Deutsch (Deutschland) [NEOBONE] / German (Germany) [NEOBONE]",
"authors": [ "patrickgold" ]
},
{
"id": "ja_JP_jis",
"label": "日本語 (日本) [JIS] / Japanese (Japan) [JIS]",
"authors": [ "patrickgold" ]
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,6 @@
# Auto-generated by emojicon.py using CLDR v45
# DO NOT EDIT MANUALLY!
[smileys_emotion]
😀;;
😃;;
@@ -48,6 +51,9 @@
😬;;
😮‍💨;;
🤥;;
🫨;;
🙂‍↔️;;
🙂‍↕️;;
😌;;
😔;;
😪;;
@@ -125,7 +131,6 @@
🙈;;
🙉;;
🙊;;
💋;;
💌;;
💘;;
💝;;
@@ -140,14 +145,18 @@
❤️‍🔥;;
❤️‍🩹;;
❤️;;
🩷;;
🧡;;
💛;;
💚;;
💙;;
🩵;;
💜;;
🤎;;
🖤;;
🩶;;
🤍;;
💋;;
💯;;
💢;;
💥;;
@@ -155,7 +164,6 @@
💦;;
💨;;
🕳️;;
💣;;
💬;;
👁️‍🗨️;;
🗨️;;
@@ -218,6 +226,18 @@
🫴🏽;;
🫴🏾;;
🫴🏿;;
🫷;;
🫷🏻;;
🫷🏼;;
🫷🏽;;
🫷🏾;;
🫷🏿;;
🫸;;
🫸🏻;;
🫸🏼;;
🫸🏽;;
🫸🏾;;
🫸🏿;;
👌;;
👌🏻;;
👌🏼;;
@@ -1529,6 +1549,24 @@
🚶🏽‍♀️;;
🚶🏾‍♀️;;
🚶🏿‍♀️;;
🚶‍➡️;;
🚶🏻‍➡️;;
🚶🏼‍➡️;;
🚶🏽‍➡️;;
🚶🏾‍➡️;;
🚶🏿‍➡️;;
🚶‍♀️‍➡️;;
🚶🏻‍♀️‍➡️;;
🚶🏼‍♀️‍➡️;;
🚶🏽‍♀️‍➡️;;
🚶🏾‍♀️‍➡️;;
🚶🏿‍♀️‍➡️;;
🚶‍♂️‍➡️;;
🚶🏻‍♂️‍➡️;;
🚶🏼‍♂️‍➡️;;
🚶🏽‍♂️‍➡️;;
🚶🏾‍♂️‍➡️;;
🚶🏿‍♂️‍➡️;;
🧍;;
🧍🏻;;
🧍🏼;;
@@ -1565,60 +1603,132 @@
🧎🏽‍♀️;;
🧎🏾‍♀️;;
🧎🏿‍♀️;;
🧎‍➡️;;
🧎🏻‍➡️;;
🧎🏼‍➡️;;
🧎🏽‍➡️;;
🧎🏾‍➡️;;
🧎🏿‍➡️;;
🧎‍♀️‍➡️;;
🧎🏻‍♀️‍➡️;;
🧎🏼‍♀️‍➡️;;
🧎🏽‍♀️‍➡️;;
🧎🏾‍♀️‍➡️;;
🧎🏿‍♀️‍➡️;;
🧎‍♂️‍➡️;;
🧎🏻‍♂️‍➡️;;
🧎🏼‍♂️‍➡️;;
🧎🏽‍♂️‍➡️;;
🧎🏾‍♂️‍➡️;;
🧎🏿‍♂️‍➡️;;
🧑‍🦯;;
🧑🏻‍🦯;;
🧑🏼‍🦯;;
🧑🏽‍🦯;;
🧑🏾‍🦯;;
🧑🏿‍🦯;;
🧑‍🦯‍➡️;;
🧑🏻‍🦯‍➡️;;
🧑🏼‍🦯‍➡️;;
🧑🏽‍🦯‍➡️;;
🧑🏾‍🦯‍➡️;;
🧑🏿‍🦯‍➡️;;
👨‍🦯;;
👨🏻‍🦯;;
👨🏼‍🦯;;
👨🏽‍🦯;;
👨🏾‍🦯;;
👨🏿‍🦯;;
👨‍🦯‍➡️;;
👨🏻‍🦯‍➡️;;
👨🏼‍🦯‍➡️;;
👨🏽‍🦯‍➡️;;
👨🏾‍🦯‍➡️;;
👨🏿‍🦯‍➡️;;
👩‍🦯;;
👩🏻‍🦯;;
👩🏼‍🦯;;
👩🏽‍🦯;;
👩🏾‍🦯;;
👩🏿‍🦯;;
👩‍🦯‍➡️;;
👩🏻‍🦯‍➡️;;
👩🏼‍🦯‍➡️;;
👩🏽‍🦯‍➡️;;
👩🏾‍🦯‍➡️;;
👩🏿‍🦯‍➡️;;
🧑‍🦼;;
🧑🏻‍🦼;;
🧑🏼‍🦼;;
🧑🏽‍🦼;;
🧑🏾‍🦼;;
🧑🏿‍🦼;;
🧑‍🦼‍➡️;;
🧑🏻‍🦼‍➡️;;
🧑🏼‍🦼‍➡️;;
🧑🏽‍🦼‍➡️;;
🧑🏾‍🦼‍➡️;;
🧑🏿‍🦼‍➡️;;
👨‍🦼;;
👨🏻‍🦼;;
👨🏼‍🦼;;
👨🏽‍🦼;;
👨🏾‍🦼;;
👨🏿‍🦼;;
👨‍🦼‍➡️;;
👨🏻‍🦼‍➡️;;
👨🏼‍🦼‍➡️;;
👨🏽‍🦼‍➡️;;
👨🏾‍🦼‍➡️;;
👨🏿‍🦼‍➡️;;
👩‍🦼;;
👩🏻‍🦼;;
👩🏼‍🦼;;
👩🏽‍🦼;;
👩🏾‍🦼;;
👩🏿‍🦼;;
👩‍🦼‍➡️;;
👩🏻‍🦼‍➡️;;
👩🏼‍🦼‍➡️;;
👩🏽‍🦼‍➡️;;
👩🏾‍🦼‍➡️;;
👩🏿‍🦼‍➡️;;
🧑‍🦽;;
🧑🏻‍🦽;;
🧑🏼‍🦽;;
🧑🏽‍🦽;;
🧑🏾‍🦽;;
🧑🏿‍🦽;;
🧑‍🦽‍➡️;;
🧑🏻‍🦽‍➡️;;
🧑🏼‍🦽‍➡️;;
🧑🏽‍🦽‍➡️;;
🧑🏾‍🦽‍➡️;;
🧑🏿‍🦽‍➡️;;
👨‍🦽;;
👨🏻‍🦽;;
👨🏼‍🦽;;
👨🏽‍🦽;;
👨🏾‍🦽;;
👨🏿‍🦽;;
👨‍🦽‍➡️;;
👨🏻‍🦽‍➡️;;
👨🏼‍🦽‍➡️;;
👨🏽‍🦽‍➡️;;
👨🏾‍🦽‍➡️;;
👨🏿‍🦽‍➡️;;
👩‍🦽;;
👩🏻‍🦽;;
👩🏼‍🦽;;
👩🏽‍🦽;;
👩🏾‍🦽;;
👩🏿‍🦽;;
👩‍🦽‍➡️;;
👩🏻‍🦽‍➡️;;
👩🏼‍🦽‍➡️;;
👩🏽‍🦽‍➡️;;
👩🏾‍🦽‍➡️;;
👩🏿‍🦽‍➡️;;
🏃;;
🏃🏻;;
🏃🏼;;
@@ -1637,6 +1747,24 @@
🏃🏽‍♀️;;
🏃🏾‍♀️;;
🏃🏿‍♀️;;
🏃‍➡️;;
🏃🏻‍➡️;;
🏃🏼‍➡️;;
🏃🏽‍➡️;;
🏃🏾‍➡️;;
🏃🏿‍➡️;;
🏃‍♀️‍➡️;;
🏃🏻‍♀️‍➡️;;
🏃🏼‍♀️‍➡️;;
🏃🏽‍♀️‍➡️;;
🏃🏾‍♀️‍➡️;;
🏃🏿‍♀️‍➡️;;
🏃‍♂️‍➡️;;
🏃🏻‍♂️‍➡️;;
🏃🏼‍♂️‍➡️;;
🏃🏽‍♂️‍➡️;;
🏃🏾‍♂️‍➡️;;
🏃🏿‍♂️‍➡️;;
💃;;
💃🏻;;
💃🏼;;
@@ -2269,7 +2397,6 @@
👩🏿‍❤️‍👩🏽;;
👩🏿‍❤️‍👩🏾;;
👩🏿‍❤️‍👩🏿;;
👪;;
👨‍👩‍👦;;
👨‍👩‍👧;;
👨‍👩‍👧‍👦;;
@@ -2299,6 +2426,11 @@
👤;;
👥;;
🫂;;
👪;;
🧑‍🧑‍🧒;;
🧑‍🧑‍🧒‍🧒;;
🧑‍🧒;;
🧑‍🧒‍🧒;;
👣;;
[animals_nature]
@@ -2322,6 +2454,8 @@
🐅;;
🐆;;
🐴;;
🫎;;
🫏;;
🐎;;
🦄;;
🦓;;
@@ -2384,6 +2518,10 @@
🦩;;
🦚;;
🦜;;
🪽;;
🐦‍⬛;;
🪿;;
🐦‍🔥;;
🐸;;
🐊;;
🐢;;
@@ -2404,6 +2542,7 @@
🐙;;
🐚;;
🪸;;
🪼;;
🐌;;
🦋;;
🐛;;
@@ -2431,6 +2570,7 @@
🌻;;
🌼;;
🌷;;
🪻;;
🌱;;
🪴;;
🌲;;
@@ -2446,6 +2586,7 @@
🍃;;
🪹;;
🪺;;
🍄;;
[food_drink]
🍇;;
@@ -2453,6 +2594,7 @@
🍉;;
🍊;;
🍋;;
🍋‍🟩;;
🍌;;
🍍;;
🥭;;
@@ -2479,10 +2621,12 @@
🥦;;
🧄;;
🧅;;
🍄;;
🥜;;
🫘;;
🌰;;
🫚;;
🫛;;
🍄‍🟫;;
🍞;;
🥐;;
🥖;;
@@ -2859,11 +3003,10 @@
🎯;;
🪀;;
🪁;;
🔫;;
🎱;;
🔮;;
🪄;;
🧿;;
🪬;;
🎮;;
🕹️;;
🎰;;
@@ -2910,6 +3053,7 @@
🩳;;
👙;;
👚;;
🪭;;
👛;;
👜;;
👝;;
@@ -2924,6 +3068,7 @@
👡;;
🩰;;
👢;;
🪮;;
👑;;
👒;;
🎩;;
@@ -2962,6 +3107,8 @@
🪕;;
🥁;;
🪘;;
🪇;;
🪈;;
📱;;
📲;;
☎️;;
@@ -3081,7 +3228,7 @@
🛠️;;
🗡️;;
⚔️;;
🔫;;
💣;;
🪃;;
🏹;;
🛡️;;
@@ -3094,6 +3241,7 @@
⚖️;;
🦯;;
🔗;;
⛓️‍💥;;
⛓️;;
🪝;;
🧰;;
@@ -3142,6 +3290,8 @@
⚰️;;
🪦;;
⚱️;;
🧿;;
🪬;;
🗿;;
🪧;;
🪪;;
@@ -3206,6 +3356,7 @@
☮️;;
🕎;;
🔯;;
🪯;;
♈;;
♉;;
♊;;
@@ -3241,6 +3392,7 @@
🔅;;
🔆;;
📶;;
🛜;;
📳;;
📴;;
♀️;;

View File

@@ -64,36 +64,65 @@
"foreground": "var(--on-surface)"
},
"smartbar-primary-actions-toggle": {
"smartbar-shared-actions-toggle": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-secondary-actions-toggle": {
"smartbar-extended-actions-toggle": {
"background": "transparent",
"foreground": "var(--on-surface-variant)",
"shape": "circle()"
},
"smartbar-quick-action": {
"background": "transparent",
"foreground": "var(--on-background)",
"shape": "circle()"
},
"smartbar-key": {
"smartbar-action-key": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-key:pressed": {
"smartbar-action-key:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-key:disabled": {
"smartbar-action-key:disabled": {
"background": "transparent",
"foreground": "#12121248"
},
"smartbar-action-tile": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-action-tile:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-action-tile:disabled": {
"background": "transparent",
"foreground": "#12121248"
},
"smartbar-actions-overflow-customize-button": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "14sp",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-actions-editor": {
"background": "var(--background)",
"shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)"
},
"smartbar-actions-editor-header": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "16sp"
},
"smartbar-actions-editor-subheader": {
"foreground": "var(--on-background)",
"font-size": "16sp"
},
"smartbar-candidate-word": {
"background": "transparent",
"foreground": "var(--on-background)",
@@ -183,6 +212,10 @@
"foreground": "var(--primary)"
},
"incognito-mode-indicator": {
"foreground": "#00000011"
},
"one-handed-panel": {
"background": "#e8f5e9",
"foreground": "#424242"

View File

@@ -63,35 +63,65 @@
"foreground": "var(--on-surface)"
},
"smartbar-primary-actions-toggle": {
"smartbar-shared-actions-toggle": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"shape": "circle()"
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-secondary-actions-toggle": {
"smartbar-extended-actions-toggle": {
"background": "transparent",
"foreground": "var(--on-surface-variant)",
"shape": "circle()"
},
"smartbar-quick-action": {
"background": "transparent",
"foreground": "var(--on-background)",
"shape": "circle()"
},
"smartbar-key": {
"smartbar-action-key": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-key:pressed": {
"smartbar-action-key:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-key:disabled": {
"smartbar-action-key:disabled": {
"background": "transparent",
"foreground": "#12121248"
},
"smartbar-action-tile": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-action-tile:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-action-tile:disabled": {
"background": "transparent",
"foreground": "#12121248"
},
"smartbar-actions-overflow-customize-button": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "14sp",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-actions-editor": {
"background": "var(--background)",
"shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)"
},
"smartbar-actions-editor-header": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "16sp"
},
"smartbar-actions-editor-subheader": {
"foreground": "var(--on-background)",
"font-size": "16sp"
},
"smartbar-candidate-word": {
"background": "transparent",
"foreground": "var(--on-background)",
@@ -181,6 +211,10 @@
"foreground": "var(--primary)"
},
"incognito-mode-indicator": {
"foreground": "#00000011"
},
"one-handed-panel": {
"background": "#e8f5e9",
"foreground": "#424242"

View File

@@ -64,36 +64,65 @@
"foreground": "var(--on-surface)"
},
"smartbar-primary-actions-toggle": {
"smartbar-shared-actions-toggle": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-secondary-actions-toggle": {
"smartbar-extended-actions-toggle": {
"background": "transparent",
"foreground": "var(--on-surface-variant)",
"shape": "circle()"
},
"smartbar-quick-action": {
"background": "transparent",
"foreground": "var(--on-background)",
"shape": "circle()"
},
"smartbar-key": {
"smartbar-action-key": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-key:pressed": {
"smartbar-action-key:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-key:disabled": {
"smartbar-action-key:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-action-tile": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-action-tile:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-action-tile:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-actions-overflow-customize-button": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "14sp",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-actions-editor": {
"background": "var(--background)",
"shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)"
},
"smartbar-actions-editor-header": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "16sp"
},
"smartbar-actions-editor-subheader": {
"foreground": "var(--on-background)",
"font-size": "16sp"
},
"smartbar-candidate-word": {
"background": "transparent",
"foreground": "var(--on-background)",
@@ -183,6 +212,10 @@
"foreground": "var(--primary)"
},
"incognito-mode-indicator": {
"foreground": "#ffffff11"
},
"one-handed-panel": {
"background": "#1b5e20",
"foreground": "#eeeeee"

View File

@@ -63,35 +63,65 @@
"foreground": "var(--on-surface)"
},
"smartbar-primary-actions-toggle": {
"smartbar-shared-actions-toggle": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"shape": "circle()"
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-secondary-actions-toggle": {
"smartbar-extended-actions-toggle": {
"background": "transparent",
"foreground": "var(--on-surface-variant)",
"shape": "circle()"
},
"smartbar-quick-action": {
"background": "transparent",
"foreground": "var(--on-background)",
"shape": "circle()"
},
"smartbar-key": {
"smartbar-action-key": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-key:pressed": {
"smartbar-action-key:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-key:disabled": {
"smartbar-action-key:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-action-tile": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-action-tile:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-action-tile:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-actions-overflow-customize-button": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "14sp",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-actions-editor": {
"background": "var(--background)",
"shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)"
},
"smartbar-actions-editor-header": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "16sp"
},
"smartbar-actions-editor-subheader": {
"foreground": "var(--on-background)",
"font-size": "16sp"
},
"smartbar-candidate-word": {
"background": "transparent",
"foreground": "var(--on-background)",
@@ -181,6 +211,10 @@
"foreground": "var(--primary)"
},
"incognito-mode-indicator": {
"foreground": "#ffffff11"
},
"one-handed-panel": {
"background": "#1b5e20",
"foreground": "#eeeeee"

View File

@@ -64,36 +64,65 @@
"foreground": "var(--on-surface)"
},
"smartbar-primary-actions-toggle": {
"smartbar-shared-actions-toggle": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-secondary-actions-toggle": {
"smartbar-extended-actions-toggle": {
"background": "transparent",
"foreground": "var(--on-surface-variant)",
"shape": "circle()"
},
"smartbar-quick-action": {
"background": "transparent",
"foreground": "var(--on-background)",
"shape": "circle()"
},
"smartbar-key": {
"smartbar-action-key": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-key:pressed": {
"smartbar-action-key:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-key:disabled": {
"smartbar-action-key:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-action-tile": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-action-tile:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-action-tile:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-actions-overflow-customize-button": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "14sp",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-actions-editor": {
"background": "var(--background)",
"shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)"
},
"smartbar-actions-editor-header": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "16sp"
},
"smartbar-actions-editor-subheader": {
"foreground": "var(--on-background)",
"font-size": "16sp"
},
"smartbar-candidate-word": {
"background": "transparent",
"foreground": "var(--on-background)",
@@ -183,6 +212,10 @@
"foreground": "var(--primary-variant)"
},
"incognito-mode-indicator": {
"foreground": "#ffffff11"
},
"one-handed-panel": {
"background": "#000000",
"foreground": "#eeeeee"

View File

@@ -63,36 +63,65 @@
"foreground": "var(--on-surface)"
},
"smartbar-primary-actions-toggle": {
"smartbar-shared-actions-toggle": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-secondary-actions-toggle": {
"smartbar-extended-actions-toggle": {
"background": "transparent",
"foreground": "var(--on-surface-variant)",
"shape": "circle()"
},
"smartbar-quick-action": {
"background": "transparent",
"foreground": "var(--on-background)",
"shape": "circle()"
},
"smartbar-key": {
"smartbar-action-key": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-key:pressed": {
"smartbar-action-key:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-key:disabled": {
"smartbar-action-key:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-action-tile": {
"background": "transparent",
"foreground": "var(--on-background)",
"font-size": "18sp",
"shape": "var(--shape)"
},
"smartbar-action-tile:pressed": {
"background": "var(--surface)",
"foreground": "var(--on-surface)"
},
"smartbar-action-tile:disabled": {
"background": "transparent",
"foreground": "#dcdcdc48"
},
"smartbar-actions-overflow-customize-button": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "14sp",
"shape": "circle()",
"shadow-elevation": "2dp"
},
"smartbar-actions-editor": {
"background": "var(--background)",
"shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)"
},
"smartbar-actions-editor-header": {
"background": "var(--surface)",
"foreground": "var(--on-surface)",
"font-size": "16sp"
},
"smartbar-actions-editor-subheader": {
"foreground": "var(--on-background)",
"font-size": "16sp"
},
"smartbar-candidate-word": {
"background": "transparent",
"foreground": "var(--on-background)",
@@ -182,6 +211,10 @@
"foreground": "var(--primary-variant)"
},
"incognito-mode-indicator": {
"foreground": "#ffffff11"
},
"one-handed-panel": {
"background": "#000000",
"foreground": "#eeeeee"

View File

@@ -0,0 +1,14 @@
{
"uniqueId": "pictogrammers-material-icons",
"name": "Pictogrammers Material Icons",
"developers": [
{
"name": "Pictogrammers Icon Group",
"organisationUrl": "https://pictogrammers.com"
}
],
"website": "https://github.com/Templarian/MaterialDesign",
"licenses": [
"Apache-2.0"
]
}

View File

@@ -1,48 +0,0 @@
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
cmake_minimum_required(VERSION 3.10.2)
project("florisboard")
set(CMAKE_CXX_STANDARD 17)
include_directories(.)
### ICU4C ###
include_directories(../icu4c/prebuilt/include)
set(JNI_LIBS ${CMAKE_SOURCE_DIR}/../icu4c/prebuilt/jniLibs/${ANDROID_ABI})
add_library(ICU::data STATIC IMPORTED)
set_property(TARGET ICU::data PROPERTY IMPORTED_LOCATION "${JNI_LIBS}/libicudata.a")
add_library(ICU::uc STATIC IMPORTED)
set_property(TARGET ICU::uc PROPERTY IMPORTED_LOCATION "${JNI_LIBS}/libicuuc.a")
### FlorisBoard ###
add_subdirectory(nuspell)
add_subdirectory(utils)
add_subdirectory(ime/nlp)
add_subdirectory(ime/spelling)
add_library(
florisboard-native
SHARED
dev_patrickgold_florisboard_FlorisApplication.cpp
dev_patrickgold_florisboard_ime_nlp_SuggestionList.cpp
dev_patrickgold_florisboard_ime_spelling_SpellingDict.cpp
)
target_compile_options(florisboard-native PRIVATE -ffunction-sections -fdata-sections -fexceptions)
target_link_libraries(
# Destination
florisboard-native
# Sources
android
log
ICU::uc
ICU::data
Nuspell::nuspell
utils
ime-nlp
ime-spelling
)

View File

@@ -1,53 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <fstream>
#include <vector>
#include <jni.h>
#include <unicode/udata.h>
#include "utils/jni_utils.h"
#pragma ide diagnostic ignored "UnusedLocalVariable"
extern "C"
JNIEXPORT jint JNICALL
Java_dev_patrickgold_florisboard_FlorisApplication_00024Companion_nativeInitICUData(
JNIEnv *env,
jobject thiz,
jobject path) {
auto path_str = utils::j2std_string(env, path);
std::ifstream in_file(path_str, std::ios::in | std::ios::binary);
if (!in_file) {
return U_FILE_ACCESS_ERROR;
}
in_file.seekg(0, std::ios::end);
size_t size = in_file.tellg();
if (size <= 0) {
return U_FILE_ACCESS_ERROR;
}
in_file.seekg(0, std::ios::beg);
char *icu_data = new char[size + 1];
in_file.read(icu_data, size);
if (!in_file) {
in_file.close();
return U_FILE_ACCESS_ERROR;
}
icu_data[size] = 0;
in_file.close();
UErrorCode status = U_ZERO_ERROR;
udata_setCommonData(reinterpret_cast<void *>(icu_data), &status);
return status;
}

View File

@@ -1,123 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <jni.h>
#include "ime/nlp/suggestion_list.h"
#pragma ide diagnostic ignored "UnusedLocalVariable"
using namespace ime::nlp;
extern "C"
JNIEXPORT jlong JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeInitialize(
JNIEnv *env,
jobject thiz,
jint max_size) {
auto *suggestionList = new SuggestionList(max_size);
return reinterpret_cast<jlong>(suggestionList);
}
extern "C"
JNIEXPORT void JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeDispose(
JNIEnv *env,
jobject thiz,
jlong native_ptr) {
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
suggestionList->clear();
delete suggestionList;
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeAdd(
JNIEnv *env,
jobject thiz,
jlong native_ptr,
jstring word,
jint freq) {
const char *cWord = env->GetStringUTFChars(word, nullptr);
word_t stdWord = word_t(cWord);
env->ReleaseStringUTFChars(word, cWord);
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
return suggestionList->add(std::move(stdWord), freq);
}
extern "C"
JNIEXPORT void JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeClear(
JNIEnv *env,
jobject thiz,
jlong native_ptr) {
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
suggestionList->clear();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeContains(
JNIEnv *env,
jobject thiz,
jlong native_ptr,
jstring element) {
const char *cWord = env->GetStringUTFChars(element, nullptr);
const word_t stdWord = word_t(cWord);
env->ReleaseStringUTFChars(element, cWord);
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
return suggestionList->containsWord(stdWord);
}
extern "C"
JNIEXPORT jstring JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeGetOrNull(
JNIEnv *env,
jobject thiz,
jlong native_ptr,
jint index) {
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
auto weightedToken = suggestionList->get(index);
if (weightedToken == nullptr) {
return nullptr;
}
return env->NewStringUTF(weightedToken->data.c_str());
}
extern "C"
JNIEXPORT jint JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeSize(
JNIEnv *env,
jobject thiz,
jlong native_ptr) {
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
return suggestionList->size();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeGetIsPrimaryTokenAutoInsert(
JNIEnv *env, jobject thiz, jlong native_ptr) {
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
return suggestionList->isPrimaryTokenAutoInsert;
}
extern "C"
JNIEXPORT void JNICALL
Java_dev_patrickgold_florisboard_ime_nlp_SuggestionList_00024Companion_nativeSetIsPrimaryTokenAutoInsert(
JNIEnv *env, jobject thiz, jlong native_ptr, jboolean v) {
auto *suggestionList = reinterpret_cast<SuggestionList *>(native_ptr);
suggestionList->isPrimaryTokenAutoInsert = v;
}

View File

@@ -1,90 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <jni.h>
#include <algorithm>
#include "ime/spelling/spellingdict.h"
#include "utils/jni_utils.h"
#pragma ide diagnostic ignored "UnusedLocalVariable"
using namespace ime::spellcheck;
extern "C"
JNIEXPORT jlong JNICALL
Java_dev_patrickgold_florisboard_ime_spelling_SpellingDict_00024Companion_nativeInitialize(
JNIEnv *env,
jobject thiz,
jobject base_path) {
auto strBasePath = utils::j2std_string(env, base_path);
auto *spellingDict = SpellingDict::load(strBasePath);
if (spellingDict == nullptr) {
return 0L;
} else {
return reinterpret_cast<jlong>(spellingDict);
}
}
extern "C"
JNIEXPORT void JNICALL
Java_dev_patrickgold_florisboard_ime_spelling_SpellingDict_00024Companion_nativeDispose(
JNIEnv *env,
jobject thiz,
jlong native_ptr) {
auto spellingDict = reinterpret_cast<SpellingDict *>(native_ptr);
delete spellingDict;
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_dev_patrickgold_florisboard_ime_spelling_SpellingDict_00024Companion_nativeSpell(
JNIEnv *env,
jobject thiz,
jlong native_ptr,
jobject word) {
auto strWord = utils::j2std_string(env, word);
auto spellingDict = reinterpret_cast<SpellingDict *>(native_ptr);
auto result = spellingDict->spell(strWord);
return result;
}
extern "C"
JNIEXPORT jobjectArray JNICALL
Java_dev_patrickgold_florisboard_ime_spelling_SpellingDict_00024Companion_nativeSuggest(
JNIEnv *env,
jobject thiz,
jlong native_ptr,
jobject word,
jint limit) {
auto strWord = utils::j2std_string(env, word);
auto spellingDict = reinterpret_cast<SpellingDict *>(native_ptr);
auto result = spellingDict->suggest(strWord);
auto retSize = std::min(result.size(), (size_t)std::max(0, limit));
jclass jByteArrayClass = env->FindClass("java/nio/ByteBuffer");
jobjectArray jSuggestions = env->NewObjectArray(retSize, jByteArrayClass, nullptr);
for (int n = 0; n < retSize; n++) {
env->SetObjectArrayElement(jSuggestions, n, utils::std2j_string(env, result[n]));
}
return jSuggestions;
}

View File

@@ -1,13 +0,0 @@
add_library(
# Name
ime-nlp
# Headers
nlp.h
token.h
suggestion_list.h
# Sources
token.cpp
suggestion_list.cpp
)

View File

@@ -1,32 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLORISBOARD_NLP_H
#define FLORISBOARD_NLP_H
#include <string>
namespace ime::nlp {
typedef std::string word_t;
typedef uint16_t freq_t;
static const freq_t FREQ_VALUE_MASK = 0xFF;
static const freq_t FREQ_POSSIBLY_OFFENSIVE = 0x01;
} // namespace ime::nlp
#endif // FLORISBOARD_NLP_H

View File

@@ -1,98 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "suggestion_list.h"
#include <utility>
using namespace ime::nlp;
SuggestionList::SuggestionList(size_t _maxSize) :
maxSize(_maxSize), internalSize(0), tokens(_maxSize), isPrimaryTokenAutoInsert(false)
{ }
SuggestionList::~SuggestionList() = default;
bool SuggestionList::add(word_t &&word, freq_t &&freq) {
auto entryIndex = indexOfWord(word);
if (entryIndex.has_value()) {
// Word exists already
auto entry = tokens[entryIndex.value()];
if (entry.freq < freq) {
// Need to update freq
entry.freq = freq;
} else {
return false;
}
} else {
if (internalSize < maxSize) {
tokens[internalSize++] = WeightedToken(std::move(word), freq);
} else {
auto last = tokens[internalSize - 1];
if (last.freq < freq) {
tokens[internalSize - 1] = WeightedToken(std::move(word), freq);
} else {
return false;
}
}
}
std::sort(tokens.begin(), tokens.begin() + internalSize, std::greater<>());
return true;
}
void SuggestionList::clear() {
internalSize = 0;
isPrimaryTokenAutoInsert = false;
}
bool SuggestionList::contains(const WeightedToken &element) const {
return indexOf(element).has_value();
}
bool SuggestionList::containsWord(const word_t &word) const {
return indexOfWord(word).has_value();
}
const WeightedToken *SuggestionList::get(size_t index) const {
if (index < 0 || index >= internalSize) return nullptr;
return &tokens[index];
}
std::optional<size_t> SuggestionList::indexOf(const WeightedToken &element) const {
for (size_t n = 0; n < internalSize; n++) {
if (element == tokens[n]) {
return n;
}
}
return std::nullopt;
}
std::optional<size_t> SuggestionList::indexOfWord(const word_t &word) const {
for (size_t n = 0; n < internalSize; n++) {
if (word == tokens[n].data) {
return n;
}
}
return std::nullopt;
}
bool SuggestionList::isEmpty() const {
return internalSize == 0;
}
size_t SuggestionList::size() const {
return internalSize;
}

View File

@@ -1,51 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLORISBOARD_SUGGESTION_LIST_H
#define FLORISBOARD_SUGGESTION_LIST_H
#include <optional>
#include <vector>
#include "token.h"
namespace ime::nlp {
class SuggestionList {
public:
SuggestionList(size_t _maxSize);
~SuggestionList();
bool add(word_t &&word, freq_t &&freq);
void clear();
bool contains(const WeightedToken &element) const;
bool containsWord(const word_t &word) const;
const WeightedToken *get(size_t index) const;
std::optional<size_t> indexOf(const WeightedToken &element) const;
std::optional<size_t> indexOfWord(const word_t &word) const;
bool isEmpty() const;
size_t size() const;
bool isPrimaryTokenAutoInsert;
private:
std::vector<WeightedToken> tokens;
size_t internalSize;
size_t maxSize;
};
} // namespace ime::nlp
#endif // FLORISBOARD_SUGGESTION_LIST_H

View File

@@ -1,61 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "token.h"
#include <utility>
namespace ime::nlp {
Token::Token() : data() {}
Token::Token(word_t &&_data) : data(std::move(_data)) {}
bool operator==(const Token &t1, const Token &t2) {
return t1.data == t2.data;
}
bool operator!=(const Token &t1, const Token &t2) {
return !(t1 == t2);
}
WeightedToken::WeightedToken() : Token(), freq(0) {}
WeightedToken::WeightedToken(word_t &&_data, freq_t _freq) : Token(std::move(_data)), freq(_freq) {}
bool operator==(const WeightedToken &t1, const WeightedToken &t2) {
return t1.data == t2.data && t1.freq == t2.freq;
}
bool operator!=(const WeightedToken &t1, const WeightedToken &t2) {
return !(t1 == t2);
}
bool operator<(const WeightedToken &t1, const WeightedToken &t2) {
return t1.freq < t2.freq;
}
bool operator<=(const WeightedToken &t1, const WeightedToken &t2) {
return t1.freq <= t2.freq;
}
bool operator>(const WeightedToken &t1, const WeightedToken &t2) {
return t1.freq > t2.freq;
}
bool operator>=(const WeightedToken &t1, const WeightedToken &t2) {
return t1.freq >= t2.freq;
}
} // namespace ime::nlp

View File

@@ -1,51 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLORISBOARD_TOKEN_H
#define FLORISBOARD_TOKEN_H
#include "nlp.h"
#include <string>
namespace ime::nlp {
class Token {
public:
word_t data;
Token();
Token(word_t &&_data);
friend bool operator==(const Token &t1, const Token &t2);
friend bool operator!=(const Token &t1, const Token &t2);
};
class WeightedToken : public Token {
public:
freq_t freq;
WeightedToken();
WeightedToken(word_t &&_data, freq_t _freq);
friend bool operator==(const WeightedToken &t1, const WeightedToken &t2);
friend bool operator!=(const WeightedToken &t1, const WeightedToken &t2);
friend bool operator<(const WeightedToken &t1, const WeightedToken &t2);
friend bool operator<=(const WeightedToken &t1, const WeightedToken &t2);
friend bool operator>(const WeightedToken &t1, const WeightedToken &t2);
friend bool operator>=(const WeightedToken &t1, const WeightedToken &t2);
};
} // namespace ime::nlp
#endif // FLORISBOARD_TOKEN_H

View File

@@ -1,10 +0,0 @@
add_library(
# Name
ime-spelling
# Headers
spellingdict.h
# Sources
spellingdict.cpp
)

View File

@@ -1,51 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "spellingdict.h"
#include "utils/log.h"
using namespace ime::spellcheck;
SpellingDict::SpellingDict(const nuspell::Dictionary& dict) : dictionary(std::make_unique<nuspell::Dictionary>(dict))
{ }
SpellingDict::~SpellingDict() = default;
SpellingDict* SpellingDict::load(const std::string &basePath) {
utils::start_stdout_stderr_logger("spell-floris");
try {
auto temp = nuspell::Dictionary::load_from_path(basePath);
auto spellingDict = new SpellingDict(temp);
return spellingDict;
} catch (const nuspell::Dictionary_Loading_Error& e) {
utils::log_error("SpellingDict.load()", e.what());
return nullptr;
} catch (...) {
utils::log_error("SpellingDict.load()", "An unknown error occurred!");
return nullptr;
}
}
bool SpellingDict::spell(const std::string& word) {
bool result = dictionary->spell(word);
return result;
}
std::vector<std::string> SpellingDict::suggest(const std::string &word) {
auto result = std::vector<std::string>();
dictionary->suggest(word, result);
return result;
}

View File

@@ -1,42 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLORISBOARD_SPELLINGDICT_H
#define FLORISBOARD_SPELLINGDICT_H
#include "nuspell/dictionary.hxx"
#include <string>
#include <vector>
namespace ime::spellcheck {
class SpellingDict {
public:
SpellingDict(const nuspell::Dictionary& dict);
~SpellingDict();
static SpellingDict* load(const std::string& basePath);
bool spell(const std::string& word);
std::vector<std::string> suggest(const std::string& word);
private:
std::unique_ptr<nuspell::Dictionary> dictionary;
};
} // namespace ime::spellcheck
#endif // FLORISBOARD_SPELLINGDICT_H

View File

@@ -1,10 +0,0 @@
add_library(nuspell
aff_data.cxx aff_data.hxx
checker.cxx checker.hxx
suggester.cxx suggester.hxx
dictionary.cxx dictionary.hxx
unicode.hxx
utils.cxx utils.hxx
structures.hxx)
add_library(Nuspell::nuspell ALIAS nuspell)

Some files were not shown because too many files have changed in this diff Show More