diff --git a/README.md b/README.md deleted file mode 100644 index 8c434e9..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# tritonmconverter \ No newline at end of file diff --git a/css/style.css b/css/style.css index d1d49cb..624e9d6 100644 --- a/css/style.css +++ b/css/style.css @@ -21,54 +21,87 @@ body { box-sizing: border-box; } -.settings { - display: flex; - flex-direction: column; +main { + flex-grow: 1; +} + +.h-100 { + height: 100%; +} + +.row { + margin: 0 !important; +} + +.gap { gap: .5em; } -.setting-group { +.flex-grow { + flex-grow: 1; +} + +/*.settings {*/ +/* display: flex;*/ +/* flex-direction: column;*/ +/* gap: .5em;*/ +/*}*/ + +/*.setting-group {*/ +/* display: flex;*/ +/* width: 50%;*/ +/*}*/ + +/*.setting-group:last-child{*/ +/* flex-direction: column;*/ +/* gap: .5em;*/ +/*}*/ + +/*.input {*/ +/* display: flex;*/ +/*}*/ + + +/*.setting-group:first-child, .input {*/ +/* justify-content: space-between;*/ +/*}*/ + + +/*.setting-group label {*/ +/* display: flex;*/ +/* width: 50%;*/ +/*}*/ + +/*.setting-group input {*/ +/* width: 100%;*/ +/*}*/ + +/*.input-field {*/ +/* width: 100%;*/ +/* display: flex;*/ +/* gap: .5em;*/ +/*}*/ + +/*.args {*/ +/* width: 100%;*/ + +/* display: flex;*/ +/* gap: .5em;*/ + +/* flex-wrap: wrap;*/ +/*}*/ + +.args, .db { + min-height: 100px; display: flex; - width: 50%; -} - -.setting-group:last-child{ - flex-direction: column; - gap: .5em; -} - -.input { - display: flex; -} - - -.setting-group:first-child, .input { + flex-wrap: wrap; + align-content: start; justify-content: space-between; } - -.setting-group label { - display: flex; - width: 50%; -} - -.setting-group input { - width: 100%; -} - -.input-field { - width: 100%; - display: flex; - gap: .5em; -} - -.args { - width: 100%; - - display: flex; - gap: .5em; - - flex-wrap: wrap; +.db input { + width: 49% !important; + margin-bottom: .5em; } .arg { @@ -81,6 +114,10 @@ body { gap: .25em; align-items: center; + line-height: 1; + + height: fit-content; + width: fit-content; } .delete-arg { @@ -91,60 +128,60 @@ body { cursor: pointer; } -.content { - flex-grow: 1; - width: 100%; +/*.content {*/ +/* flex-grow: 1;*/ +/* width: 100%;*/ - display: flex; - flex-wrap: wrap; - justify-content: space-between; - gap: .5em; -} +/* display: flex;*/ +/* flex-wrap: wrap;*/ +/* justify-content: space-between;*/ +/* gap: .5em;*/ +/*}*/ -.content .buttons { - width: 100%; - display: flex; +/*.content .buttons {*/ +/* width: 100%;*/ +/* display: flex;*/ - justify-content: space-between; -} +/* justify-content: space-between;*/ +/*}*/ -.content .buttons div { - display: flex; - justify-content: space-between; - align-items: center; - width: 49%; -} +/*.content .buttons div {*/ +/* display: flex;*/ +/* justify-content: space-between;*/ +/* align-items: center;*/ +/* width: 49%;*/ +/*}*/ -.content textarea { - height: 100%; - width: 49%; -} +/*.content textarea {*/ +/* height: 100%;*/ +/* width: 49%;*/ +/*}*/ -footer { - display: flex; - width: 100%; - padding: .5em; - margin-top: .5em; +/*footer {*/ +/* display: flex;*/ +/* width: 100%;*/ +/* padding: .5em;*/ +/* margin-top: .5em;*/ - font-size: 12pt; +/* font-size: 12pt;*/ - text-align: center; - align-items: center; - justify-content: center; +/* text-align: center;*/ +/* align-items: center;*/ +/* justify-content: center;*/ - font-weight: 600; +/* font-weight: 600;*/ - color: #333; -} +/* color: #333;*/ +/*}*/ -footer a { - text-decoration: none; +/*footer a {*/ +/* text-decoration: none;*/ - color: #333; - transition: color .5s ease; -} +/* color: #333;*/ +/* transition: color .5s ease;*/ +/*}*/ -footer a:hover { - color: blueviolet; -} +/*footer a:hover {*/ +/* color: blueviolet;*/ +/*}*/ diff --git a/index.html b/index.html deleted file mode 100644 index 034f0de..0000000 --- a/index.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Text Transformer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
-
- -
-
-
-
-
-
-
-
Input
-
Output
-
- - -
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..f7146b0 --- /dev/null +++ b/index.php @@ -0,0 +1,172 @@ +set_charset('utf8'); + if ($link == false){ + exit(json_encode(array("success" => "false", "message"=> "Невозможно подключиться к MySQL" . mysqli_connect_error()))); + } + + $resCollection = $link->query("SELECT * FROM `".$prefix."collections` WHERE `name` = '" . $data['collection'] . "';"); + $isSuccess = true; + $hasCollection = mysqli_num_rows($resCollection) > 0; + foreach($data['data'] as $key => $value){ + // echo $key . " -> "; var_dump($value); echo '
'; + + if($hasCollection){ + $rs = $link->query("SELECT `twin_id`, `twin_data` FROM `".$prefix."translations` WHERE `field_key` = '" . $key . "';"); + $hasLocalization = mysqli_num_rows($rs) > 0; + + if($hasLocalization){ + //updating + $data = mysqli_fetch_assoc($rs); + $twinData = json_decode($data['twin_data'], true); + $twinData['dateUpdated'] = time()*1000; + + + $res = $link->query("UPDATE `".$prefix."translations` SET `twin_data` = '".str_replace("\"", '\\"',json_encode($twinData))."' , `content` = '".str_replace("\"", '\\"', json_encode($value, JSON_UNESCAPED_UNICODE))."' WHERE `twin_id` = '" . $data['twin_id'] . "';"); + + if(!$res) { + exit(json_encode(array("success" => "false", "message" => "Couldn't save " . $key . ": " . $link->error))); + break; + } + + }else { + $twinData = array( + "dateCreated" => time()*1000, + "dateUpdated" => time()*1000, + "archived" => false, + "tags" => [] + ); + $twinId = guidv4(); + //inserting + $stmt = $link->prepare("INSERT INTO `".$prefix."translations` (`collection`, `field_key`, `content`, `twin_id`, `twin_data`) VALUES (?,?,?,?,?)"); + $stmt ->bind_param("sssss", $data['collection'], $key, json_encode($value, JSON_UNESCAPED_UNICODE), $twinId, json_encode($twinData)); + $res = $stmt -> execute(); + $stmt -> close(); + if(!$res) { + exit(json_encode(array("success" => "false", "message" => "Couldn't save " . $key . ": " . $link->error))); + break; + } + } + }else { + $twinData = array( + "dateCreated" => time()*1000, + "dateUpdated" => time()*1000, + "archived" => false, + "tags" => [] + ); + $twinId = guidv4(); + //inserting + $queryAddCollection = "INSERT INTO `".$prefix."collections` (`name`, `servers`, `blacklist`) VALUES ('".$data['collection']."', '[]', 1)"; +// $queryAddTranslation = "INSERT INTO `".$prefix."translations` (`collection`, `field_key`, `content`, `twin_id`, `twin_data`) VALUES ('".$data['collection']."' , '".$key."' , '".str_replace("\"", '\\"', json_encode($value, JSON_UNESCAPED_UNICODE))."' , '".$twinId."' , '".str_replace("\"", '\\"',json_encode($twinData))."');"; + $res = $link->query($queryAddCollection); +// $res = $link->query($queryAddTranslation); + $stmt = $link->prepare("INSERT INTO `".$prefix."translations` (`collection`, `field_key`, `content`, `twin_id`, `twin_data`) VALUES (?,?,?,?,?)"); + $stmt ->bind_param("sssss", $data['collection'], $key, json_encode($value, JSON_UNESCAPED_UNICODE), $twinId, json_encode($twinData)); + $res = $stmt -> execute(); + $stmt -> close(); + if(!$res) { + exit(json_encode(array("success" => "false", "message" => "Couldn't save " . $key . ": " . $link->error))); + break; + } + $hasCollection = true; + } + } + exit(json_encode(array("success" => "true"))); + } +?> + + + + + + Text Transformer + + + + + + +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ + + + + + +
+
+
+
+
+
+
+ Input + +
+
+ Output + +
+
+
+
+ +
+
+ +
+
+
+ + + + + + + + diff --git a/js/index.js b/js/index.js new file mode 100644 index 0000000..8c74fd0 --- /dev/null +++ b/js/index.js @@ -0,0 +1,215 @@ +// const lineWithValuePattern = /[a-zA-Z]:/i +//^\s+[a-zA-Z-_]+:\s+["'A-Za-zА-Яа-я&<\{\}\>\[\]§]+|^\s+-\s+["'A-Za-zА-Яа-я&<\{\}\>\[\]§]+ +const lineWithValuePattern = /["'].*?["']|["'].*?|.*?["']/i; +//System +const inputEl = document.getElementById("input"); +const outputEl = document.getElementById("output"); +const collectionInput = document.getElementById("key"); +const languageSelector = document.getElementById("language"); + +//Runtime +let collectionName; +let currentLanguage; +let result = {}; +let langCache = {} +//utils +function getArgs(){ + let args = []; + for(let i = 0; i < argsElement.children.length; i++){ + args[i] = argsElement.children[i].children[0].innerHTML.trim().replace("<", "<").replace(">", ">"); + } + return args; +} + +function buildRegex(args){ + let regex = "" + for(let i = 0; i < args.length; i++){ + regex += args[i]; + if(i !== args.length-1) regex += "|" + } + return new RegExp(regex); +} + +function parseResulting(value){ + // console.log(value.match(/['"].*?['"]/i)); + value = value.trim(); + let match = value.match(/^['"].*?['"]$/i) + if(match != null){ + value = (match+"").substring(1, (match+"").length-1); + } + // if(value.match(/['"].*?['"]/i) != null) { + // value = (value.match(/^['"].*?['"]$/i)+"").substring(1,); + // } + return value; +} + +//Handlers +function switchLang(e){ + console.log(e.target.selectedOptions.item(0).value); + currentLanguage = e.target.selectedOptions.item(0).value; + if(currentLanguage in langCache) inputEl.value = langCache[currentLanguage]; + else { + inputEl.value = ""; + inputEl.placeholder = "Please enter a localization for lang " + e.target.selectedOptions.item(0).innerHTML; + } + + handleInput() +} + +function switchCollectionName(e){ + collectionName = e.target.value; + handleInput(); +} + +function handleInput() { + if(!collectionName){ + outputEl.value = "Please enter a Collection Name"; + return; + } + if(!currentLanguage){ + outputEl.value = "Waiting for select language"; + return; + } + + let args = getArgs(); + let lines = inputEl.value.split("\n"); + let argsRegex = buildRegex(args); + + outputEl.value = ""; + langCache[currentLanguage] = ""; + let counter = 0; + lines.forEach(line => { + langCache[currentLanguage] += line +"\n"; + if(line.match(lineWithValuePattern) == null){ + outputEl.value += line + "\n"; + return; + } + let data = line.includes(":") ? line.split(/:(.*)/s) : line.split(/-(.*)/s); + let key = line.includes(":") ? data[0] +": " : data[0] +"- "; + let value = data[1]; + // console.log(data); + if(args === undefined || args.length === 0 || value.match(argsRegex) == null){ + //No args... + let locId = collectionName + "_" + counter; + outputEl.value += key + '\'[lang]' + locId + "[/lang]\'\n" + // lang[currentLanguage] += key + value +"\n"; + // if(!(locId in data)) result[locId] = {}; + if(!(locId in result)) result[locId] = {}; + result[locId][currentLanguage] = parseResulting(value); + counter++; + return; + } + + let re = /[%<\[<\{]{1}[a-zA-Z_-]+[%>\]\}]{1}/g; + let locId = collectionName + "_" + counter; + outputEl.value += key + "'[lang]" +locId+"[args]"; + let m; + let newVal = value; + let argNum = 1; + do { + m = re.exec(value); + if (m) { + if(args.indexOf(m+"") > -1){ + outputEl.value+= "[arg]" + m + "[/arg]"; + newVal = newVal.replace(m+"", "%"+argNum); + argNum++; + } + } + } while (m); + if(!(locId in result)) result[locId] = {}; + result[locId][currentLanguage] = parseResulting(newVal); + outputEl.value += "[/args][/lang]'\n"; + counter++; + }); +} + +let dbHost = document.getElementById("db_host") +let dbPort = document.getElementById("db_port") +let dbUser = document.getElementById("db_user") +let dbPass = document.getElementById("db_pass") +let dbBase = document.getElementById("db_base") +let dbPref = document.getElementById("db_prefix") + + +function loadFromCache(){ + dbHost.value = localStorage.getItem("db_host") != null ? localStorage.getItem("db_host") : ""; + dbPort.value = localStorage.getItem("db_port") != null ? localStorage.getItem("db_port") : "3306"; + dbUser.value = localStorage.getItem("db_user") != null ? localStorage.getItem("db_user") : ""; + dbPass.value = localStorage.getItem("db_pass") != null ? localStorage.getItem("db_pass") : ""; + dbBase.value = localStorage.getItem("db_base") != null ? localStorage.getItem("db_base") : ""; + dbPref.value = localStorage.getItem("db_pref") != null ? localStorage.getItem("db_pref") : "triton_"; +} + +function reset(){ + langCache = {}; + result = {}; + currentLanguage = undefined; + collectionName = undefined; + + collectionInput.value = ""; + inputEl.value = ""; + $(inputEl).attr("disabled"); + outputEl.value = "Please enter a Collection Name"; + languageSelector.value = "choose"; +} + +function saveToCache(){ + localStorage.setItem("db_host", dbHost.value); + localStorage.setItem("db_port", dbPort.value); + localStorage.setItem("db_user", dbUser.value); + localStorage.setItem("db_pass", dbPass.value); + localStorage.setItem("db_base", dbBase.value); + localStorage.setItem("db_pref", dbPref.value); +} + +function uploadToDB(){ + saveToCache(); + if(!collectionName || !currentLanguage) return; + const data = { + "database": { + "host": dbHost.value === undefined ? "" : dbHost.value, + "user": dbUser.value === undefined ? "" : dbUser.value, + "pass": dbPass.value === undefined ? "" : dbPass.value, + "base": dbBase.value === undefined ? "" : dbBase.value, + "pref": dbPref.value === undefined ? "" : dbPref.value, + "port": dbPort.value === undefined ? 3306 : parseInt(dbPort.value) + }, + "collection": collectionName, + "data": result + } + + console.log(JSON.stringify(data)); + + $.ajax({ + url: "/index.php", + method: "POST", + // dataType: "json", + data: { data: JSON.stringify(data)}, + success: (data) => { + let result = JSON.parse(data); + if(result.success) { + alert("Successfully saved to database"); + }else { + alert("Error saving to database
" + result.message); + } + document.getElementById("btn").innerHTML = "Upload translations to database"; + }, + error: (e, err, err1) => { + alert("Error saving to database:
"); + console.log(err); + console.log(err1); + document.getElementById("btn").innerHTML = "Upload translations to database"; + }, + beforeSend: () => { document.getElementById("btn").innerHTML = "Saving to database... Please wait" } + }) +} + +handleInput(); +loadFromCache(); + +//Register Listeners +collectionInput.addEventListener("input", switchCollectionName); +languageSelector.addEventListener("change", switchLang) +inputEl.addEventListener("input", handleInput); +document.getElementById("btn").addEventListener("click", uploadToDB) +document.getElementById("reset").addEventListener("click", reset); \ No newline at end of file diff --git a/js/jquery-3.7.1.min.js b/js/jquery-3.7.1.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/js/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 { - if(line.startsWith("#")) { - outputEl.value+=line + "\n"; - return; - } - let isListItem = false - if(line.match(/:\s+["']|-\s+["']/i) == null){ - outputEl.value+=line + "\n"; - return; - } - - isListItem = line.match(/-\s+["']/i) !=null; - - let matches = line.match(regex); - let key = isListItem ? line.split("-")[0] +"- " : line.split(":")[0] + ": "; - - if(matches == null || args.length === 0){ - outputEl.value += key + "\"[lang]"+prefix +"_"+counter+"[/lang]\"\n"; - counter++; - return; - } - - let re = /[%<\[<\{]{1}[a-zA-Z_-]+[%>\]\}]{1}/g; - - outputEl.value += key + "\"[lang]" +prefix + "_"+counter+"[args]"; - let m; - do { - m = re.exec(line); - if (m) { - if(args.indexOf(m+"") > -1){ - outputEl.value+= "[arg]" + m + "[/arg]"; - } - } - } while (m); - outputEl.value += "[/args][/lang]\"\n"; - counter++; - }); -} - - -function handleTagInput(e) { - let tagDiv = document.createElement("div"); - tagDiv.classList.add("arg") - let el = document.createElement("span"); - el.innerHTML = tagInput.value.replace("<", "<").replace(">", ">"); - tagDiv.append(el); - - let tagCloser = document.createElement("span") - tagCloser.classList.add("delete-arg"); - tagCloser.innerHTML = "X"; - tagDiv.append(tagCloser); - - tagCloser.addEventListener("click", deleteArg); - - argsElement.append(tagDiv); - tagInput.value = ""; - - handleInput() -} - -function copyResult(){ - outputEl.focus(); - outputEl.select(); - - document.execCommand("copy"); -} - -function deleteArg(e) { - e.target.removeEventListener("click", deleteArg); - e.target.parentElement.remove(); - handleInput() -} - -function getArgs(){ - let args = []; - for(let i = 0; i < argsElement.children.length; i++){ - args[i] = argsElement.children[i].children[0].innerHTML.trim().replace("<", "<").replace(">", ">"); - } - return args; -} - -function getRegex(){ - let args = getArgs(); - let regex = ""; - for(let i =0; i < args.length; i ++){ - if(i !== args.length-1) regex += args[i] + "|" - else regex += args[i]; - } - return new RegExp(regex); -} - -tagInput.addEventListener("change", handleTagInput); -prefixInput.addEventListener("input", handleInput); -inputEl.addEventListener("input", handleInput); - - -document.getElementById("date").innerHTML = new Date().getFullYear(); - -// (() => { -// let dateElem = document.getElementById("date"); -// })(); \ No newline at end of file diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 0000000..8b82d86 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,50 @@ + +const argsElement = document.getElementById("args"); +const tagInput = document.getElementById("add_arg"); +const selectElem = document.getElementById("language"); + +function select(e){ + selectElem.removeEventListener("change", select); + document.getElementById("input").attributes.removeNamedItem("disabled"); +} + +function addArg() { + let tagDiv= document.createElement("div"); + tagDiv.classList.add("arg") + let el = document.createElement("span"); + el.innerHTML = tagInput.value.replace("<", "<").replace(">", ">"); + tagDiv.append(el); + + let tagCloser = document.createElement("span") + tagCloser.classList.add("delete-arg"); + tagCloser.innerHTML = "X"; + tagDiv.append(tagCloser); + + tagCloser.addEventListener("click", deleteArg); + + argsElement.append(tagDiv); + tagInput.value = ""; + + handleInput(); +} + +function deleteArg(e) { + e.target.removeEventListener("click", deleteArg); + e.target.parentElement.remove(); + handleInput() +} + +function copyResult(){ + let attr = outputEl.attributes.getNamedItem("disabled"); + outputEl.attributes.removeNamedItem("disabled") + outputEl.focus(); + outputEl.select(); + document.execCommand("copy"); + outputEl.select(); + outputEl.attributes.setNamedItem(attr); +} + +tagInput.addEventListener("change", addArg); +selectElem.addEventListener("change", select); + +document.getElementById("date").innerHTML = new Date().getFullYear(); \ No newline at end of file