User:Bluedeck/serve/parenfix.js

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

// Author: Bluedeck <bluedeck@outlook.com>
// 本脚本未设计为可公开引用。未咨询 bluedeck 的引用可能造成脚本冲突。

function Sw_Parenfix()
{
	this.data={"brief":{},"label":"","raw":""};
	
	this.setParendata = function(parendata)
	{
		if(this.check_validity_parendata(parendata))
		{
			this.data = this.parendata_to_json(parendata);
			return true;
		}
		return false;
	};
	
	this.getParendata = function()
	{
		return this.json_to_parendata(this.data);
	};
	
	this.setJson = function(json)
	{
		if(this.check_validity_json(json))
		{
			this.data = json;
			return true;
		}
		retrun false;
	};
	
	this.getJson = function()
	{
		return this.data;
	};
	
	this.parendata_to_json = function(string)
	{
		arr = string.split(")");
		brief = {};
		label = "";
		raw = "";
		for(i=0; i<arr.length; i++)
		{
			if(arr[i].split(":").length !== 2)
			{
				label = arr[i].split("(")[1];
				break;
			}
		}
		for(j=0; j<i; j++)
		{
			brief[arr[j].split(":")[0].split("(")[1]] = arr[j].split(":")[1];
		}
		brr=[];
		for(i++; i<arr.length; i++)
		{
			brr = brr.concat(arr[i]);
		}
		raw = brr.join(")");
		return {"brief":brief,"label":label,"raw":raw};
	};
	
	this.json_to_parendata = function(json)
	{
		parendata = "";
		for(i in json.brief)
		{
			parendata += "(" + i + ":" + json.brief[i] + ")";
		}
		parendata += "(" + json.label + ")";
		parendata += json.raw;
		return parendata;
	};
	
	this.check_validity_parendata = function(string)
	{
		if(string.length<2)
		{
			// string has to contain at least "()".
			return false;
		}
		if(string.length===2&&string!=="()")
		{
			// string has to be "()" if it has a length of 2
			return false;
		}
		arr = string.split(")");
		for(i=0; i<arr.length; i++)
		{
			if(arr[i].split(":").length >2)
			{
				// more than 1 colon in each pair of parentheses is not allowed.
				return false;
			}
			if(arr[i][0] !== "(")
			{
				// has to have left parenthesis
				return false;
			}
			if(arr[i].split(":").length === 1)
			{
				// has to have a label
				break;
			}
		}
		return true;
	};
	
	this.check_validity_json = function(json)
	{
		if(typeof json.brief !== "object")
		{
			// json.brief has to be object
			return false;
		}
		if(typeof json.label !== "string")
		{
			// json.label has to be string
			return false;
		}
		if(json.label.split(":").length !== 1)
		{
			// does not allow ":" in label
			return false;
		}
		if(json.label.split("(").length !== 1)
		{
			// does not allow "(" in label
			return false;
		}
		if(json.label.split(")").length !== 1)
		{
			// does not allow ")" in label
			return false;
		}
		if(typeof json.raw !== "string")
		{
			// json.raw has to be string
			return false;
		}
		for(var i in json.brief)
		{
			if(i.split("(").length !== 1)
			{
				// does not allow "(" in cell key
				return false;
			}
			if(i.split(")").length !== 1)
			{
				// does not allow ")" in cell key
				return false;
			}
			if(i.split(":").length !== 1)
			{
				// does not allow ":" in cell key
				return false;
			}
			if(typeof json.brief[i] !== "string")
			{
				// each cell of brief has to be string
				return false;
			}
			if(json.brief[i].split("(").length !== 1)
			{
				//does not allow "(" in cell data
				return false;
			}
			if(json.brief[i].split(")").length !== 1)
			{
				//does not allow ")" in cell data
				return false;
			}
			if(json.brief[i].split(":").length !== 1)
			{
				//does not allow ":" in cell data
				return false;
			}
		}
		return true;
	};
}