diff --git a/.npmignore b/.gitignore similarity index 80% rename from .npmignore rename to .gitignore index 1536975..504afef 100644 --- a/.npmignore +++ b/.gitignore @@ -1,4 +1,2 @@ node_modules/ package-lock.json - -.idea/ diff --git a/CHANGELOG.md b/CHANGELOG.md index a1d9611..54bd5c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Pika JS +## 0.1.5 2023-06-21 + +1. Update document +2. Remove `CalcMinMain` to `Pikajs.calcMinMain` +3. Remove `InvalidInfo` to `Pikajs.invalidInfo` +4. Remove `PassQCalc` to `Pikajs.passQCalc` +5. Update `Pikajs.splitAnimationElement` to `Pikajs.splitContent` +6. Add `Pikajs.splitContentWithParity` + ## 0.1.4 2023-04-21 1. Update document diff --git a/DOCUMENT.md b/DOCUMENT.md index 8cb7105..13e44fb 100644 --- a/DOCUMENT.md +++ b/DOCUMENT.md @@ -1,6 +1,61 @@ # Pika JS document -## `PikaJS` +## `Pikajs` + +### `calcMinMain` + +Calculate `min-height` and fill it in the style of the `main`, and ensure that main fills the entire page. + +```js +window.addEventListener('load', (event) => { + Pikajs.calcMinMain(); +}); +``` + +### `calcMinMain(parentNode)` + +Calculate `min-height` and fill it in the style of the `main`, and ensure that main fills the entire page. + +```js +window.addEventListener('load', (event) => { + let app = document.getElementById('app'); + Pikajs.calcMinMain(app); +}); +``` + +### `invalidInfo(inputId='',inputEId='', regex='', message='')` + +Add or remove a `p` tag with `inputEId` below the tag to display validation information. + +like this: + +```html +
+ +
+ +``` + +### `passQCalc(pass='')` + +Password Quality Calculator, if the value is greater than 80, it is a strong password. + +Async like this: + +```js +async function pqcalc(pass='') { + return await Pikajs.passQCalc(pass); +} + +pqcalc('P422w0Rd').then((result) => { + document.getElementById("rank").innerText = result; +}); +``` ### `getSelectorHeight(selector='')` @@ -72,19 +127,19 @@ Get browser dark mode Return undefined is unsupported, true is dark mode, false is light mode -### `splitAnimationElement(animEleText="")` +### `splitContent(content = "", separator = "", splitTag = "")` -Split animation element text +Split content Convert like `test` to -`test` +`test` ```javascript const animaEles = document.body.querySelectorAll(".animEles"); animaEles.forEach((e) => { - Pikajs.splitAnimationElement(e.innerHTML) + Pikajs.splitContent(e.innerHTML, "", "em") .then(function (event) { e.innerHTML = event; }) @@ -94,56 +149,24 @@ animaEles.forEach((e) => { }); ``` -## `CalcMinMain` +### `splitContentWithParity(content = "", separator = "", splitTag = "", evenClass = "", oddClass = "")` -Calculate `min-height` and fill it in the style of the `main`, and ensure that main fills the entire page. +Split content with parity -```js -window.addEventListener('load', (event) => { - CalcMinMain(); -}); -``` - -## `CalcMinMain(parentNode)` - -Calculate `min-height` and fill it in the style of the `main`, and ensure that main fills the entire page. - -```js -window.addEventListener('load', (event) => { - let app = document.getElementById('app'); - CalcMinMain(app); -}); -``` - -## `InvalidInfo(inputId='',inputEId='', regex='', message='')` - -Add or remove a `p` tag with `inputEId` below the tag to display validation information. - -like this: -```html -
- -
- -``` - -## `PassQCalc(pass='')` - -Password Quality Calculator, if the value is greater than 80, it is a strong password. - -Async like this: - -```js -async function pqcalc(pass='') { - return await PassQCalc(pass); -} +Convert like +`test` +to +`test` -pqcalc('P422w0Rd').then((result) => { - document.getElementById("rank").innerText = result; +```javascript +const animaEles = document.body.querySelectorAll(".animEles"); +animaEles.forEach((e) => { + Pikajs.splitContent(e.innerHTML, "", "em", "even", "odd") + .then(function (event) { + e.innerHTML = event; + }) + .catch(function (error) { + console.log(error); + }); }); ``` diff --git a/README.md b/README.md index 43b34e8..0f73679 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ A function toolkit. - + ``` OR @@ -27,7 +27,7 @@ OR - + ``` ## Development Version @@ -38,7 +38,7 @@ OR - + ``` ## Document diff --git a/dist/pika.min.js b/dist/pika.min.js index 493ccdc..376a1e2 100644 --- a/dist/pika.min.js +++ b/dist/pika.min.js @@ -1,2 +1,2 @@ -/*! Pika-js v0.1.3 (https://github.com/leonardwoo/pika-js) | Licensed under MIT (https://github.com/leonardwoo/pika-js/blob/main/LICENSE) */ -"use strict";class Pikajs{constructor(){}static _height(t){if(null==t)return-1;let e=t.clientHeight;return(null==e||e<0)&&(e=-1),e}static getSelectorHeight(t){return getSelectorHeight(document,t)}static getSelectorHeight(t,e){const r=t.querySelector(e),a=this._height(r);return a<0?0:a}static hasSelectionHeight(){return this.hasSelectionHeight(document)}static hasSelectionHeight(t){const e=t.getElementsByTagName("section")[0];return!(this._height(e)<0)}static isPassword(t=""){return/^[\x21-\x7E]{8,20}$/g.test(t)}static checkRepeat(t=""){let e=0;for(let r=0;r=0?t.match(e).length:0}static isUpperChar(t=""){return/\p{Lu}+/gu.match(t).length>0}static isLowerChar(t=""){return/\p{Ll}+/gu.match(t).length>0}static isDigit(t=""){return/\p{Nd}+/gu.match(t).length>0}static isPunctuation(t=""){return/\p{P}+/gu.match(t).length>0}static isWhiteSpace(t=""){return/\s+/gu.match(t).length>0}static base64ToArrayBuffer(t){const e=window.atob(t);return this.stringToArrayBuffer(e)}static arrayBufferToBase64(t){const e=this.arrayBufferToString(t);return window.btoa(e)}static stringToArrayBuffer(t){const e=new Uint8Array(t.length);for(let r=0;r{e+=""+t+""})),e+="",e}}function CalcMinMain(){CalcMinMain(document)}function CalcMinMain(t){let e=Pikajs.getSelectorHeight(t,"header"),r=Pikajs.hasSelectionHeight(t)?0:Pikajs.getSelectorHeight(t,"footer");t.querySelector("main").style.setProperty("min-height","calc(100vh - "+(e+r)+"px)")}function InvalidInfo(t="",e="",r="",a=""){const n=document.getElementById(t);let i=document.getElementById(e);r.test(n.value)?null!=i&&n.parentNode.removeChild(i):null==i?(i=document.createElement("p"),i.setAttribute("id",e),i.innerText=a,n.parentNode.appendChild(i)):i.innerText=a}function PassQCalc(t=""){let e=0;e+=t.length>8?4:0,e+=2*(t.length-Pikajs.checkChar(t,/[a-z]/g)),e+=3*(t.length-Pikajs.checkChar(t,/[A-Z]/g)),e+=2*(t.length-Pikajs.checkChar(t,/[0-9]/g)),e+=6*Pikajs.checkChar(t,/((?=["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"])[^A-Za-z0-9])/g),e-=2*Pikajs.checkChar(t,/[A-Z]{3,}/g),e-=2*Pikajs.checkChar(t,/[a-z]{3,}/g),e-=2*Pikajs.checkChar(t,/[0-9]{3,}/g),e-=2*Pikajs.checkChar(t,/["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"]{3,}/g);const r=Pikajs.checkRepeat(t);return e-=r*(r-1),e<=0?0:e} \ No newline at end of file +/*! Pika-js | MIT License | https://github.com/leonardwoo/pika-js */ +"use strict";class Pikajs{constructor(){}static _height(t){if(null==t)return-1;let e=t.clientHeight;return(null==e||e<0)&&(e=-1),e}static calcMinMain(){calcMinMain(document)}static calcMinMain(t){let e=getSelectorHeight(t,"header"),r=hasSelectionHeight(t)?0:getSelectorHeight(t,"footer");t.querySelector("main").style.setProperty("min-height","calc(100vh - "+(e+r)+"px)")}static invalidInfo(t="",e="",r="",c=""){const a=document.getElementById(t);let i=document.getElementById(e);r.test(a.value)?null!=i&&a.parentNode.removeChild(i):null==i?(i=document.createElement("p"),i.setAttribute("id",e),i.innerText=c,a.parentNode.appendChild(i)):i.innerText=c}static passQCalc(t=""){let e=0;e+=t.length>8?4:0,e+=2*(t.length-checkChar(t,/[a-z]/g)),e+=3*(t.length-checkChar(t,/[A-Z]/g)),e+=2*(t.length-checkChar(t,/[0-9]/g)),e+=6*checkChar(t,/((?=["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"])[^A-Za-z0-9])/g),e-=2*checkChar(t,/[A-Z]{3,}/g),e-=2*checkChar(t,/[a-z]{3,}/g),e-=2*checkChar(t,/[0-9]{3,}/g),e-=2*checkChar(t,/["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"]{3,}/g);const r=checkRepeat(t);return e-=r*(r-1),e<=0?0:e}static getSelectorHeight(t){return getSelectorHeight(document,t)}static getSelectorHeight(t,e){const r=t.querySelector(e),c=this._height(r);return c<0?0:c}static hasSelectionHeight(){return this.hasSelectionHeight(document)}static hasSelectionHeight(t){const e=t.getElementsByTagName("section")[0];return!(this._height(e)<0)}static hasArticleHeight(){return this.hasArticleHeight(document)}static hasArticleHeight(t){const e=t.getElementsByTagName("article")[0];return!(this._height(e)<0)}static isPassword(t=""){return/^[\x21-\x7E]{8,20}$/g.test(t)}static checkRepeat(t=""){let e=0;for(let r=0;r=0?t.match(e).length:0}static isUpperChar(t=""){return/\p{Lu}+/gu.match(t).length>0}static isLowerChar(t=""){return/\p{Ll}+/gu.match(t).length>0}static isDigit(t=""){return/\p{Nd}+/gu.match(t).length>0}static isPunctuation(t=""){return/\p{P}+/gu.match(t).length>0}static isWhiteSpace(t=""){return/\s+/gu.match(t).length>0}static base64ToArrayBuffer(t){const e=window.atob(t);return this.stringToArrayBuffer(e)}static arrayBufferToBase64(t){const e=this.arrayBufferToString(t);return window.btoa(e)}static stringToArrayBuffer(t){const e=new Uint8Array(t.length);for(let r=0;r{c+="<"+r+">"+t+""})),c)}static async splitContentWithParity(t="",e="",r="",c="",a=""){let i="";if(""==r)return t;const n=""==c?"":' class="'+c+'"',h=""==a?"":' class="'+a+'"';var s=0;return t.split(e).forEach((t=>{i+="<"+r+(s%2==0?n:h)+">"+t+"",s++})),i}} \ No newline at end of file diff --git a/dist/pika.min.js.map b/dist/pika.min.js.map index ae9e05e..90589ce 100644 --- a/dist/pika.min.js.map +++ b/dist/pika.min.js.map @@ -1 +1 @@ -{"version":3,"names":["Pikajs","constructor","static","element","elementHeight","clientHeight","selector","getSelectorHeight","document","parentNode","s","querySelector","sh","this","_height","hasSelectionHeight","e","getElementsByTagName","pass","test","text","count","i","length","regex","search","match","base64","binaryString","window","atob","stringToArrayBuffer","arraybuffer","binary","arrayBufferToString","btoa","str","bytes","Uint8Array","charCodeAt","buffer","String","fromCharCode","apply","darkMode","matchMedia","matches","animEleText","target","split","forEach","CalcMinMain","headerHeight","footerHeight","style","setProperty","InvalidInfo","inputId","inputEId","message","validInput","getElementById","inputEi","value","removeChild","createElement","setAttribute","innerText","appendChild","PassQCalc","rankScore","checkChar","rn","checkRepeat"],"sources":["src/pika.js","src/index.js"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["Pikajs","constructor","static","element","elementHeight","clientHeight","calcMinMain","document","parentNode","headerHeight","getSelectorHeight","footerHeight","hasSelectionHeight","querySelector","style","setProperty","inputId","inputEId","regex","message","validInput","getElementById","inputEi","test","value","removeChild","createElement","setAttribute","innerText","appendChild","pass","rankScore","length","checkChar","rn","checkRepeat","selector","s","sh","this","_height","e","getElementsByTagName","hasArticleHeight","text","count","i","search","match","base64","binaryString","window","atob","stringToArrayBuffer","arraybuffer","binary","arrayBufferToString","btoa","str","bytes","Uint8Array","charCodeAt","buffer","String","fromCharCode","apply","darkMode","matchMedia","matches","content","separator","splitTag","target","split","forEach","evenClass","oddClass","evenAttr","oddAttr"],"sources":["src/pika.js"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index f95231d..bfb0bbb 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "@leonardwoo/pika-js", - "version": "0.1.4", + "version": "0.1.5", "description": "A function toolkit.", "main": "dist/pika.min.js", "scripts": { - "compress": "terser src/pika.js src/index.js -o dist/pika.min.js -c -m --comments --source-map" + "compress": "terser src/pika.js -o dist/pika.min.js -c -m --comments --source-map" }, "repository": { "type": "git", diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 87ead99..0000000 --- a/src/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2023 Leonard Woo. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -"use strict"; - -/** - * Automatic calculator main tag min-height on screen - * - * @author Leonard Woo - * @constructor - */ -function CalcMinMain() { - CalcMinMain(document); -} - -/** - * Automatic calculator main tag min-height on screen under parent node - * - * @param parentNode parent node - * @author Leonard Woo - * @constructor - */ -function CalcMinMain(parentNode) { - let headerHeight = Pikajs.getSelectorHeight(parentNode, 'header'); - let selectionHeight = Pikajs.hasSelectionHeight(parentNode); - let footerHeight = selectionHeight? 0: Pikajs.getSelectorHeight(parentNode, 'footer'); - let main = parentNode.querySelector('main'); - main.style.setProperty('min-height', 'calc(100vh - ' + (headerHeight + footerHeight) + 'px)'); -} - -/** - * Add message under the input tag with regex - * - * @param inputId input tag id - * @param inputEId input error message id with p tag - * @param regex regex - * @param message message - * @author Leonard Woo - * @constructor - */ -function InvalidInfo(inputId='',inputEId='', regex='', message='') { - const validInput = document.getElementById(inputId); - let inputEi = document.getElementById(inputEId); - if (!regex.test(validInput.value)) { - if (inputEi == null) { - inputEi = document.createElement('p'); - inputEi.setAttribute('id', inputEId); - inputEi.innerText = message; - validInput.parentNode.appendChild(inputEi); - } else { - inputEi.innerText = message; - } - } else { - if (inputEi != null) { - validInput.parentNode.removeChild(inputEi); - } - } -} - -/** - * Calculator password quality - * - * @param pass password text - * @returns {number} quality score - * @author Leonard Woo - * @constructor - */ -function PassQCalc(pass='') { - let rankScore = 0; - - rankScore += (pass.length > 8)? 4: 0; - rankScore += (pass.length - Pikajs.checkChar(pass, /[a-z]/g)) * 2; - rankScore += (pass.length - Pikajs.checkChar(pass, /[A-Z]/g)) * 3; - rankScore += (pass.length - Pikajs.checkChar(pass, /[0-9]/g)) * 2; - rankScore += Pikajs.checkChar(pass, /((?=["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"])[^A-Za-z0-9])/g) * 6; - - rankScore -= Pikajs.checkChar(pass, /[A-Z]{3,}/g) * 2; - rankScore -= Pikajs.checkChar(pass, /[a-z]{3,}/g) * 2; - rankScore -= Pikajs.checkChar(pass, /[0-9]{3,}/g) * 2; - rankScore -= Pikajs.checkChar(pass, /["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"]{3,}/g) * 2; - - const rn = Pikajs.checkRepeat(pass); - rankScore -= rn * (rn - 1); - - if (rankScore <= 0) { - return 0; - // } else if (rankScore > 100) { - // return 100; - } else { - return rankScore; - } -} diff --git a/src/pika.js b/src/pika.js index cc4831e..59268fa 100644 --- a/src/pika.js +++ b/src/pika.js @@ -1,270 +1,380 @@ -/* - * Copyright 2023 Leonard Woo. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/*! Pika-js v0.1.3 (https://github.com/leonardwoo/pika-js) | Licensed under MIT (https://github.com/leonardwoo/pika-js/blob/main/LICENSE) */ - +/*! Pika-js | MIT License | https://github.com/leonardwoo/pika-js */ "use strict"; /** - * Pika js class + * Pikajs class * * @author Leonard Woo */ class Pikajs { - constructor() {} - - // get element height, if element is null return -1 - static _height(element) { - if (element == null) { - return -1; - } - let elementHeight = element.clientHeight; - if (elementHeight == null || elementHeight < 0) { - elementHeight = -1; - } - return elementHeight; - } + constructor() {} - /** - * Get element selector height - * - * @param selector element selector - * @returns {number} height - */ - static getSelectorHeight(selector) { - return getSelectorHeight(document, selector); + // get element height, if element is null return -1 + static _height(element) { + if (element == null) { + return -1; } - - /** - * Get element selector height under parent node - * - * @param parentNode parent node - * @param selector element selector - * @returns {number} height - */ - static getSelectorHeight(parentNode, selector) { - const s = parentNode.querySelector(selector); - const sh = this._height(s); - return (sh < 0? 0: sh); + let elementHeight = element.clientHeight; + if (elementHeight == null || elementHeight < 0) { + elementHeight = -1; } + return elementHeight; + } - /** - * Has section tag - * - * @returns {boolean} true is find last section tag - */ - static hasSelectionHeight() { - return this.hasSelectionHeight(document) - } + /** + * Automatic calculator main tag min-height on screen + */ + static calcMinMain() { + calcMinMain(document); + } - /** - * Has section tag under parent node - * - * @param parentNode parent node - * @returns {boolean} true is find last section tag - */ - static hasSelectionHeight(parentNode) { - const e = parentNode.getElementsByTagName("section")[0]; - const eh = this._height(e); - return !(eh < 0); - } + /** + * Automatic calculator main tag min-height on screen under parent node + * + * @param parentNode parent node + */ + static calcMinMain(parentNode) { + let headerHeight = getSelectorHeight(parentNode, 'header'); + let selectionHeight = hasSelectionHeight(parentNode); + let footerHeight = selectionHeight ? 0 : getSelectorHeight(parentNode, 'footer'); + let main = parentNode.querySelector('main'); + main.style.setProperty('min-height', 'calc(100vh - ' + (headerHeight + footerHeight) + 'px)'); + } - /** - * Is password (only ASCII printable characters without space) - * - * @param pass password text - * @returns {boolean} true is yes - */ - static isPassword(pass = "") { - // ASCII printable characters, letters, digits, punctuation marks, and a few miscellaneous symbols. - // But without space. - const regex = /^[\x21-\x7E]{8,20}$/g; - return regex.test(pass); + /** + * Add message under the input tag with regex + * + * @param {string} [inputId=''] input tag id + * @param {string} [inputEId=''] input error message id with p tag + * @param {string} [regex=''] regex + * @param {string} [message=''] message + */ + static invalidInfo(inputId = '', inputEId = '', regex = '', message = '') { + const validInput = document.getElementById(inputId); + let inputEi = document.getElementById(inputEId); + if (!regex.test(validInput.value)) { + if (inputEi == null) { + inputEi = document.createElement('p'); + inputEi.setAttribute('id', inputEId); + inputEi.innerText = message; + validInput.parentNode.appendChild(inputEi); + } else { + inputEi.innerText = message; + } + } else { + if (inputEi != null) { + validInput.parentNode.removeChild(inputEi); + } } + } - /** - * Check repeat character - * - * @param text text - * @returns {number} repeat character number - */ - static checkRepeat(text = "") { - let count = 0; - for (let i = 0; i < text.length - 1; i++) { - if (text[i] === text[i + 1]) { - count++; - } - } - return count; - } + /** + * Calculator password quality + * + * @param {string} [pass=''] password text + * @returns {number} quality score + */ + static passQCalc(pass = '') { + let rankScore = 0; - /** - * Check character with regex - * - * @param text text - * @param regex regex - * @returns {number} If it is greater than 0, it is the number of regular strings - */ - static checkChar(text = "", regex = "") { - if (text.search(regex) >= 0) { - return text.match(regex).length; - } - return 0; - } + rankScore += (pass.length > 8) ? 4 : 0; + rankScore += (pass.length - checkChar(pass, /[a-z]/g)) * 2; + rankScore += (pass.length - checkChar(pass, /[A-Z]/g)) * 3; + rankScore += (pass.length - checkChar(pass, /[0-9]/g)) * 2; + rankScore += checkChar(pass, /((?=["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"])[^A-Za-z0-9])/g) * 6; - /** - * Is uppercase letter character - * - * @param text text - * @returns {boolean} true is has uppercase character - */ - static isUpperChar(text = "") { - const regex = /\p{Lu}+/gu; - return regex.match(text).length > 0; - } + rankScore -= checkChar(pass, /[A-Z]{3,}/g) * 2; + rankScore -= checkChar(pass, /[a-z]{3,}/g) * 2; + rankScore -= checkChar(pass, /[0-9]{3,}/g) * 2; + rankScore -= checkChar(pass, /["!\\\"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~"]{3,}/g) * 2; - /** - * Is lowercase letter character - * - * @param text text - * @returns {boolean} true is has lowercase character - */ - static isLowerChar(text = "") { - const regex = /\p{Ll}+/gu; - return regex.match(text).length > 0; - } + const rn = checkRepeat(pass); + rankScore -= rn * (rn - 1); - /** - * Is digit character - * - * @param text text - * @returns {boolean} true is has digit character - */ - static isDigit(text = "") { - const regex = /\p{Nd}+/gu; - return regex.match(text).length > 0; - } + return rankScore <= 0? 0: rankScore; + } - /** - * Is punctuation character - * - * @param text text - * @returns {boolean} true is has punctuation character - */ - static isPunctuation(text = "") { - const regex = /\p{P}+/gu; - return regex.match(text).length > 0; - } + /** + * Get element selector height + * + * @param selector element selector + * @returns {number} height + */ + static getSelectorHeight(selector) { + return getSelectorHeight(document, selector); + } - /** - * Is white space character - * - * @param text text - * @returns {boolean} true is has white space character - */ - static isWhiteSpace(text = "") { - const regex = /\s+/gu; - return regex.match(text).length > 0; - } + /** + * Get element selector height under parent node + * + * @param parentNode parent node + * @param selector element selector + * @returns {number} height, if selector height less then 0 return 0 + */ + static getSelectorHeight(parentNode, selector) { + const s = parentNode.querySelector(selector); + const sh = this._height(s); + return (sh < 0 ? 0 : sh); + } + + /** + * Has section tag + * + * @returns {boolean} true if find last section tag + */ + static hasSelectionHeight() { + return this.hasSelectionHeight(document) + } + + /** + * Has section tag under parent node + * + * @param parentNode parent node + * @returns {boolean} true if find last section tag + */ + static hasSelectionHeight(parentNode) { + const e = parentNode.getElementsByTagName("section")[0]; + const eh = this._height(e); + return !(eh < 0); + } + + /** + * Has article tag + * + * @returns {boolean} true if find last article tag + */ + static hasArticleHeight() { + return this.hasArticleHeight(document) + } - // window.btoa(""); // encode a string - // window.atob(""); // decode the string - - /** - * Decode Base64 to byte buffer - * - * @param base64 base64 text - * @returns {ArrayBufferLike} byte buffer - */ - static base64ToArrayBuffer(base64) { - const binaryString = window.atob(base64); - return this.stringToArrayBuffer(binaryString); + /** + * Has article tag under parent node + * + * @param parentNode parent node + * @returns {boolean} true if find last article tag + */ + static hasArticleHeight(parentNode) { + const e = parentNode.getElementsByTagName("article")[0]; + const eh = this._height(e); + return !(eh < 0); + } + + /** + * Is password (only ASCII printable characters without space) + * + * @param {string} [pass=""] password text, length is bewteen 8 to 20 + * @returns {boolean} true if text is password + */ + static isPassword(pass = "") { + // ASCII printable characters, letters, digits, punctuation marks, and a few miscellaneous symbols. + // But without space. + const regex = /^[\x21-\x7E]{8,20}$/g; + return regex.test(pass); + } + + /** + * Check repeat character + * + * @param {string} [text=""] text + * @returns {number} repeat character number + */ + static checkRepeat(text = "") { + let count = 0; + for (let i = 0; i < text.length - 1; i++) { + if (text[i] === text[i + 1]) { + count++; + } } + return count; + } - /** - * Encode byte buffer to Base64 - * - * @param arraybuffer byte buffer - * @returns {string} base64 text - */ - static arrayBufferToBase64(arraybuffer) { - const binary = this.arrayBufferToString(arraybuffer); - return window.btoa(binary); + /** + * Check character with regex + * + * @param {string} [text=""] text + * @param {string} [regex=""] regex + * @returns {number} If it is greater than 0, it is the number of regular strings + */ + static checkChar(text = "", regex = "") { + if (text.search(regex) >= 0) { + return text.match(regex).length; } + return 0; + } + + /** + * Is uppercase letter character + * + * @param {string} [text=""] text + * @returns {boolean} true is has uppercase character + */ + static isUpperChar(text = "") { + // A-Z + const regex = /\p{Lu}+/gu; + return regex.match(text).length > 0; + } + + /** + * Is lowercase letter character + * + * @param {string} [text=""] text + * @returns {boolean} true is has lowercase character + */ + static isLowerChar(text = "") { + // a-z + const regex = /\p{Ll}+/gu; + return regex.match(text).length > 0; + } - /** - * Convert string to byte buffer - * - * @param str string - * @returns {ArrayBufferLike} byte buffer - */ - static stringToArrayBuffer(str) { - const bytes = new Uint8Array(str.length); - for (let i = 0; i < str.length; i++) { - bytes[i] = str.charCodeAt(i); - } - return bytes.buffer; + /** + * Is digit character + * + * @param {string} [text=""] text + * @returns {boolean} true is has digit character + */ + static isDigit(text = "") { + // 0-9 + const regex = /\p{Nd}+/gu; + return regex.match(text).length > 0; + } + + /** + * Is punctuation character + * + * @param {string} [text=""] text + * @returns {boolean} true is has punctuation character + */ + static isPunctuation(text = "") { + // [\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E] + const regex = /\p{P}+/gu; + return regex.match(text).length > 0; + } + + /** + * Is white space character + * + * @param {string} [text=""] text + * @returns {boolean} true is has white space character + */ + static isWhiteSpace(text = "") { + // space tab + const regex = /\s+/gu; + return regex.match(text).length > 0; + } + + // window.btoa(""); // encode a string + // window.atob(""); // decode the string + + /** + * Decode Base64 to byte buffer + * + * @param {string} base64 base64 text + * @returns {ArrayBufferLike} byte buffer + */ + static base64ToArrayBuffer(base64) { + const binaryString = window.atob(base64); + return this.stringToArrayBuffer(binaryString); + } + + /** + * Encode byte buffer to Base64 + * + * @param arraybuffer byte buffer + * @returns {string} base64 text + */ + static arrayBufferToBase64(arraybuffer) { + const binary = this.arrayBufferToString(arraybuffer); + return window.btoa(binary); + } + + /** + * Convert string to byte buffer + * + * @param {string} str string + * @returns {ArrayBufferLike} byte buffer + */ + static stringToArrayBuffer(str) { + const bytes = new Uint8Array(str.length); + for (let i = 0; i < str.length; i++) { + bytes[i] = str.charCodeAt(i); } + return bytes.buffer; + } + + /** + * Convert byte buffer to string + * + * @param arraybuffer byte buffer + * @returns {string} string + */ + static arrayBufferToString(arraybuffer) { + return String.fromCharCode.apply(null, new Uint8Array(arraybuffer)); + } - /** - * Convert byte buffer to string - * - * @param arraybuffer byte buffer - * @returns {string} string - */ - static arrayBufferToString(arraybuffer) { - return String.fromCharCode.apply(null, new Uint8Array(arraybuffer)); + /** + * Get browser dark mode + * + * @returns {undefined} undefined is unsupported, true is dark mode, false is light mode + */ + static getDarkMode() { + let darkMode = undefined; + if (window.matchMedia('(prefers-color-scheme)').matches) { + darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; } + return darkMode; + } - /** - * Get browser dark mode - * - * @returns {undefined} undefined is unsupported, true is dark mode, false is light mode - */ - static getDarkMode() { - let darkMode = undefined; - if (window.matchMedia('(prefers-color-scheme)').matches) { - darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; - } - return darkMode; + /** + * Split content + * + * like + * @code test + * to + * @code test + * + * @param {string} [content=""] element content + * @param {string} [separator=""] content separator char + * @param {string} [splitTag=""] split tag name + * @returns {string} target html with splitTag tags + */ + static async splitContent(content = "", separator = "", splitTag = "") { + let target = ""; + if (splitTag.length < 1) { + return content; } + content.split(separator).forEach((s) => { + target += "<"+ splitTag + ">" + s + ""; + }); + return target; + } - /** - * Split animation element text - * - * like - * @code test - * to - * @code test - * - * @param animEleText animation element - * @returns target element with span and em tags - */ - static async splitAnimationElement(animEleText="") { - let target = ""; - animEleText.split("").forEach((s) => { - target += "" + s + ""; - }); - target += ""; - return target; + /** + * Split content with parity + * + * like + * @code test + * to + * @code test + * + * @param {string} [content=""] element content + * @param {string} [separator=""] content separator char + * @param {string} [splitTag=""] split tag name + * @param {string} [evenClass=""] even tag class name + * @param {string} [oddClass=""] odd tag class name + * @returns {string} target html with splitTag tags + */ + static async splitContentWithParity(content = "", separator = "", splitTag = "", evenClass = "", oddClass = "") { + let target = ""; + if (splitTag == "") { + return content; } + const evenAttr = (evenClass == "")? "": " class=\"" + evenClass + "\""; + const oddAttr = (oddClass == "")? "": " class=\"" + oddClass + "\""; + var i = 0; + content.split(separator).forEach((e) => { + target += "<"+ splitTag + ((i%2 == 0)? evenAttr: oddAttr) + ">" + e + ""; + i++; + }); + return target; + } }