Skip to content

Instantly share code, notes, and snippets.

@uyjulian
Created April 30, 2023 22:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uyjulian/07b6cb063b3e4f3c2b2b9d8f6909430b to your computer and use it in GitHub Desktop.
Save uyjulian/07b6cb063b3e4f3c2b2b9d8f6909430b to your computer and use it in GitHub Desktop.
function parseKeyFrame_old(keyframe)
{
if(keyframe[0] != "(")
throw new Exception("キーフレームが解析できません。: "+keyframe);
keyframe = keyframe.substr(1);
var keys = [];
var pos = keyframe.indexOf(")(");
while(pos >= 0)
{
keys.add(keyframe.substr(0, pos));
keyframe = keyframe.substr(pos+2);
pos = keyframe.indexOf(")(");
}
if(keyframe[keyframe.length - 1] != ")")
throw new Exception("キーフレームの最後が不正です: "+keyframe);
keys.add(keyframe.substr(0, keyframe.length - 1));
for (var i = 0, internal_forloop_count = keys.count; i < internal_forloop_count; i += 1)
{
var key = keys[i], j = 0;
var array = keys[i] = [];
while(1)
{
var pos_c = key.indexOf(",");
var pos_b = key.indexOf("(");
if(pos_c < 0)
{
array[j] += key;
break;
}
else if(pos_b < 0 || pos_c < pos_b)
{
array[j]+= key.substr(0, pos_c);
key = key.substr(pos_c + 1);
j++;
}
else
{
pos_b = key.indexOf(")");
array[j]+= key.substr(0, pos_b+1);
key = key.substr(pos_b + 1);
}
}
keys[i][0] = +keys[i][0];
}
return keys;
}
global.parseKeyFrame_regex = /\(((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*)\)/g;
function parseKeyFrame(keyframe)
{
// 解析する必要がなければ、そのまま返す
if (typeof(keyframe) === "Object" && keyframe instanceof "Array")
{
return keyframe;
}
var split_func = function(matcharr)
{
var split = matcharr[1].split(",");
split[0] = +split[0];
this.add(split);
return "";
};
var keys = [];
keyframe.replace(global.parseKeyFrame_regex, (split_func incontextof keys));
return keys;
}
global.isNumber_regex = /^-?[0-9]\d*(\.\d+)?$/g;
function isNumber(v)
{
if (typeof(v) !== "String")
{
return true;
}
return global.isNumber_regex.match(v).count !== 0;
}
global.split_kagtag_regex = /(?:(?:(?<=^)|(?<=\n))@([^ ]*)(.*)(?=$|\n)|(\[([^ \]]*)(.*)\]))/g;
global.split_kagtag_arguments_regex = /(?: *(?:([^ =]*)(?:(=)(?:(?:"([^ ="]*)")|(?:'([^ =']*)')|([^ =]*)))?) *)/g;
function split_kagtag(v)
{
var split_func = function(matcharr)
{
var res = matcharr[3] + matcharr[4] + matcharr[5];
if (matcharr[2] !== "=")
{
res = "true";
}
this[matcharr[1]] = res;
return "";
};
var keys = %[];
global.split_kagtag_regex.match(v)[2].replace(global.split_kagtag_arguments_regex, (split_func incontextof keys));
return keys;
}
function split_string(s)
{
var split_func = function(matcharr)
{
this.add(matcharr[0]);
};
var arr = [];
s.replace(/(?s)./g, (split_func incontextof arr));
return arr;
}
// Equivalent to JS Array.prototype.slice
function slice_array(in_arr, begin, end)
{
var arr = [];
for (var i = begin; i < end; i += 1)
{
arr.add(in_arr[i]);
}
return arr;
}
function from_codepoint_array(arr)
{
for (var i = 0; i < arr.count; i += 1)
{
arr[i] = $arr[i];
}
}
function to_codepoint_array(arr)
{
for (var i = 0; i < arr.count; i += 1)
{
arr[i] = #arr[i];
}
}
var LINK_MAP = ['\xFE80', '\xFE81', '\xFE83', '\xFE85', '\xFE87', '\xFE89', '\xFE8D', '\xFE8F', '\xFE93', '\xFE95', '\xFE99', '\xFE9D', '\xFEA1', '\xFEA5', '\xFEA9', '\xFEAB', '\xFEAD', '\xFEAF', '\xFEB1', '\xFEB5', '\xFEB9', '\xFEBD', '\xFEC1', '\xFEC5', '\xFEC9', '\xFECD', '\x063B', '\x063C', '\x063D', '\x063E', '\x063F', '\x0640', '\xFED1', '\xFED5', '\xFED9', '\xFEDD', '\xFEE1', '\xFEE5', '\xFEE9', '\xFEED', '\xFEEF', '\xFEF1'];
var UNLINK_MAP = ['\x0621', '\x0622', '\x0622', '\x0623', '\x0623', '\x0624', '\x0624', '\x0625', '\x0625', '\x0626', '\x0626', '\x0626', '\x0626', '\x0627', '\x0627', '\x0628', '\x0628', '\x0628', '\x0628', '\x0629', '\x0629', '\x062A', '\x062A', '\x062A', '\x062A', '\x062B', '\x062B', '\x062B', '\x062B', '\x062C', '\x062C', '\x062C', '\x062C', '\x062D', '\x062D', '\x062D', '\x062D', '\x062E', '\x062E', '\x062E', '\x062E', '\x062F', '\x062F', '\x0630', '\x0630', '\x0631', '\x0631', '\x0632', '\x0632', '\x0633', '\x0633', '\x0633', '\x0633', '\x0634', '\x0634', '\x0634', '\x0634', '\x0635', '\x0635', '\x0635', '\x0635', '\x0636', '\x0636', '\x0636', '\x0636', '\x0637', '\x0637', '\x0637', '\x0637', '\x0638', '\x0638', '\x0638', '\x0638', '\x0639', '\x0639', '\x0639', '\x0639', '\x063A', '\x063A', '\x063A', '\x063A', '\x0641', '\x0641', '\x0641', '\x0641', '\x0642', '\x0642', '\x0642', '\x0642', '\x0643', '\x0643', '\x0643', '\x0643', '\x0644', '\x0644', '\x0644', '\x0644', '\x0645', '\x0645', '\x0645', '\x0645', '\x0646', '\x0646', '\x0646', '\x0646', '\x0647', '\x0647', '\x0647', '\x0647', '\x0648', '\x0648', '\x0649', '\x0649', '\x064A', '\x064A', '\x064A', '\x064A'];
var LAMALEF_LINK_MAP = ['\xFEF5', '\xFEF7', '\x0624', '\xFEF9', '\x0626', '\xFEFB'];
var LAMALEF_UNLINK_MAP = ['\x0622', '\x0622', '\x0623', '\x0623', '\x0625', '\x0625', '\x0627', '\x0627'];
var ALEF_CHARS = ['\x0622', '\x0623', '\x0625', '\x0627'];
var CHAR_LINK_TYPE = [0 /* NONE */, 1 /* BEFORE */, 1 /* BEFORE */, 1 /* BEFORE */, 1 /* BEFORE */, 2 /* DUAL */, 1 /* BEFORE */, 2 /* DUAL */, 1 /* BEFORE */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 1 /* BEFORE */, 1 /* BEFORE */, 1 /* BEFORE */, 1 /* BEFORE */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 0 /* NONE */, 0 /* NONE */, 0 /* NONE */, 0 /* NONE */, 0 /* NONE */, 3 /* CAUSING */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 2 /* DUAL */, 1 /* BEFORE */, 2 /* DUAL */, 2 /* DUAL */];
{
// Convert the arrays unicode to codepoint.
to_codepoint_array(LINK_MAP);
to_codepoint_array(UNLINK_MAP);
to_codepoint_array(LAMALEF_LINK_MAP);
to_codepoint_array(LAMALEF_UNLINK_MAP);
to_codepoint_array(ALEF_CHARS);
}
function shape_arabic_is_alef_char(c)
{
return ALEF_CHARS.find(c) !== -1;
}
function shape_arabic_is_lam_char(c)
{
return c == #'\x0644' /* LAM_CHAR */;
}
function shape_arabic_is_lam_alef_char(c)
{
return c >= #'\xFEF5' && c <= #'\xFEFC';
}
function shape_arabic_is_transparent_char(c)
{
return c >= #'\x064B' && c <= #'\x065E';
}
function shape_arabic_in_link_range(c)
{
return c >= #'\x0621' /* LINK_MAP_RANGE[0] */ && c <= #'\x064A' /* LINK_MAP_RANGE[1] */;
}
function shape_arabic_in_unlink_range(c)
{
return (c >= #'\xFE80' /* UNLINK_MAP_RANGE[0] */ && c <= #'\xFEF4' /* UNLINK_MAP_RANGE[1] */) || shape_arabic_is_lam_alef_char(c);
}
function shape_arabic_is_linkable_before(c)
{
if (!shape_arabic_in_link_range(c))
{
return false;
}
var placement = CHAR_LINK_TYPE[c - #'\x0621' /* LINK_MAP_RANGE[0] */];
return placement == 1 /* BEFORE */ || placement == 2 /* DUAL */ || placement == 3 /* CAUSING */;
}
function shape_arabic_is_linkable_after(c)
{
if (!shape_arabic_in_link_range(c))
{
return false;
}
var placement = CHAR_LINK_TYPE[c - #'\x0621' /* LINK_MAP_RANGE[0] */];
return placement == 2 /* DUAL */ || placement == 3 /* CAUSING */;
}
function shape_arabic_get_char_link_type(c)
{
if (!shape_arabic_in_link_range(c))
{
return 0 /* NONE */;
}
return CHAR_LINK_TYPE[c - #'\x0621' /* LINK_MAP_RANGE[0] */];
}
function shape_arabic_link_char(c, type)
{
if (!shape_arabic_in_link_range(c))
{
return c;
}
var indexLookupKey = c - #'\x0621' /* LINK_MAP_RANGE[0] */;
switch(CHAR_LINK_TYPE[indexLookupKey])
{
case 1: /* BEFORE */
return LINK_MAP[indexLookupKey] + type % 2;
case 2: /* DUAL */
return LINK_MAP[indexLookupKey] + type;
case 0: /* NONE */
return LINK_MAP[indexLookupKey];
case 3: /* CAUSING */
default:
return c;
}
}
function shape_arabic_link_lam_alef(c, type)
{
if (!shape_arabic_is_alef_char(c))
{
return c;
}
return LAMALEF_LINK_MAP[c - #'\x0622' /* LAMALEF_LINK_MAP_RANGE[0] */] + type % 2;
}
function shape_arabic_unlink_char(c)
{
if (!shape_arabic_in_unlink_range(c))
{
return c;
}
return UNLINK_MAP[c - #'\xFE80' /* UNLINK_MAP_RANGE[0] */];
}
function shape_arabic_unlink_lam_alef(c)
{
if (!shape_arabic_is_lam_alef_char(c))
{
return c;
}
return LAMALEF_UNLINK_MAP[c - #'\xFEF5' /* LAMALEF_UNLINK_MAP_RANGE[0] */];
}
global.internal_shape_arabic_linkage_temp = [];
function internal_shape_arabic(in_split_text, out_split_text, should_split_by_linkage=false)
{
var type1;
var type2 = 0 /* ISOLATED */;
var res = out_split_text;
if (should_split_by_linkage)
{
res = global.internal_shape_arabic_linkage_temp;
res.clear();
}
for (var i = 0; i < in_split_text.length; i += 1)
{
var c = #(in_split_text[i]);
if (shape_arabic_get_char_link_type(c) === 3 /* CAUSING */)
{
res.add($(c));
type2 = 3 /* MEDIAL */;
continue;
}
var j = i + 1;
var cj = #(in_split_text[j]);
for (; j < in_split_text.length - 1 && shape_arabic_is_transparent_char(cj); j += 1)
{
cj = #(in_split_text[j]);
}
type1 = type2 === 2 /* INITIAL */ || type2 === 3 /* MEDIAL */ ? 1 /* FINAL */ : 0 /* ISOLATED */;
if (j < in_split_text.length)
{
if (shape_arabic_is_lam_char(c) && shape_arabic_is_alef_char(cj))
{
res.add($(shape_arabic_link_lam_alef(cj, type1)));
type2 = type1;
i = j;
continue;
}
if (shape_arabic_is_linkable_after(c) && shape_arabic_is_linkable_before(cj))
{
type1 |= 2 /* INITIAL */;
}
}
{
res.add($(shape_arabic_link_char(c, type1)));
if (should_split_by_linkage && (type1 === 1 /* FINAL */ || type1 === 0 /* ISOLATED */))
{
if (res.count === 1 && shape_arabic_is_transparent_char(#(res[0])) && out_split_text.count - 1 >= 0)
{
out_split_text[out_split_text.count - 1] += res[0];
}
else
{
out_split_text.add(res.join(""));
}
res.clear();
}
type2 = type1;
}
}
if (should_split_by_linkage && res.count > 0)
{
if (res.count === 1 && shape_arabic_is_transparent_char(#(res[0])) && out_split_text.count - 1 >= 0)
{
out_split_text[out_split_text.count - 1] += res[0];
}
else
{
out_split_text.add(res.join(""));
}
res.clear();
}
}
global.shape_arabic_array_temp = [];
function shape_arabic(text, should_split_by_linkage=false)
{
text += "";
if (text.length == 0)
{
return text;
}
var out_split_text = global.shape_arabic_array_temp;
out_split_text.clear();
internal_shape_arabic(text, out_split_text, should_split_by_linkage);
if (should_split_by_linkage)
{
return out_split_text;
}
else
{
return out_split_text.join("");
}
}
function internal_unshape_arabic(in_split_text, out_split_text)
{
for (var i = 0; i < in_split_text.length; i++)
{
var isBground = #(in_split_text[i]);
if (shape_arabic_is_lam_alef_char(isBground))
{
out_split_text.add('\x0644' /* LAM_CHAR */);
out_split_text.add($(shape_arabic_unlink_lam_alef(isBground)));
}
else
{
out_split_text.add($(shape_arabic_unlink_char(isBground)));
}
}
}
global.unshape_arabic_array_temp = [];
function unshape_arabic(text)
{
text += "";
if (text.length == 0)
{
return text;
}
var out_split_text = global.unshape_arabic_array_temp;
out_split_text.clear();
var end_pos = internal_unshape_arabic(text, out_split_text);
return out_split_text.join("");
}
{
@if(0)
var str = "(0,0,n,ev青子汎用05私服a(スナーク)オブジェc2,-10,765,3900,0,-25.477,-80,80,屋外蛍雪,1)(500,6,l,,-938,1416,,255,-10,-100,100,,)(1000,3,,,31,1218,,,-20,,,,)(3000,0,,,100,1214,,,,,,,)";
var res2 = parseKeyFrame_old(str);
res2.saveStruct("kek21.ksc");
var res = parseKeyFrame(str);
res.saveStruct("kek22.ksc");
@endif
@if(0)
var res = isNumber("-1000");
Debug.message(res);
@endif
@if(0)
var res = split_kagtag("@hello message=world message2=world message3 message4='world' message5='www' message6=\"www2\"");
(Dictionary.saveStruct incontextof res)("kek3.ksc");
@endif
@if(0)
var x = split_string("kekek\nkekeke");
x.saveStruct("kek4.ksc");
@endif
@if(0)
//var x = [shape_arabic("أكتب عربي على الفوتوشوب الغير معرب مجاناً").reverse()];
//var x = [shape_arabic("أكتب عربي على الفوتوشوب الغير معرب مجاناً", false)];
var x = shape_arabic("مرحباً بالعالم", true);
for (var i = 0; i < x.count; i += 1)
{
x[i] = x[i].reverse();
}
x.reverse();
//x[0] = x[0].reverse();
x.save("kek5.ksc");
@endif
@if(0)
var x = [Math.PI, Math.E];
x.save("kek6.ksc");
@endif
@if(1)
var x = " xxx ";
var regex = /(\s+$|^\s+)/g;
//x = x.replace(regex, "");
Debug.message("Trimmed: \"" + x + "\"");
@endif
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment