diff --git a/index.html b/index.html index dd72cdd..9b79b3d 100644 --- a/index.html +++ b/index.html @@ -223,77 +223,125 @@ } return outputString; } + var charIterateState; + const surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; function charIterate(input) { - if (charIterateState == undefined) { - charIterateState = 0; - } else { - if (charIterateState < (input.length - 1)) { - charIterateState++; - } else { - charIterateState = 0; + let stringLength = (input.length - 1); + let temp = input.split(''); + for (let i = 0; i < stringLength; ++i) { + let compareString = temp.join(""); + let stringEval = undefined, stringEvalIndex = undefined; + while ((stringEval = surrogatePairs.exec(compareString)) !== null) { + stringEvalIndex = stringEval.index; + console.log("emoji is at index", stringEvalIndex); } - } - console.log(charIterateState, input.charAt(charIterateState)); - return charIterateState; + if (stringEvalIndex == i) { + stringLength--; + temp.splice(i, 1); + console.log("Decreasing stringLength variable to", stringLength); + } + } + if (charIterateState == undefined) { + //console.log("undefined! setting to zero"); + charIterateState = 0; + } else { + if (charIterateState < stringLength) { + charIterateState++; + } else { + charIterateState = 0; } + } + //console.log(charIterateState, fixedCharAt(input, charIterateState)); + return charIterateState; + } function design5(input) { + charIterateState = undefined; let outputString = ""; let outputLine = ""; let radius = (input.length); let mid = radius; if (mid % 2 == 1) { var spaceOffset = " "; - } else { - var spaceOffset = ""; - } - console.log(radius, mid); - // dist represents distance to the center - let dist = parseFloat(0); - let space = "" - for (let i = 0; i < (input.length / 2); ++i) { - space += " "; - } - // for horizontal movement - var i; - var j; - let lineHasInput = false; - for (i = 0; i <= 2 * radius; i++) { - lineHasInput = false; - if (Math.trunc(i) != mid) { - // for vertical movement - for (j = 0; j <= 2 * radius; j++) { - dist = Math.sqrt( - ((i - radius) * (i - radius) * 4) + // (* 4) accounts for the offset between lines - (j - radius) * (j - radius) - ); - //console.log(i, j, radius, dist); - // dist should be in the range (radius - 0.5) - // and (radius + 0.5) to print stars(*) - - - if (dist > radius - 1 && dist < radius + 1) { //&& dist > radius - 1 - lineHasInput = true; - outputLine += input.charAt(charIterate(input)); - } else { - outputLine += " "; - } - } - } else { - lineHasInput = true; - outputLine += input.charAt(charIterate(input)) + space + input + space + spaceOffset + input.charAt(charIterate(input)); - } - - //console.log(i, j, outputLine); - if (lineHasInput) { - console.log("outputLine", outputLine); - outputString += outputLine + "
"; - } - outputLine = ""; - } - return outputString; + } else { + var spaceOffset = ""; } + console.log(radius, mid); + // dist represents distance to the center + let dist = parseFloat(0); + let space = "" + for (let i = 0; i < (input.length / 2); ++i) { + space += " "; + } + // for horizontal movement + var i; + var j; + let lineHasInput = false; + for (i = 0; i <= 2 * radius; i++) { + lineHasInput = false; + if (Math.trunc(i) != mid) { + // for vertical movement + for (j = 0; j <= 2 * radius; j++) { + dist = Math.sqrt( + ((i - radius) * (i - radius) * 4) + // (* 4) accounts for the offset between lines + (j - radius) * (j - radius) + ); + //console.log(i, j, radius, dist); + // dist should be in the range (radius - 0.5) + // and (radius + 0.5) to print stars(*) + + + if (dist > radius - 1 && dist < radius + 1) { //&& dist > radius - 1 + lineHasInput = true; + outputLine += "" + fixedCharAt(input, charIterate(input)); //zero-width space + } else { + outputLine += " "; + } + } + } else { + lineHasInput = true; + outputLine += fixedCharAt(input, charIterate(input)) + space + input + space + spaceOffset + fixedCharAt(input, charIterate(input)); + } + + //console.log(i, j, outputLine); + if (lineHasInput) { + outputString += outputLine + "
"; + } + outputLine = ""; + } + return outputString; + } + + // Code from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt + + function fixedCharAt(str, idx) { + str = String(str); + + //const surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + while (surrogatePairs.exec(str) !== null) { + const lastIdx = surrogatePairs.lastIndex; + if (lastIdx - 2 < idx) { + idx++; + } else { + break; + } + } + + if (idx >= str.length || idx < 0) { + return ""; + } + + let ret = str.charAt(idx); + if ( + /[\uD800-\uDBFF]/.test(ret) && + /[\uDC00-\uDFFF]/.test(str.charAt(idx + 1)) + ) { + // Go one further, since one of the "characters" is part of a surrogate pair + ret += str.charAt(idx + 1); + } + return ret; + }

My RiiTag