diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ef19713..3ad2bf9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -88,6 +88,9 @@ An entry must be added to the layout option in `res/values/arrays.xml`, to both The layout must also be referenced in `srcs/juloo.keyboard2/Config.java` in `layout_of_string`. +Run `make check_layouts` to check some properties about your layout. This will +change the file `check_layout.output`, which you should commit. + #### Adding a programming layout A programming layout must contains every ASCII characters. @@ -135,10 +138,12 @@ The app can be translated by writing `res/values-/strings.xml` (for example `values-fr`, `values-lv`), based on the default: `res/values/strings.xml` (English). +To check that `strings.xml` is formatted correctly, run +`python sync_translations.py`. This will modify your files. + The store description is found in `metadata/android//`, `short_description.txt` and `full_description.txt`. -Translating changelogs is not useful. Changelogs are written quickly just -before a release and older ones are never shown to anyone currently. +Translating changelogs is not useful. The app name might be partially translated, the "unexpected" word should remain untranslated. diff --git a/Makefile b/Makefile index a731a0b..2653bb6 100644 --- a/Makefile +++ b/Makefile @@ -22,10 +22,19 @@ clean: rm -rf _build/*.dex _build/class _build/gen _build/*.apk _build/*.unsigned-apk \ _build/*.idsig _build/assets -rebuild_special_font: - cd srcs/special_font && fontforge -lang=ff -script build.pe *.svg +rebuild_special_font: _build/special_font.ttf + cp "$<" srcs/special_font/result.ttf -.PHONY: release debug installd clean rebuild_special_font +sync_translations: + python sync_translations.py + +check_layouts: + python check_layout.py $(wildcard res/xml/*.xml) > check_layout.output + +# Will modify the source tree. +runtest: rebuild_special_font sync_translations check_layouts + +.PHONY: release debug installd clean rebuild_special_font check_layouts sync_translations runtest $(shell mkdir -p _build) @@ -117,3 +126,10 @@ _build/classes.dex: $(JAVA_FILES) $(R_FILE) -sourcepath $(SRC_DIR):$(GEN_DIR) \ $^ $(ANDROID_BUILD_TOOLS)/d8 --output $(@D) $(OBJ_DIR)/*/*/* $(subst :, ,$(EXTRA_JARS)) + +# Font file + +FONT_GLYPHS = $(wildcard srcs/special_font/*.svg) + +_build/special_font.ttf: srcs/special_font/build.pe $(FONT_GLYPHS) + fontforge -lang=ff -script $< "$@" $(FONT_GLYPHS) diff --git a/check_layout.output b/check_layout.output new file mode 100644 index 0000000..361ce7c --- /dev/null +++ b/check_layout.output @@ -0,0 +1,100 @@ +# res/xml/ar_alt.xml +Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~ +1 warnings +# res/xml/ar_pc.xml +Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, | +1 warnings +# res/xml/azerty.xml +0 warnings +# res/xml/bangla.xml +Layout includes some ASCII punctuation but not all, missing: $ +1 warnings +# res/xml/bone.xml +Layout includes some ASCII punctuation but not all, missing: $ +1 warnings +Not a layout file: res/xml/bottom_row.xml +# res/xml/colemak.xml +0 warnings +# res/xml/devanagari_1.xml +Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, | +1 warnings +# res/xml/devanagari_2.xml +Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), *, +, ., /, :, <, =, >, @, [, \, ], ^, _, `, {, |, }, ~ +1 warnings +# res/xml/dvorak.xml +0 warnings +# res/xml/greekmath.xml +Layout includes some ASCII punctuation but not all, missing: !, ", #, $, %, &, ', (, ), *, +, ,, -, /, :, ;, <, >, ?, @, [, \, ], _, `, {, |, }, ~ +Layout redefines the bottom row but some important keys are missing, missing: change_method, config, ctrl, switch_emoji, switch_second +2 warnings +# res/xml/he_il_1452_1.xml +Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, } +1 warnings +# res/xml/he_il_1452_2.xml +Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, } +1 warnings +# res/xml/jcuken_ua.xml +0 warnings +# res/xml/local_bgph1.xml +Layout includes some ASCII punctuation but not all, missing: ~ +1 warnings +# res/xml/local_ru_jcuken.xml +0 warnings +Not a layout file: res/xml/method.xml +# res/xml/neo2.xml +0 warnings +Not a layout file: res/xml/number_row.xml +# res/xml/numeric.xml +Layout includes some ASCII punctuation but not all, missing: &, ?, @, ` +Layout redefines the bottom row but some important keys are missing, missing: change_method, config, switch_emoji, switch_numeric, switch_second +2 warnings +# res/xml/numpad.xml +Layout includes some ASCII punctuation but not all, missing: !, ", #, $, %, &, ', (, ), ,, :, ;, <, >, ?, @, [, \, ], ^, _, `, {, |, }, ~ +Layout doesn't define some important keys, missing: backspace, delete +Layout redefines the bottom row but some important keys are missing, missing: action, change_method, config, ctrl, down, enter, fn, left, right, space, switch_emoji, switch_numeric, switch_second, up +3 warnings +# res/xml/persian.xml +Layout includes some ASCII punctuation but not all, missing: ", $, %, ', *, ,, /, ;, <, =, >, ?, [, \, ], ^, _, `, {, |, }, ~ +1 warnings +# res/xml/pin.xml +Layout includes some ASCII punctuation but not all, missing: !, ", $, %, &, ', ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, ~ +Layout redefines the bottom row but some important keys are missing, missing: change_method, config, ctrl, fn, switch_emoji, switch_second +2 warnings +# res/xml/qwerty_el.xml +0 warnings +# res/xml/qwerty_es.xml +0 warnings +# res/xml/qwerty_hu.xml +0 warnings +# res/xml/qwerty_ko.xml +0 warnings +# res/xml/qwerty_lv.xml +0 warnings +# res/xml/qwerty_no.xml +0 warnings +# res/xml/qwerty_pl.xml +0 warnings +# res/xml/qwerty_pt.xml +0 warnings +# res/xml/qwerty_sv_se.xml +0 warnings +# res/xml/qwerty_tr.xml +0 warnings +# res/xml/qwerty_vi.xml +Layout includes some ASCII punctuation but not all, missing: \ +1 warnings +# res/xml/qwerty.xml +0 warnings +# res/xml/qwertz_cs.xml +Layout includes some ASCII punctuation but not all, missing: ` +1 warnings +# res/xml/qwertz_de.xml +0 warnings +# res/xml/qwertz_hu.xml +0 warnings +# res/xml/qwertz_sk.xml +Layout includes some ASCII punctuation but not all, missing: \, ` +1 warnings +# res/xml/qwertz.xml +0 warnings +Not a layout file: res/xml/settings.xml diff --git a/check_layout.py b/check_layout.py new file mode 100644 index 0000000..c38705e --- /dev/null +++ b/check_layout.py @@ -0,0 +1,72 @@ +import xml.etree.ElementTree as ET +import sys + +warning_count = 0 + +def warn(msg): + global warning_count + print(msg) + warning_count += 1 + +def key_list_str(keys): + return ", ".join(sorted(list(keys))) + +def missing_some_of(keys, symbols, class_name=None): + if class_name is None: + class_name = "of [" + ", ".join(symbols) + "]" + missing = set(symbols).difference(keys) + if len(missing) > 0 and len(missing) != len(symbols): + warn("Layout includes some %s but not all, missing: %s" % ( + class_name, key_list_str(missing))) + +def missing_required(keys, symbols, msg): + missing = set(symbols).difference(keys) + if len(missing) > 0: + warn("%s, missing: %s" % (msg, key_list_str(missing))) + +def unexpected_keys(keys, symbols, msg): + unexpected = set(symbols).intersection(keys) + if len(unexpected) > 0: + warn("%s, unexpected: %s" % (msg, key_list_str(unexpected))) + +def parse_layout(fname): + keys = set() + root = ET.parse(fname).getroot() + if root.tag != "keyboard": + return None + for row in root: + for key in row: + for attr in key.keys(): + keys.add(key.get(attr).removeprefix("\\")) + return root, keys + +def check_layout(layout): + root, keys = layout + missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation") + missing_some_of(keys, "0123456789", "digits") + missing_some_of(keys, ["f11_placeholder", "f12_placeholder"]) + missing_some_of(keys, ["esc", "tab"]) + missing_required(keys, ["backspace", "delete"], "Layout doesn't define some important keys") + + bottom_row_keys = [ + "ctrl", "fn", "switch_numeric", "change_method", "switch_emoji", + "config", "switch_second", "enter", "action", "left", "up", "right", + "down", "space" + ] + + if root.get("bottom_row") == "false": + missing_required(keys, bottom_row_keys, + "Layout redefines the bottom row but some important keys are missing") + else: + unexpected_keys(keys, bottom_row_keys, + "Layout contains keys present in the bottom row") + +for fname in sys.argv[1:]: + layout = parse_layout(fname) + if layout == None: + print("Not a layout file: %s" % fname) + else: + print("# %s" % fname) + warning_count = 0 + check_layout(layout) + print("%d warnings" % warning_count) diff --git a/srcs/special_font/build.pe b/srcs/special_font/build.pe index 962917f..bf13f23 100644 --- a/srcs/special_font/build.pe +++ b/srcs/special_font/build.pe @@ -2,8 +2,8 @@ # files, one for each glyph. New() -# Imports glyphs, file name is position in the font. -i = 1 +# Imports glyphs, first argument is file name for the generated font +i = 2 while (i < $argc) Select(Strtol($argv[i]:t:r, 16)) Import($argv[i], 0, 0, 4.0, 0.1) @@ -11,4 +11,4 @@ while (i < $argc) i++ endloop -Generate("result.ttf") +Generate($argv[1])