StringInput better unicode handling

- Add unicode handling in flow components in
  AbstractTextComponent which allows StringInput
  to process unicode given from jline.
- This add basic non-english character support
  for input.
- Backport #1115
- Fixes #1116
This commit is contained in:
Janne Valkealahti
2024-08-13 14:26:32 +01:00
parent 7799a5e40e
commit 1dbb35a8a7
4 changed files with 30 additions and 4 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -94,6 +94,7 @@ public class StringInput extends AbstractTextComponent<String, StringInputContex
}
String input;
switch (operation) {
case OPERATION_UNICODE:
case OPERATION_CHAR:
String lastBinding = bindingReader.getLastBinding();
input = context.getInput();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -60,6 +60,7 @@ public abstract class AbstractComponent<T extends ComponentContext<T>> implement
public final static String OPERATION_EXIT = "EXIT";
public final static String OPERATION_BACKSPACE = "BACKSPACE";
public final static String OPERATION_CHAR = "CHAR";
public final static String OPERATION_UNICODE = "UNICODE";
public final static String OPERATION_SELECT = "SELECT";
public final static String OPERATION_DOWN = "DOWN";
public final static String OPERATION_UP = "UP";

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -62,6 +62,7 @@ public abstract class AbstractTextComponent<T, C extends TextComponentContext<T,
for (char i = 32; i < KeyMap.KEYMAP_LENGTH - 1; i++) {
keyMap.bind(OPERATION_CHAR, Character.toString(i));
}
keyMap.setUnicode(OPERATION_UNICODE);
}
@Override

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -166,6 +166,29 @@ public class StringInputTests extends AbstractShellTests {
assertThat(run1Context.getResultValue()).isEqualTo("test");
}
@Test
public void testResultUserInputUnicode() throws InterruptedException {
ComponentContext<?> empty = ComponentContext.empty();
StringInput component1 = new StringInput(getTerminal(), "component1", "component1ResultValue");
component1.setResourceLoader(new DefaultResourceLoader());
component1.setTemplateExecutor(getTemplateExecutor());
service.execute(() -> {
StringInputContext run1Context = component1.run(empty);
result1.set(run1Context);
latch1.countDown();
});
TestBuffer testBuffer = new TestBuffer().append("😂").cr();
write(testBuffer.getBytes());
latch1.await(2, TimeUnit.SECONDS);
StringInputContext run1Context = result1.get();
assertThat(run1Context).isNotNull();
assertThat(run1Context.getResultValue()).isEqualTo("😂");
}
@Test
public void testPassingViaContext() throws InterruptedException {
ComponentContext<?> empty = ComponentContext.empty();