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:
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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;
|
String input;
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
|
case OPERATION_UNICODE:
|
||||||
case OPERATION_CHAR:
|
case OPERATION_CHAR:
|
||||||
String lastBinding = bindingReader.getLastBinding();
|
String lastBinding = bindingReader.getLastBinding();
|
||||||
input = context.getInput();
|
input = context.getInput();
|
||||||
|
|||||||
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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_EXIT = "EXIT";
|
||||||
public final static String OPERATION_BACKSPACE = "BACKSPACE";
|
public final static String OPERATION_BACKSPACE = "BACKSPACE";
|
||||||
public final static String OPERATION_CHAR = "CHAR";
|
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_SELECT = "SELECT";
|
||||||
public final static String OPERATION_DOWN = "DOWN";
|
public final static String OPERATION_DOWN = "DOWN";
|
||||||
public final static String OPERATION_UP = "UP";
|
public final static String OPERATION_UP = "UP";
|
||||||
|
|||||||
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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++) {
|
for (char i = 32; i < KeyMap.KEYMAP_LENGTH - 1; i++) {
|
||||||
keyMap.bind(OPERATION_CHAR, Character.toString(i));
|
keyMap.bind(OPERATION_CHAR, Character.toString(i));
|
||||||
}
|
}
|
||||||
|
keyMap.setUnicode(OPERATION_UNICODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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");
|
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
|
@Test
|
||||||
public void testPassingViaContext() throws InterruptedException {
|
public void testPassingViaContext() throws InterruptedException {
|
||||||
ComponentContext<?> empty = ComponentContext.empty();
|
ComponentContext<?> empty = ComponentContext.empty();
|
||||||
|
|||||||
Reference in New Issue
Block a user