リッチテキストエディタコントロールを特徴づける入力制限の機能について解説します。
文字種の制限
リッチテキストエディタコントロールでは、入力可能な文字種をinputFormatプロパティで制限することができます。inputFormatプロパティに設定できるキーワードは、次の表のとおりです。また、ここで指定された以外の文字種が入力されると、onInvalidInputイベントが発生します。
全角
半角
説明
A
A
大文字のアルファベット(A~Z)
a
a
小文字のアルファベット(a~z)
K
K
カタカナ(促音・拗音の小書き表記あり)
N
N
カタカナ(促音・拗音の小書き表記なし)
9
9
数字(0~9)
#
#
数字および数字関連記号(0~9、+ - $ % \ , .)
@
@
記号
B
B
2進数(0または1)
X
X
16進数(0~9、A~F)
S
S
空白文字
J
-
ひらがな(促音・拗音の小書き表記あり)
G
-
ひらがな(促音・拗音の小書き表記なし)
Z
-
空白文字以外のすべての全角文字
T
-
サロゲートペア文字
I
-
JIS X 0208で構成された文字
M
-
Shift JISで構成された文字
V
-
IVS(Ideographic Variation Sequence)文字
D
-
空白文字以外の2バイト文字(サロゲートペア文字、IVS文字、空白文字を除いた全角文字)
-
H
空白文字以外のすべての半角文字
-
^
指定した書式に含まれないすべての文字
また、設定文字種のほか、リッチテキストエディタにスペースを入力したい場合はinputFormat:' A'のようにスペースと文字種を入れる必要があります。
以下に、入力可能な文字種を設定する具体例を示します。
次のコードは、半角大文字のアルファベット(A~Z)と2進数(0, 1)のみを許可します。
次のコードででは、半角大文字のアルファベットと数字(0~9)が入力可能になります。キーワード'X'で指定した16進数は、別のキーワードの'A'と'9'に含まれているので、無視されます。
次のコードでは、すべての半角文字の入力が許可されます。キーワード'AaK9'で指定した文字種は'H'に包含されているので、この部分は無視されます。
次に示す2つのコードでは、どちらもスペースを含むすべての文字種を許可するものです。デフォルトでは、最初の例のように設定されていますので、2つ目の例のようにキーワード'ZHSS'を指定しなくても同じ動作となります。
次に示す2つのコードは、すべての文字種の入力を拒否します。スペースの入力も許可されません。この例が示すように、キーワード'^'は、その後に記述されたキーワードの補集合を表します。
入力可能な文字種から特定の文字種を除外することもできます。次のコードはすべての全角文字からサロゲート文字だけを除外します。
また、コントロール初期化時のプロパティで文字種を設定するほか、コマンドを使用して設定できます。次のコードでは、コマンドを実行して文字種制限と自動変更を設定します。
文字列の自動変換
autoConvertプロパティをtrueに設定すると、inputFormatプロパティの設定内容に基づいて、変換可能な文字はすべて自動的に変換されます。たとえば、inputFormatプロパティで'A'キーワードが設定されていると、小文字を入力しても自動的に大文字に変換されます。また、全角文字だけが許可されている場合は、入力された半角文字は全角文字に変換されます。
コントロール内部で行われる自動変換の手順を以下に示します。
小文字から大文字、または大文字から小文字への変換を行います。
手順1の変換が行われない場合、全角から半角、または半角から全角への変換を行います。
手順2の変換が行われない場合、全角大文字から半角小文字、全角小文字から半角大文字、半角大文字から全角小文字、半角小文字から全角大文字のいずれかの変換を行います。
半角カタカナ、全角カタカナ、およびひらがなは、次のように変換されます。
半角カタカナは全角カタカナに変換。変換できない場合はひらがなに変換。
全角カタカナは半角カタカナに変換。変換できない場合はひらがなに変換。
ひらがなは全角カタカナに変換。変換できない場合は半角カタカナに変換。
inputFormatプロパティに'^V'(IVS文字を除外する)が設定された場合、IVS文字およびIVSの親となる漢字(親字)は次のように変換されます。
IVS文字は親字に変換されます。 辻󠄀→辻
親字はそのまま入力されます。 辻→辻
import "@mescius/inputman.richtexteditor/CSS/gc.inputman.richtexteditor.css";
import "@mescius/inputman/CSS/gc.inputman-js.css";
import { InputMan } from "@mescius/inputman.richtexteditor";
import * as GcCommon from "@mescius/inputman";
import "./styles.css";
GC.InputMan.appearanceStyle = InputMan.AppearanceStyle.Modern;
const gcRichTextEditor = new InputMan.GcRichTextEditor(
document.getElementById("gcRichTextEditor"),
{
baseUrl:
'$IMDEMOROOT$/lib/purejs/node_modules/@mescius/inputman.richtexteditor/JS',
plugins: ["all"],
autoConvert: true,
}
);
const format = new GcCommon.InputMan.GcComboBox(
document.getElementById("format"),
{
items: [
{ value: "A", desc: "全角大文字のアルファベット" },
{ value: "A", desc: "半角大文字のアルファベット" },
{ value: "a", desc: "全角小文字のアルファベット" },
{ value: "a", desc: "半角小文字のアルファベット" },
{ value: "K", desc: "全角カタカナ(促音・拗音の小書き表記あり)" },
{ value: "K", desc: "半角カタカナ(促音・拗音の小書き表記あり)" },
{ value: "N", desc: "全角カタカナ(促音・拗音の小書き表記なし)" },
{ value: "N", desc: "半角カタカナ(促音・拗音の小書き表記なし)" },
{ value: "9", desc: "全角数字" },
{ value: "9", desc: "半角数字" },
{ value: "#", desc: "全角数字および数字関連記号" },
{ value: "#", desc: "半角数字および数字関連記号" },
{ value: "@", desc: "全角記号" },
{ value: "@", desc: "半角記号" },
{ value: "B", desc: "全角2進数" },
{ value: "B", desc: "半角2進数" },
{ value: "X", desc: "全角16進数" },
{ value: "X", desc: "半角16進数" },
{ value: "S", desc: "全角空白文字" },
{ value: "S", desc: "半角空白文字" },
{ value: "J", desc: "ひらがな(促音・拗音の小書き表記あり)" },
{ value: "G", desc: "ひらがな(促音・拗音の小書き表記なし)" },
{ value: "Z", desc: "空白文字以外のすべての全角文字" },
{ value: "^T", desc: "サロゲートペア文字以外" },
{ value: "I", desc: "JIS X 0208で構成された文字" },
{ value: "M", desc: "Shift JISで構成された文字" },
{ value: "^V", desc: "IVS文字以外" },
{ value: "D", desc: "空白文字以外の2バイト文字" },
{ value: "H", desc: "空白文字以外のすべての半角文字" },
],
columns: [
{ name: "value", label: "値", width: 50 },
{ name: "desc", label: "説明", width: 300 },
],
displayMemberPath: "value",
valueMemberPath: "value",
dropDownWidth: "auto",
isMultiSelect: true,
}
);
format.addEventListener(
GcCommon.InputMan.GcComboBoxEvent.CheckedChanged,
(control, args) => {
const selectedFormat = format.getCheckedValues().join("");
gcRichTextEditor.inputFormat = selectedFormat;
}
);
document.getElementById("setAutoConvert").addEventListener("click", (e) => {
gcRichTextEditor.autoConvert = e.target.checked;
});
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>リッチテキストエディタコントロール - 文字種の制限</title>
<!-- SystemJS -->
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="systemjs.config.js"></script>
<script>
window.onload = function() {
System.import('./src/app');
}
</script>
</head>
<body>
<textarea id="gcRichTextEditor"></textarea>
<table class="sample">
<tr>
<th>文字種の設定</th>
<td>
<select id="format"></select>
</td>
</tr>
<tr>
<th>自動変換</th>
<td>
<label><input type="checkbox" id="setAutoConvert" checked>指定した文字にあわせて自動的に変換する</label>
</td>
</tr>
</table>
</body>
</html>
body {
padding-bottom: 10rem;
}
System.config({
transpiler: 'plugin-babel',
babelOptions: {
es2015: true
},
meta: {
'*.css': { loader: 'css' }
},
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
// map tells the System loader where to look for things
map: {
'@mescius/inputman': 'npm:@mescius/inputman/index.js',
'@mescius/inputman/CSS': 'npm:@mescius/inputman/CSS',
'@mescius/inputman.richtexteditor': 'npm:@mescius/inputman.richtexteditor/index.js',
'@mescius/inputman.richtexteditor/CSS': 'npm:@mescius/inputman.richtexteditor/CSS',
'css': 'npm:systemjs-plugin-css/css.js',
'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js',
'systemjs-babel-build': 'npm:systemjs-plugin-babel/systemjs-babel-browser.js'
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
src: {
defaultExtension: 'js'
},
"node_modules": {
defaultExtension: 'js'
},
}
});