<!doctype html>
<html>
<head>
<title>Circular Text or Emoji - RJM Programming - December, 2018 ... Thanks to https://appendto.com/2016/09/how-to-make-circularcurved-text-with-javascript/</title>
<meta charset="utf-8">
<script type='text/javascript'>

var rad=100, radbit='', deg=360, it=[];

if (!String.fromCodePoint) { // thanks to http://xahlee.info/js/js_unicode_code_point.html
// ES6 Unicode Shims 0.1 , © 2012 Steven Levithan , MIT License
String.fromCodePoint = function fromCodePoint () {
var chars = [], point, offset, units, i;
for (i = 0; i < arguments.length; ++i) {
point = arguments[i];
offset = point - 0x10000;
units = point > 0xFFFF ? [0xD800 + (offset >> 10), 0xDC00 + (offset & 0x3FF)] : [point];
chars.push(String.fromCharCode.apply(null, units));
}
return chars.join("");
}
}

// parseInt("hex",16);


// https://appendto.com/2016/09/how-to-make-circularcurved-text-with-javascript/
function circularText(intxt, radius, arcd) {
var txt=[], etxt=[], one=1, isemoji=false, kk=0, kkk=0, zero=0, ishex=false, dtxt=[], dectxt='', lu='', tprefix='';
//alert(intxt);
if (intxt.replace(/\&\;/g,'&').indexOf('&#') != -1 && intxt.indexOf(';') != -1) {
etxt=justinnertextish(intxt,true).replace(/\&\;/g,'&').replace(/\;\&\#/g,',').split('&#');
//alert(etxt[0]);
for (var k=0; k<etxt.length; k+=one) {
if (!isemoji) {
if (etxt[k].substring(zero).length > 1 && etxt[k].substring(zero).substring(0,1).charCodeAt(0) > 255) {
while (zero < etxt[k].length && etxt[k].substring(zero).length > 1 && etxt[k].substring(zero).substring(0,1).charCodeAt(0) > 255) {
//alert(etxt[k].substring(zero).substring(0,1).charCodeAt(0)) + ' ' + eval('' + etxt[k].substring(zero).substring(1).charCodeAt(0));
txt.push(String.fromCodePoint(eval('' + etxt[k].substring(zero).substring(0,1).charCodeAt(0)),eval('' + etxt[k].substring(zero).substring(1).charCodeAt(0)) ));
zero+=2;
}
}
//if (zero != 0) { alert('' + zero + ' ' + etxt[k].substring(zero) + '! k=' + k + ' and etxt.length=' + etxt.length + ' ... ' + intxt.replace(/\;\&\#/g,',')); }
one=1;
for (kk=zero; kk<etxt[k].length; kk+=one) {
if (etxt[k].substring(kk, eval(1 + kk)).charCodeAt(0) > 255) {
txt.push(String.fromCodePoint(eval('' + etxt[k].substring(kk).charCodeAt(0)),eval('' + etxt[k].substring(kk).substring(1).charCodeAt(0)) ));
one=2;
} else {
txt.push(tprefix + etxt[k].substring(kk, eval(1 + kk)));
one=1;
tprefix='';
}
}
one=1;
zero=0;
isemoji=true;
} else {

if (ishex || etxt[k].split(';')[0].toLowerCase().replace('x','a').replace('b','a').replace('c','a').replace('d','a').replace('e','a').replace('f','a').indexOf('a') != -1) {
ishex=true;
dtxt=etxt[k].split(';')[0].split(',');
dectxt='' + parseInt(dtxt[0].replace('x','').replace('X',''),16);
lu=dtxt[0];
for (kkk=1; kkk<dtxt.length; kkk++) {
dectxt+=',' + parseInt(dtxt[kkk].replace('x','').replace('X',''),16);
lu=dtxt[kkk];
}
eval("txt.push(String.fromCodePoint(" + dectxt + "))");
} else {
eval("txt.push(String.fromCodePoint(" + etxt[k].split(';')[0].replace(/x/g,'').replace(/X/g,'') + "))");
}
zero=eval(1 + eval('' + etxt[k].split(';')[0].length));
//if (zero != 0) { alert('' + zero + ' ' + etxt[k].substring(zero) + '! k=' + k + ' and etxt.length=' + etxt.length + ' ... ' + intxt.replace(/\;\&\#/g,',')); }
if ((etxt[k] + '&').substring(kk, eval(1 + kk)) != '&'.substring(0,1)) {
if (intxt.split(lu + ';')[1].length > 1 && intxt.split(lu + ';')[1].substring(0,1).charCodeAt(0) > 255) {
//alert('' + String.fromCodePoint(eval('' + intxt.split(lu + ';')[1].substring(0,1).charCodeAt(0))) + ' ' + intxt.split(lu + ';')[1].substring(0,1).charCodeAt(0) + ' ' + intxt.split(lu + ';')[1].substring(1).charCodeAt(0) + ' ' + etxt[k].substring(kk));
//txt.push(etxt[k].substring(kk));
txt.push(String.fromCodePoint(eval('' + intxt.split(lu + ';')[1].substring(0,1).charCodeAt(0)),eval('' + intxt.split(lu + ';')[1].substring(1).charCodeAt(0)) ));
} else {
//alert(intxt.split(lu + ';')[1] + ' ' + intxt.split(lu + ';')[1].length + ' ' + intxt.split(lu + ';')[1].substring(0,1).charCodeAt(0));
one=1;
for (kk=zero; kk<etxt[k].length; kk+=one) {
if (etxt[k].substring(kk, eval(1 + kk)).charCodeAt(0) > 255) {
txt.push(String.fromCodePoint(eval('' + etxt[k].substring(kk).charCodeAt(0)),eval('' + etxt[k].substring(kk).substring(1).charCodeAt(0)) ));
one=2;
} else {
txt.push(tprefix + etxt[k].substring(kk, eval(1 + kk)));
one=1;
tprefix='';
}
}
}
one=1;
zero=0;
} else {
isemoji=false;
}
}
}
} else {
txt = justinnertextish(intxt,false).split("");
}
var deg = arcd / txt.length, origin = 0, j = 0;

while (eval('' + origin) < arcd) {
if (txt.length > j) {
//if (it[j] != '') { alert(it[j]); }
document.getElementById('test').innerHTML+="<p style='height:" + radius + "px;position:absolute;transform:rotate(" + origin + "deg);transform-origin:0 100%'>" + txt[j] + it[j] + "</p>";
}
origin += deg;
j++;
}
//alert(it[11]);

}

function justinnertextish(intx, within) {
var sone=1, tagis='', iit=0, less=false, ioffset=0;
outx=intx;
it=[];
if (intx.indexOf('</') != -1) {
outx="";
for (iit=0; iit<intx.length; iit+=sone) {
if (intx.substring(iit, eval(1 + iit)) == '<') {
tagis=intx.substring(iit).substring(1).split('>')[0];
less=false;
if (tagis.indexOf(' ') != -1 || within) {
less=true;
//document.getElementById('atend').style.display='block';
//document.getElementById('atend').style.backgroundColor='#c0d0f0'; //'transparent';
document.getElementById('atend').innerHTML='<' + tagis + '>' + intx.substring(eval(iit + 2 + tagis.length)).split('>')[0] + '>';
//alert('<' + tagis + '>' + intx.substring(eval(iit + 2 + tagis.length)).split('>')[0] + '>');
it[Math.max(0,eval(-1 + it.length))]+='<' + tagis + '>' + intx.substring(eval(iit + 2 + tagis.length)).split('>')[0] + '>';
if (it[Math.max(0,eval(-1 + it.length))] != ('<' + tagis + '>' + intx.substring(eval(iit + 2 + tagis.length)).split('>')[0] + '>')) {
ioffset=eval(it[Math.max(0,eval(-1 + it.length))].length - ('<' + tagis + '>' + intx.substring(eval(iit + 2 + tagis.length)).split('>')[0] + '>').length);
less=false;
}
} else if (tagis.toLowerCase().replace('br','b').replace('i','b') == 'b') {
less=false;
it[Math.max(0,eval(-1 + it.length))]='<' + tagis + '>';
} else {
less=false;
it[Math.max(0,eval(-1 + it.length))]='<' + tagis + '>' + intx.substring(eval(iit + 2 + tagis.length)).split('>')[0] + '>';
}
sone=eval(ioffset + it[Math.max(0,eval(-1 + it.length))].length);
if (ioffset != 0) {
it[Math.max(0,eval(-1 + it.length))]=it[Math.max(0,eval(-1 + it.length))].substring(0,Math.abs(ioffset));
}
ioffset=0;
//if (sone != 1) { alert('' + Math.max(0,eval(-1 + it.length)) + ' ' + it[Math.max(0,eval(-1 + it.length))] + ' ... ' + less); }
if (less) { it[Math.max(0,eval(-1 + it.length))]=""; }
//alert(sone);
} else {
it.push("");
outx+=intx.substring(iit, eval(1 + iit));
sone=1;
}
}
} else {
it=intx.split("");
for (iit=0; iit<it.length; iit++) {
it[iit]="";
}
}
return outx;
}

//circularText("this text is in a circle ", 100, 0);

function onl() {
var textis=location.search.split('text=')[1] ? decodeURIComponent(location.search.split('text=')[1].split('&')[0]) : '';
deg=location.search.split('degrees=')[1] ? eval(decodeURIComponent(location.search.split('degrees=')[1].split('&')[0])) : deg;
var crad=location.search.split('radius=')[1] ? decodeURIComponent(location.search.split('radius=')[1].split('&')[0]) : '' + rad;
if (crad != ('' + rad)) {
if (crad.indexOf('.') != -1) {
deg=eval(crad.split('.')[1]);
rad=eval(crad.split('.')[0]);
} else {
rad=eval(crad);
}
}
if (('' + rad) != '100' || ('' + deg) != '360') { radbit='radius=' + encodeURIComponent('' + rad + '.' + deg) + '&'; document.getElementById('irad').value='' + rad; document.getElementById('ideg').value='' + deg; }
if (textis == '') {
circularText("this text is in a circle &#x1f34d; &#x1f34c; ", rad, deg);
} else {
//document.getElementById('inp').value=textis; //.replace(/\&\#/g,'&#');
//alert(textis);
circularText(textis, rad, deg);
document.getElementById('inp').value=textis.replace(/\&\#/g,'&#');
}
var rect=document.getElementById('test').getBoundingClientRect();
//alert('' + rect.left + ',' + rect.top + ' ... ' + rect.width + ',' + rect.height);
document.getElementById('atend').style.position='absolute';
document.getElementById('atend').style.left=eval(-rad + 20 + rect.left) + 'px';
document.getElementById('atend').style.top=eval(38 + rect.top) + 'px';
document.getElementById('atend').style.width=eval(2 * rad - 38) + 'px';
document.getElementById('atend').style.height=eval(2 * rad - 38) + 'px';
//document.getElementById('atend').innerHTML='X';
document.getElementById('atend').style.borderRadius=eval(2 * rad - 28) + 'px';
if (document.getElementById('atend').innerHTML != '') { document.getElementById('atend').style.backgroundColor='#c0d0f0'; } //'transparent';
//document.getElementById('atend').style.display='none';
}

function placethis(oi) {
if (oi.value == '') {
oi.value=oi.placeholder;
} else {
location.href=document.URL.split('#')[0].split('?')[0] + '?' + radbit + 'text=' + encodeURIComponent(oi.value.replace(/\&\#/g,'&#'));
}
}

</script>
</head>
<body onload='onl();'>
<h1>Circular Text or Emoji or <a target=_blank title='Analogue Clock' href='https://www.rjmprogramming.com.au/HTMLCSS/circular_text.html?radius=320.360&text=1%3Cspan%3E2%3C%2Fspan%3E1234567891%3Cspan%3E0%3C%2Fspan%3E1%3Cspan%3E1%3C%2Fspan%3E%3Ciframe%20frameborder%3D0%20style%3D%27z-index%3A23%3Bmargin-left%3A127px%3Bmargin-top%3A130px%3Bheight%3A400px%3B%27%20src%3Danalogue_clock.htm%23xbody%3E%3C%2Fiframe%3E'>Analogue Clock</a></h1>
<h3>RJM Programming - December, 2018 ... Thanks to <a target=_blank title='Usefulk link, thanks' href='https://appendto.com/2016/09/how-to-make-circularcurved-text-with-javascript/'>https://appendto.com/2016/09/how-to-make-circularcurved-text-with-javascript/</a></h3>
Your text (on circle radius <input style='width:5%;' id=irad title=pixels type=number onchange="rad=eval(this.value); radbit='radius=' + encodeURIComponent('' + rad + '.' + deg) + '&'; " value=100 min=1 max=2000></input><input style='width:5%;' title=degrees id=ideg type=number onchange="deg=eval(this.value); radbit='radius=' + encodeURIComponent('' + rad + '.' + deg) + '&'; " value=360 min=1 max=360></input> arc): <input id=inp onblur=placethis(this); type=text style='width:50%;' placeholder="this text is in a circle &#x1f34d; &#x1f34c;"></input>

<div class="container" style="text-align: center; ">
<!--the holders for the text, reuse as desired-->
<div class="circTxt" id="test" style="display: inline-block; margin-bottom: 128px; "></div>
</div>

<input type=text style="position:absolute;top:-200px;left:-200px;" value=""></input>
<div id=atend></div>
</body>
</html>