Merged PR 90: feat:#594 全角/半角を変換する
指定したフィールドの文字列を全角/半角指定した書式に変換する Related work items: #594
This commit is contained in:
321
plugin/kintone-addins/src/actions/half-full-conversion.ts
Normal file
321
plugin/kintone-addins/src/actions/half-full-conversion.ts
Normal file
@@ -0,0 +1,321 @@
|
||||
import { actionAddins } from ".";
|
||||
import {
|
||||
IAction,
|
||||
IActionResult,
|
||||
IActionNode,
|
||||
IActionProperty,
|
||||
IField,
|
||||
IContext,
|
||||
IVarName,
|
||||
} from "../types/ActionTypes";
|
||||
import { ConditionTree } from "../types/Conditions";
|
||||
|
||||
/**
|
||||
* アクションの属性定義
|
||||
*/
|
||||
interface IConversionProps {
|
||||
field: IField;
|
||||
conversion: string;
|
||||
verName: IVarName;
|
||||
}
|
||||
|
||||
const fullWidthToHalfWidthMap: { [key: string]: string } = {
|
||||
ガ: "ガ",
|
||||
ギ: "ギ",
|
||||
グ: "グ",
|
||||
ゲ: "ゲ",
|
||||
ゴ: "ゴ",
|
||||
ザ: "ザ",
|
||||
ジ: "ジ",
|
||||
ズ: "ズ",
|
||||
ゼ: "ゼ",
|
||||
ゾ: "ゾ",
|
||||
ダ: "ダ",
|
||||
ヂ: "ヂ",
|
||||
ヅ: "ヅ",
|
||||
デ: "デ",
|
||||
ド: "ド",
|
||||
バ: "バ",
|
||||
ビ: "ビ",
|
||||
ブ: "ブ",
|
||||
ベ: "ベ",
|
||||
ボ: "ボ",
|
||||
パ: "パ",
|
||||
ピ: "ピ",
|
||||
プ: "プ",
|
||||
ペ: "ペ",
|
||||
ポ: "ポ",
|
||||
ヴ: "ヴ",
|
||||
ヷ: "ヷ",
|
||||
ヺ: "ヺ",
|
||||
ア: "ア",
|
||||
イ: "イ",
|
||||
ウ: "ウ",
|
||||
エ: "エ",
|
||||
オ: "オ",
|
||||
カ: "カ",
|
||||
キ: "キ",
|
||||
ク: "ク",
|
||||
ケ: "ケ",
|
||||
コ: "コ",
|
||||
サ: "サ",
|
||||
シ: "シ",
|
||||
ス: "ス",
|
||||
セ: "セ",
|
||||
ソ: "ソ",
|
||||
タ: "タ",
|
||||
チ: "チ",
|
||||
ツ: "ツ",
|
||||
テ: "テ",
|
||||
ト: "ト",
|
||||
ナ: "ナ",
|
||||
ニ: "ニ",
|
||||
ヌ: "ヌ",
|
||||
ネ: "ネ",
|
||||
ノ: "ノ",
|
||||
ハ: "ハ",
|
||||
ヒ: "ヒ",
|
||||
フ: "フ",
|
||||
ヘ: "ヘ",
|
||||
ホ: "ホ",
|
||||
マ: "マ",
|
||||
ミ: "ミ",
|
||||
ム: "ム",
|
||||
メ: "メ",
|
||||
モ: "モ",
|
||||
ヤ: "ヤ",
|
||||
ユ: "ユ",
|
||||
ヨ: "ヨ",
|
||||
ラ: "ラ",
|
||||
リ: "リ",
|
||||
ル: "ル",
|
||||
レ: "レ",
|
||||
ロ: "ロ",
|
||||
ワ: "ワ",
|
||||
ヲ: "ヲ",
|
||||
ン: "ン",
|
||||
ァ: "ァ",
|
||||
ィ: "ィ",
|
||||
ゥ: "ゥ",
|
||||
ェ: "ェ",
|
||||
ォ: "ォ",
|
||||
ッ: "ッ",
|
||||
ャ: "ャ",
|
||||
ュ: "ュ",
|
||||
ョ: "ョ",
|
||||
"。": "。",
|
||||
"、": "、",
|
||||
ー: "ー",
|
||||
"「": "「",
|
||||
"」": "」",
|
||||
"・": "・",
|
||||
" ": " ", // 全角スペースも半角スペースに変換
|
||||
};
|
||||
|
||||
const halfWidthToFullWidthMap: { [key: string]: string } = {
|
||||
ガ: "ガ",
|
||||
ギ: "ギ",
|
||||
グ: "グ",
|
||||
ゲ: "ゲ",
|
||||
ゴ: "ゴ",
|
||||
ザ: "ザ",
|
||||
ジ: "ジ",
|
||||
ズ: "ズ",
|
||||
ゼ: "ゼ",
|
||||
ゾ: "ゾ",
|
||||
ダ: "ダ",
|
||||
ヂ: "ヂ",
|
||||
ヅ: "ヅ",
|
||||
デ: "デ",
|
||||
ド: "ド",
|
||||
バ: "バ",
|
||||
ビ: "ビ",
|
||||
ブ: "ブ",
|
||||
ベ: "ベ",
|
||||
ボ: "ボ",
|
||||
パ: "パ",
|
||||
ピ: "ピ",
|
||||
プ: "プ",
|
||||
ペ: "ペ",
|
||||
ポ: "ポ",
|
||||
ヴ: "ヴ",
|
||||
ヷ: "ヷ",
|
||||
ヺ: "ヺ",
|
||||
ア: "ア",
|
||||
イ: "イ",
|
||||
ウ: "ウ",
|
||||
エ: "エ",
|
||||
オ: "オ",
|
||||
カ: "カ",
|
||||
キ: "キ",
|
||||
ク: "ク",
|
||||
ケ: "ケ",
|
||||
コ: "コ",
|
||||
サ: "サ",
|
||||
シ: "シ",
|
||||
ス: "ス",
|
||||
セ: "セ",
|
||||
ソ: "ソ",
|
||||
タ: "タ",
|
||||
チ: "チ",
|
||||
ツ: "ツ",
|
||||
テ: "テ",
|
||||
ト: "ト",
|
||||
ナ: "ナ",
|
||||
ニ: "ニ",
|
||||
ヌ: "ヌ",
|
||||
ネ: "ネ",
|
||||
ノ: "ノ",
|
||||
ハ: "ハ",
|
||||
ヒ: "ヒ",
|
||||
フ: "フ",
|
||||
ヘ: "ヘ",
|
||||
ホ: "ホ",
|
||||
マ: "マ",
|
||||
ミ: "ミ",
|
||||
ム: "ム",
|
||||
メ: "メ",
|
||||
モ: "モ",
|
||||
ヤ: "ヤ",
|
||||
ユ: "ユ",
|
||||
ヨ: "ヨ",
|
||||
ラ: "ラ",
|
||||
リ: "リ",
|
||||
ル: "ル",
|
||||
レ: "レ",
|
||||
ロ: "ロ",
|
||||
ワ: "ワ",
|
||||
ヲ: "ヲ",
|
||||
ン: "ン",
|
||||
ァ: "ァ",
|
||||
ィ: "ィ",
|
||||
ゥ: "ゥ",
|
||||
ェ: "ェ",
|
||||
ォ: "ォ",
|
||||
ッ: "ッ",
|
||||
ャ: "ャ",
|
||||
ュ: "ュ",
|
||||
ョ: "ョ",
|
||||
"。": "。",
|
||||
"、": "、",
|
||||
ー: "ー",
|
||||
"「": "「",
|
||||
"」": "」",
|
||||
"・": "・",
|
||||
" ": " ",
|
||||
};
|
||||
|
||||
/**
|
||||
* 全角/半角変換アクション
|
||||
*/
|
||||
export class FullHalfConversionAction implements IAction {
|
||||
name: string;
|
||||
actionProps: IActionProperty[];
|
||||
props: IConversionProps;
|
||||
constructor() {
|
||||
this.name = "全角/半角変換";
|
||||
this.actionProps = [];
|
||||
this.props = {
|
||||
field: { code: "" },
|
||||
conversion: "",
|
||||
verName: { name: "" },
|
||||
};
|
||||
this.register();
|
||||
}
|
||||
|
||||
/**
|
||||
* アクションの実行を呼び出す
|
||||
* @param actionNode
|
||||
* @param event
|
||||
* @returns
|
||||
*/
|
||||
async process(
|
||||
actionNode: IActionNode,
|
||||
event: any,
|
||||
context: IContext
|
||||
): Promise<IActionResult> {
|
||||
let result = {
|
||||
canNext: true,
|
||||
result: false,
|
||||
};
|
||||
try {
|
||||
//属性設定を取得する
|
||||
this.actionProps = actionNode.actionProps;
|
||||
if (
|
||||
!("field" in actionNode.ActionValue) &&
|
||||
!("conversion" in actionNode.ActionValue) &&
|
||||
!("verName" in actionNode.ActionValue)
|
||||
) {
|
||||
return result;
|
||||
}
|
||||
|
||||
this.props = actionNode.ActionValue as IConversionProps;
|
||||
|
||||
//条件式の計算結果を取得
|
||||
const record = event.record;
|
||||
if (!(this.props.field.code in record)) {
|
||||
throw new Error(
|
||||
`フィールド「${this.props.field.code}」が見つかりません。`
|
||||
);
|
||||
}
|
||||
//
|
||||
const value = record[this.props.field.code]?.value;
|
||||
|
||||
//条件分岐
|
||||
//未入力時は何も処理をせず終了
|
||||
if (value === undefined || value === "") {
|
||||
record[this.props.field.code].error = null;
|
||||
}
|
||||
if (this.props.conversion === "全角") {
|
||||
context.variables[this.props.verName.name] = this.toFullWidth(value);
|
||||
}
|
||||
if (this.props.conversion === "半角") {
|
||||
context.variables[this.props.verName.name] = this.toHalfWidth(value);
|
||||
} else {
|
||||
record[this.props.field.code].error = null;
|
||||
}
|
||||
//resultプロパティ指定
|
||||
result = {
|
||||
canNext: true,
|
||||
result: true,
|
||||
};
|
||||
return result;
|
||||
|
||||
//例外処理
|
||||
} catch (error) {
|
||||
context.errors.handleError(error, actionNode);
|
||||
result.canNext = false;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
// 半角から全角に変換
|
||||
toFullWidth(str: string): string {
|
||||
//半角の英数字と記号を検索し、半角から全角に変換(半角コードに 0xFEE0 を足して全角にする)
|
||||
let retStr = str.replace(/[A-Za-z0-9!-~]/g, function (s) {
|
||||
return String.fromCharCode(s.charCodeAt(0) + 0xfee0);
|
||||
//半角カタカナなどを検索し、全角に変換するためのマッピングオブジェクト(halfWidthToFullWidthMap)で全角文字に変換
|
||||
});
|
||||
retStr = retStr.replace(/[\uFF61-\uFF9F ]/g, function (s) {
|
||||
return halfWidthToFullWidthMap[s] || s;
|
||||
});
|
||||
return retStr;
|
||||
}
|
||||
|
||||
toHalfWidth(str: string): string {
|
||||
//全角の英数字や記号を検索し、全角から半角に変換します(全角コードから 0xFEE0 を引いて半角にする)
|
||||
let retStr = str.replace(/[!-~]/g, function (s) {
|
||||
return String.fromCharCode(s.charCodeAt(0) - 0xfee0);
|
||||
//全角片仮名記号スペースなどを検索し、半角に変換するためのマッピングオブジェクト( halfWidthToFullWidthMap )で半角文字に変換
|
||||
});
|
||||
retStr = retStr.replace(/[ガ-ヴァ-ン。、ー「」・ ]/g, function (s) {
|
||||
return fullWidthToHalfWidthMap[s] || s;
|
||||
});
|
||||
return retStr;
|
||||
}
|
||||
|
||||
register(): void {
|
||||
actionAddins[this.name] = this;
|
||||
}
|
||||
}
|
||||
new FullHalfConversionAction();
|
||||
@@ -18,6 +18,7 @@ import '../actions/value-getter';
|
||||
import '../actions/string-join';
|
||||
import '../actions/validation-fullwidth';
|
||||
import '../actions/validation-halfwidth';
|
||||
import '../actions/half-full-conversion';
|
||||
import '../actions/login-user-getter';
|
||||
import '../actions/auto-lookup';
|
||||
import '../actions/field-disable';
|
||||
|
||||
Reference in New Issue
Block a user