//################################################################################
// create_append_paragraph
// output_markdown, output_paragraph
//################################################################################
#include <stdio.h>
#include <stdlib.h>
#include "markdown.h"
//################################################################################
// string utilities
//################################################################################
inline int is_chars(int mychar,const char* chars)
{
return strchr(chars,mychar)!=NULL;
}
inline int is_same_char_line(MyTSchar& buffer,int start,int end,
int allow_spaces,int min_chars)
{
int num_chars=1;
for(int i=start+1;i<=end;i++){
if(is_chars(buffer[i]," \t")){
if(allow_spaces==0) return 0;
} else if(buffer[i]!=buffer[start]){
return 0;
} else {
num_chars++;
}
}
if(num_chars>=min_chars) return 1;
else return 0;
}
inline int num_same_char_line_prefix(MyTSchar& buffer,int start,int end,
int allow_spaces)
{
int num_chars=1;
for(int i=start+1;i<=end;i++){
if(is_chars(buffer[i],Unicode_space_g_)){
if(allow_spaces==0) break;
} else if(buffer[i]!=buffer[start]){
break;
} else {
num_chars++;
}
}
return num_chars;
}
inline int link_label_name(MyTSchar& buffer,int startB,MyTSchar& name)
{
int start=-1,end=-1;
for(int i=startB;i<buffer.num();i++){
if(is_chars(buffer[i]," \t\r\n")){
// nothing
} else if(is_chars(buffer[i],"\n")){
if(start==-1) return 0;
} else if(is_chars(buffer[i],"[")){
if(start==-1) start=i+1;
else return 0;
} else if(is_chars(buffer[i],"]")){
if(start==-1) return 0;
end=i-1;
break;
} else if(is_chars(buffer[i],"\\")){
if(start==-1) return 0;
i++;
} else {
if(start==-1) return 0;
}
}
if(start==-1 || end==-1) return 0;
name.setV(&buffer[start],end-start+1);
return end+2;
}
inline void link_normalize(MyTSchar& name)
{
while(name.num() && is_chars(name[0],ASCII_space_g_)){
name.clear(0);
}
while(name.num() && is_chars(name[end_MTS],ASCII_space_g_)){
name.clear(end_MTS);
}
int space0=-1;
for(int pos=0;pos<name.num();pos++){
if(is_chars(name[pos],ASCII_space_g_)){
if(space0==-1){
name[pos]=' ';
space0=pos;
} else {
name.clear(pos);
pos--;
}
} else {
space0=-1;
}
}
Tcl_UtfToLower(name.v());
}
inline int link_text(MyTSchar& buffer,int startB,MyTSchar& text)
{
int start=-1,end=-1,num_brackets=0;
for(int i=startB;i<buffer.num();i++){
if(is_chars(buffer[i]," \t\r\n")){
// nothing
} else if(is_chars(buffer[i],"\n")){
if(start==-1) return 0;
} else if(is_chars(buffer[i],"[")){
if(start==-1) start=i+1;
else num_brackets++;
} else if(is_chars(buffer[i],"]")){
if(start==-1) return 0;
else if(num_brackets){
num_brackets--;
} else {
end=i-1;
break;
}
} else if(is_chars(buffer[i],"\\")){
if(start==-1) return 0;
i++;
} else {
if(start==-1) return 0;
}
}
if(start==-1 || end==-1) return 0;
text.setV(&buffer[start],end-start+1);
return end+2;
}
inline int link_destination(MyTSchar& buffer,int startB,MyTSchar& url)
{
int start=-1,end=-1,num_endlines=0,smaller_than=0,parentheses=0;
for(int i=startB;i<buffer.num();i++){
if(is_chars(buffer[i]," \t\r")){
if(start!=-1 && smaller_than==0){
if(parentheses) return 0;
end=i-1;
break;
}
} else if(is_chars(buffer[i],"\n")){
if(start==-1){
num_endlines++;
if(num_endlines>1) return 0;
} else if(smaller_than==0){
if(parentheses) return 0;
end=i-1;
break;
} else {
return 0;
}
} else if(is_chars(buffer[i],"<")){
if(start==-1){
start=i+1;
smaller_than=1;
} else if(smaller_than>0){
return 0;
}
} else if(is_chars(buffer[i],">")){
if(smaller_than>0){
end=i-1;
break;
}
if(start==-1) start=i;
} else if(is_chars(buffer[i],"(")){
parentheses++;
if(start==-1) start=i;
} else if(is_chars(buffer[i],")")){
parentheses--;
if(start==-1) start=i;
} else if(is_chars(buffer[i],"\\")){
if(start==-1) start=i;
i++;
} else {
if(start==-1) start=i;
}
}
if(start==-1) return 0;
if(smaller_than && end==-1) return 0;
if(end==-1) end=buffer.num()-1;
url.setV(&buffer[start],end-start+1);
if(smaller_than) return end+2;
else return end+1;
}
inline int link_title(MyTSchar& buffer,int startB,MyTSchar& title)
{
int start=-1,end=-1,num_spaces=0,num_non_spaces=0,num_endlines=0,num_enlinesA=0;
char openC;
for(int i=startB;i<buffer.num();i++){
if(is_chars(buffer[i]," \t\r")){
if(start==-1) num_spaces++;
} else if(is_chars(buffer[i],"\n")){
if(start==-1){
num_spaces++;
num_endlines++;
if(num_endlines>1) return 0;
} else {
if(num_non_spaces==0) return 0;
num_non_spaces=0;
}
} else if(is_chars(buffer[i],"\"'")){
if(start==-1){
if(num_spaces==0) return 0;
openC=buffer[i];
start=i+1;
num_non_spaces++;
} else if(buffer[i]==openC){
end=i-1;
break;
} else {
num_non_spaces++;
}
} else if(is_chars(buffer[i],"(")){
if(start==-1){
if(num_spaces==0) return 0;
openC=buffer[i];
start=i+1;
} else if(openC=='('){
return 0;
} else {
num_non_spaces++;
}
} else if(is_chars(buffer[i],")")){
if(start==-1){
return 0;
} else if(openC=='('){
end=i-1;
break;
} else {
num_non_spaces++;
}
} else if(is_chars(buffer[i],"\\")){
if(start==-1) return 0;
num_non_spaces++;
i++;
} else {
if(start==-1) return 0;
num_non_spaces++;
}
}
if(start==-1 || end==-1) return 0;
title.setV(&buffer[start],end-start+1);
title.regsub(0,"\\\\\"","\"");
return end+2;
}
inline int spaces_num(MyTSchar& buffer,int start,int* num_spaces=NULL)
{
if(num_spaces) (*num_spaces)=0;
for(int i=start;i<buffer.num();i++){
if(is_chars(buffer[i]," ")){
if(num_spaces) (*num_spaces)++;
} else if(is_chars(buffer[i],"\t")){
if(num_spaces) (*num_spaces)+=4;
} else if(is_chars(buffer[i],"\r\n")){
return i;
} else {
return i;
}
}
return buffer.num();
}
inline int incr_chars(MyTSchar& buffer,int start,int num,int* num_spaces=NULL,
int* num_increased=NULL)
{
if(num_spaces) (*num_spaces)=0;
if(num_increased) (*num_increased)=0;
if(num==0) return start;
int num_chars=0;
for(int i=start;i<buffer.num();i++){
if(is_chars(buffer[i]," ")){
if(num_spaces) (*num_spaces)++;
num_chars++;
} else if(is_chars(buffer[i],"\t")){
if(num_chars+4>num){
int len=0;
for(int j=i-1;j>=0;j--){
if(buffer[j]!='\n') len++;
else break;
}
int delta=4-len%4;
buffer.clear(i);
buffer.insertV(i," ",delta);
if(num_increased) (*num_increased)+=delta-1;
if(num_spaces) (*num_spaces)++;
num_chars++;
} else {
if(num_spaces) (*num_spaces)+=4;
num_chars+=4;
}
} else if(is_chars(buffer[i],"\r\n")){
if(num_spaces) (*num_spaces)++;
num_chars++;
} else {
num_chars++;
}
if(num_chars>=num){
return i+1;
}
}
return buffer.num();
}
static int find_closing_delimiterExact(MyTSchar& buffer,int start,int end,char c,
int num)
{
for(int i=start;i<=end;i++){
if(buffer[i]==c){
int nReal=num_same_char_line_prefix(buffer,i,end,0);
if(nReal!=num){
i+=nReal;
continue;
}
return i;
}
}
return -1;
}
static int find_closing_delimiter(MyTSchar& buffer,int start,int end,char c,int num)
{
for(int i=start;i<=end;i++){
if(buffer[i]==c){
int nMax=num_same_char_line_prefix(buffer,i,end,0);
if(nMax<num) continue;
return i;
}
}
return -1;
}
static int find_closing_delimiterEM(MyTSchar& buffer,int start,int end,char c,int num)
{
for(int i=start;i<=end;i++){
if(buffer[i]==c){
int nMax=num_same_char_line_prefix(buffer,i,end,0);
if(nMax<num) continue;
if(is_chars(buffer[i-1],ASCII_space_g_)) continue;
if(is_chars(buffer[i-1],ASCII_punctuation_g_)){
if(i+num<=end && !is_chars(buffer[i+num],ASCII_punctuation_SP_g_)){
continue;
}
}
if(buffer[i-1]==buffer[i]){
continue;
}
if(i+num<=end && buffer[i]=='_' &&
!is_chars(buffer[i+num],Unicode_space_g_) &&
!is_chars(buffer[i+num],ASCII_punctuation_SP_g_)){
continue;
}
return i;
}
}
return -1;
}
static int is_raw_html(MyTSchar& buffer,int start,int end)
{
const char* ma[6]; int mL[6];
if(string_regexp(buffer.v(),start,end+1,"^</?[a-zA-Z][-\\w]*(?:[ \t]([^>]*)>|>)",ma,mL,1)){
return ma[0]+mL[0]-1-buffer.v();
} else if(string_regexp(buffer.v(),start,end+1,"^<!--.*?-->",ma,mL,1)){
return ma[0]+mL[0]-1-buffer.v();
} else if(string_regexp(buffer.v(),start,end+1,"^<\\?[^>]*\\?>",ma,mL,1)){
return ma[0]+mL[0]-1-buffer.v();
} else if(string_regexp(buffer.v(),start,end+1,"^<![^>]*>",ma,mL,1)){
return ma[0]+mL[0]-1-buffer.v();
} else if(string_regexp(buffer.v(),start,end+1,"^<!\\[CDATA\\[.*\\]\\]>",ma,mL,1)){
return ma[0]+mL[0]-1-buffer.v();
}
return -1;
}
static int is_autolink(MyTSchar& buffer,int start,int end)
{
const char* ma[1]; int mL[1];
const char* rex="^<\\w[-+.\\w]{1,31}:[^\\s<>]*>";
if(string_regexp(buffer.v(),start,end+1,rex,ma,mL,1)==0) return -1;
return ma[0]+mL[0]-1-buffer.v();
}
inline void output_quoted_char(MyTSchar& out,char c)
{
switch(c){
case '<': out.printE("<"); break;
case '>': out.printE(">"); break;
case '&': out.printE("&"); break;
case '"': out.printE("""); break;
default: out.printE("%c",c); break;
}
}
void MKstate::output_quoted_string_nobackslash(MyTSchar& buffer,MyTSchar& out,
int start,int end)
{
for(int i=start;i<=end;i++){
int pos=this->entities_json_to_c(buffer,out,i);
if(pos!=-1){
i=pos;
continue;
}
output_quoted_char(out,buffer[i]);
}
}
void MKstate::output_quoted_string_code_span(MyTSchar& buffer,MyTSchar& out,
int start,int end)
{
for(int i=start;i<=end;i++){
char c=buffer[i];
if(c=='\n') c=' ';
if((i==start || i==end) && is_chars(buffer[start]," \n") &&
is_chars(buffer[end]," \n") &&
string_regexp(buffer.v(),start,end+1,"^\\s+$")==0){
continue;
}
output_quoted_char(out,c);
}
}
inline void output_quoted_string(MyTSchar& out,const char* c)
{
while(*c!='\0'){
if(*c=='\\' && is_chars(*(c+1),ASCII_punctuation_g_)){
c++;
}
output_quoted_char(out,*c);
c++;
}
}
inline void replace_backslash(MyTSchar& out)
{
for(int i=0;i<out.num();i++){
if(out[i]=='\\' && is_chars(out[i+1],ASCII_punctuation_g_)){
out.clear(i);
i--;
}
}
}
inline void output_url_encoded_stringDo(MyTSchar& buffer,MyTSchar& out,
int start,int end)
{
for(int i=start;i<=end;i++){
switch(buffer[i]){
case ' ': output_quoted_string(out,"%20"); break;
case '\\': output_quoted_string(out,"%5C"); break;
case '%': output_quoted_string(out,"%25"); break;
case '`': output_quoted_string(out,"%60"); break;
default:
{
if(buffer[i]<33){
MyTSchar value("%%%02X",unsigned char(buffer[i]));
output_quoted_string(out,value.v()); break;
} else {
output_quoted_char(out,buffer[i]);
}
}
break;
}
}
}
void MKstate::output_url_encoded_string(MyTSchar& buffer,MyTSchar& out,
int start,int end)
{
for(int i=start;i<=end;i++){
MyTSchar outL;
int pos=this->entities_json_to_c(buffer,outL,i);
if(pos!=-1){
output_url_encoded_stringDo(outL,out,0,outL.num()-1);
i=pos;
continue;
}
output_url_encoded_stringDo(buffer,out,i,i);
}
}
int MKstate::entities_json_to_c(MyTSchar& buffer,MyTSchar& out,int start)
{
Tcl_Obj* bufptr=NULL;
if(!is_setup_entities_json_to_c_){
this->setup_entities_json_to_c();
}
MyTSchar matches[3]; int match0;
if(buffer.regexp(start,"^&#([xX]?)(\\w{1,7});",matches,3,0,match0)){
if(matches[2].num()==0) return -1;
if(matches[1].num()){
matches[2].insertV(0,"0x",-1);
}
char* end;
int ivalue=strtol(matches[2].v(),&end,0);
if(*end!='\0') return -1;
if(ivalue==0){
// this is Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
out.printE("\xEF\xBF\xBD");
return match0+matches[0].num()-1;
}
bufptr=Tcl_ObjPrintf("\\u%04x",ivalue);
} else if(buffer.regexp(start,"^&[^\\s;]+;",matches,1,0,match0)){
const char* value=entities_json_to_c_.get(matches[0].v());
if(!value) return -1;
bufptr=Tcl_NewStringObj(value,-1);
} else {
return -1;
}
Tcl_IncrRefCount(bufptr);
if(!ip_){
ip_=Tcl_CreateInterp();
}
Tcl_Obj* resPtr=Tcl_SubstObj(ip_,bufptr,TCL_SUBST_BACKSLASHES);
if(strcmp(Tcl_GetString(resPtr),"&")==0){
out.printE("&");
} else if(strcmp(Tcl_GetString(resPtr),"\"")==0){
out.printE(""");
} else if(strcmp(Tcl_GetString(resPtr),"<")==0){
out.printE("<");
} else if(strcmp(Tcl_GetString(resPtr),">")==0){
out.printE(">");
} else {
out.printE("%s",Tcl_GetString(resPtr));
}
Tcl_DecrRefCount(resPtr);
//Tcl_DecrRefCount(bufptr);
return match0+matches[0].num()-1;
}
//################################################################################
// MKblocks
//################################################################################
void MKblocks::nprint(int iblock,MyTSvec<MKblocks,100>& blocks,
MyTSchar& buffer,MyTSchar& deb)
{
MyTSchar tmp;
deb.printE("<block n='%d' p='%d' type='%s' blanks='%d %d' level='%d' "
"tight='%d'>\n",iblock,parent_,MarkdownStates_g_[int(mtype_)],blanks_[0],
blanks_[1],level_,tight_);
if(posNoBlank_[0]>pos_[0]){
tmp.setV(&buffer[pos_[0]],posNoBlank_[0]-pos_[0]);
string_quote_xml(tmp);
tmp.regsub(0,"\\n","\\\\n");
} else {
tmp.clear();
}
deb.printE("<t0>%s</t0>\n",tmp.v());
if(posNoBlank_[0]>=0 && posNoBlank_[1]>=posNoBlank_[0]){
tmp.setV(&buffer[posNoBlank_[0]],posNoBlank_[1]-posNoBlank_[0]+1);
string_quote_xml(tmp);
tmp.regsub(0,"\\n","\\\\n");
} else {
tmp.clear();
}
deb.printE("<t>%s</t>\n",tmp.v());
if(posNoBlank_[1]<buffer.num()-1){
tmp.setV(&buffer[posNoBlank_[1]+1],pos_[1]-posNoBlank_[1]);
string_quote_xml(tmp);
tmp.regsub(0,"\\n","\\\\n");
} else {
tmp.clear();
}
deb.printE("<t1>%s</t1>\n",tmp.v());
deb.printE("<pos>%d,%d</pos> <posN>%d,%d</posN>\n",pos_[0],pos_[1],
posNoBlank_[0],posNoBlank_[1]);
for(int i=0;i<children_.num();i++){
blocks[children_[i]].nprint(children_[i],blocks,buffer,deb);
}
deb.printE("</block>\n");
}
//################################################################################
// MKstate
//################################################################################
int MKstate::list_item_level_prefix(MyTSchar& buffer,int ibox)
{
MyTSchar matches[1];
int num_prefix=0;
while(ibox!=0){
if(blocks_[ibox].mtype_==MK::list_item){
MKblocks& block=blocks_[ibox];
buffer.regexp(block.pos_[0],"^\\s*([-+*]|\\d{1,9}[.\\)])\\s*",matches,1);
num_prefix+=matches[0].num();
}
ibox=blocks_[ibox].parent_;
}
return num_prefix;
}
int MKstate::give_prev(int iblock)
{
MKblocks& block=blocks_[blocks_[iblock].parent_];
int ipos=block.children_.isin_pos(iblock);
if(ipos>0) return block.children_[ipos-1];
return -1;
}
int MKstate::give_next(int iblock)
{
MKblocks& block=blocks_[blocks_[iblock].parent_];
int ipos=block.children_.isin_pos(iblock);
if(ipos<block.children_.num()-1) return block.children_[ipos+1];
return -1;
}
void MKstate::create_append_paragraph(MyTSchar& buffer,int current_level)
{
int num_spaces,is_lazy_continuation=0;
if(this->give_type(current_level)==MK::block_quote){
is_lazy_continuation=1;
}
//################################################################################
// setext_heading
//################################################################################
if(this->give_type(current_level)==MK::paragraph &&
blanks_line_[0]<=3 && !is_lazy_continuation &&
is_chars(buffer[SE_lineNoBlank_[0]],"-=")){
int valid=is_same_char_line(buffer,SE_lineNoBlank_[0],SE_lineNoBlank_[1],0,1);
if(valid){
MKblocks& block=blocks_[open_blocks_[end_MTS]];
block.mtype_=MK::setext_heading;
if(buffer[SE_lineNoBlank_[0]]=='=') block.level_=1;
else block.level_=2;
this->curr_close();
return;
}
}
//################################################################################
// list_item
//################################################################################
int is_list_item=0,is_list_item_cont=0; MyTSchar matches[2];
int SE_lineL=SE_line_[0];
if(this->give_type(current_level)==MK::list_item){
int num_prefix=0,num_increased;
MKblocks& block=blocks_[open_blocks_[current_level]];
if(buffer.regexp(block.pos_[0],"^[ \t]*([-+*]|\\d{1,9}[.\\)])[ \t]*\n")){
num_prefix=2;
} else if(block.children_.num()){
int pos=blocks_[block.children_[0]].posNoBlank_[0];
if(blocks_[block.children_[0]].mtype_==MK::indented_code_block) pos-=4;
else if(blocks_[block.children_[0]].mtype_==MK::fenced_code_block)
pos=blocks_[block.children_[0]].pos_[0];
num_prefix=pos-block.pos_[0];
} else {
num_prefix=2;
}
if(blanks_line_[0]>=num_prefix){
is_list_item_cont=1;
SE_lineL=incr_chars(buffer,SE_line_[0],num_prefix,&blanks_line_[0],
&num_increased);
if(num_increased){
SE_lineNoBlank_[0]+=num_increased;
SE_line_[1]+=num_increased;
SE_lineNoBlank_[1]+=num_increased;
pos_+=num_increased;
}
}
}
//################################################################################
// block_quote
//################################################################################
if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],">") &&
!is_list_item_cont){
if(this->give_type(current_level)==MK::fenced_code_block){
goto no_block_quote;
}
if(this->give_type(current_level)!=MK::block_quote){
while(open_blocks_.num()>current_level) this->curr_close();
this->append_block(MK::block_quote,SE_line_,SE_lineNoBlank_,
blanks_line_);
}
SE_line_[0]=SE_lineNoBlank_[0]+1;
if(is_chars(buffer[SE_line_[0]]," \t")){
int num_increased;
SE_line_[0]=incr_chars(buffer,SE_line_[0],1,&blanks_line_[0],&num_increased);
if(num_increased){
SE_lineNoBlank_[0]+=num_increased;
SE_line_[1]+=num_increased;
SE_lineNoBlank_[1]+=num_increased;
pos_+=num_increased;
}
}
SE_lineNoBlank_[0]=spaces_num(buffer,SE_line_[0],&blanks_line_[0]);
this->create_append_paragraph(buffer,current_level+1);
return;
}
no_block_quote:;
//################################################################################
// thematic_break
//################################################################################
if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"-_*") &&
!is_list_item_cont){
int valid=is_same_char_line(buffer,SE_lineNoBlank_[0],SE_lineNoBlank_[1],1,3);
if(valid){
if(is_lazy_continuation){
this->close_all();
} else {
while(is_open(current_level)) this->curr_close();
}
this->append_block(MK::thematic_break,SE_line_,
SE_lineNoBlank_,blanks_line_);
this->curr_close();
return;
}
}
//################################################################################
// list_item cont
//################################################################################
if(!is_list_item_cont && blanks_line_[0]<=3){
if(is_chars(buffer[SE_lineNoBlank_[0]],"-+*")){
is_list_item=1;
SE_lineL=SE_lineNoBlank_[0]+1;
} else if(buffer.regexp(SE_lineNoBlank_[0],"^(\\d{1,9})[.\\)]",matches,2)){
if(this->give_type(current_level)!=MK::paragraph || strcmp(matches[1].v(),"1")==0){
is_list_item=1;
SE_lineL=SE_lineNoBlank_[0]+matches[0].num();
}
}
if(is_list_item && is_chars(buffer[SE_lineL]," \t")){
int num_increased;
SE_lineL=incr_chars(buffer,SE_lineL,1,&blanks_line_[0],&num_increased);
if(num_increased){
SE_lineNoBlank_[0]+=num_increased;
SE_line_[1]+=num_increased;
SE_lineNoBlank_[1]+=num_increased;
pos_+=num_increased;
}
} else if(buffer[SE_lineL]!='\n'){
is_list_item=0;
}
}
if(is_list_item || is_list_item_cont){
if(this->give_type(current_level)==MK::fenced_code_block){
goto no_list_item;
}
if(this->give_type(current_level)==MK::paragraph &&
buffer.regexp(SE_lineNoBlank_[0],"^[ \t]*([-+*]|\\d{1,9}[.\\)])[ \t]*\n")){
goto no_list_item;
}
if(this->give_type(current_level)!=MK::list_item || !is_list_item_cont){
while(open_blocks_.num()>current_level) this->curr_close();
if(!is_list_item_cont && this->give_type(current_level)==MK::list_item){
this->curr_close();
}
this->append_block(MK::list_item,SE_line_,SE_lineNoBlank_,
blanks_line_);
}
SE_line_[0]=SE_lineL;
SE_lineNoBlank_[0]=spaces_num(buffer,SE_line_[0],&blanks_line_[0]);
this->create_append_paragraph(buffer,current_level+1);
return;
}
if(this->give_type(current_level)==MK::list_item){
is_lazy_continuation=1;
}
no_list_item:;
//################################################################################
// fenced_code_block
//################################################################################
if(this->give_type(current_level)==MK::fenced_code_block){
MKblocks& block=blocks_[open_blocks_[end_MTS]];
int is_end=0;
if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"`~")){
is_end=is_same_char_line(buffer,SE_lineNoBlank_[0],
SE_lineNoBlank_[1],0,block.level_);
int pos=spaces_num(buffer,block.pos_[0]);
if(buffer[SE_lineNoBlank_[0]]!=buffer[pos]) is_end=0;
}
if(SE_lineNoBlank_[0]==buffer.num()-1) is_end=1;
if(is_end){
block.pos_[1]=SE_line_[1];
block.posNoBlank_[1]=SE_line_[0]-1;
block.blanks_[1]=blanks_line_[1];
this->curr_close();
return;
}
if(0&& SE_line_[0]>block.pos_[1]+1){
this->curr_close();
SE_lineNoBlank_[1]=SE_line_[1];
MKblocks& blockN=this->append_block(MK::fenced_code_block,SE_line_,
SE_lineNoBlank_,blanks_line_);
blockN.level_=block.level_;
return;
}
block.pos_[1]=SE_line_[1];
block.posNoBlank_[1]=SE_lineNoBlank_[1];
block.blanks_[1]=blanks_line_[1];
return;
}
if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"`~") &&
this->give_type(current_level)!=MK::HTML_block){
int level=num_same_char_line_prefix(buffer,SE_lineNoBlank_[0],SE_lineNoBlank_[1],0);
int pos=-1;
if(buffer[SE_lineNoBlank_[0]]=='`'){
pos=find_closing_delimiter(buffer,SE_lineNoBlank_[0]+level,
SE_lineNoBlank_[1],'`',1);
}
if(level>=3 && pos==-1){
if(is_lazy_continuation){
while(open_blocks_.num()>current_level){
this->curr_close();
}
} else if(is_open(current_level)){
this->curr_close();
}
SE_lineNoBlank_[0]=SE_line_[1]+1;
MKblocks& block=this->append_block(MK::fenced_code_block,SE_line_,
SE_lineNoBlank_,blanks_line_);
block.level_=level;
return;
}
}
//################################################################################
// indented_code_block
//################################################################################
if(this->give_type_last()==MK::indented_code_block){
this->curr_close();
}
if(this->give_type_last()==MK::list_item && is_lazy_continuation &&
blanks_line_[0]>=4){
this->curr_close();
}
if(this->give_type_last()==MK::block_quote && is_lazy_continuation &&
blanks_line_[0]>=4){
this->curr_close();
}
if(!is_open(current_level) && blanks_line_[0]>=4){
if(is_lazy_continuation){
this->close_all();
}
int num_increased;
SE_lineNoBlank_[0]=incr_chars(buffer,SE_line_[0],4,&blanks_line_[0],&num_increased);
if(num_increased){
SE_line_[1]+=num_increased;
SE_lineNoBlank_[1]+=num_increased;
pos_+=num_increased;
}
if(buffer[SE_lineNoBlank_[0]]!='\n'){
this->append_block(MK::indented_code_block,SE_line_,SE_lineNoBlank_,
blanks_line_);
return;
}
}
//################################################################################
// ATX_heading
//################################################################################
if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"#")){
IntVector2D level,start_end,blank;
level[0]=1; start_end[0]=start_end[1]=-1;
for(int i=SE_lineNoBlank_[0]+1;i<=SE_lineNoBlank_[1];i++){
if(is_chars(buffer[i],"#") && start_end[0]==-1 && blank[0]==0){
level[0]++;
} else if(is_chars(buffer[i],"#") && blank[1]>0){
level[1]++;
} else if(is_chars(buffer[i]," \t")){
if(start_end[0]==-1){
blank[0]++;
blank[1]++;
} else {
blank[1]++;
}
} else {
if(start_end[0]==-1) start_end[0]=i;
start_end[1]=i;
blank[1]=0;
level[1]=0;
}
}
if(level[0]<=6 && (blank[0]>=1 || start_end[0]==-1)){
if(is_lazy_continuation){
this->close_all();
} else if(is_open(current_level)) this->curr_close();
MKblocks& block=this->append_block(MK::ATX_heading,SE_line_,start_end,
blanks_line_);
block.level_=level[0];
this->curr_close();
return;
}
}
//################################################################################
// HTML_block
//################################################################################
if(blanks_line_[0]<=3 && is_chars(buffer[SE_lineNoBlank_[0]],"<") &&
this->give_type(current_level)!=MK::HTML_block){
const char* rexsStart[]={
"(?in)\\A<(script|pre|style)(\\s|>|$)",
"(?in)\\A<!--",
"(?in)\\A<\\?",
"(?in)\\A<![A-Z]",
"(?in)\\A<!\\[CDATA\\[",
"(?in)\\A</?(address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|"
"dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|"
"h1|h2|h3|h4|h5|h6|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|"
"noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|"
"thead|title|tr|track|ul)(\\s|/?>|$)",
"(?in)\\A</?[-\\w]+([ \t][^>]*>|>)\\s*$"
};
int level=0;
for(int i=0;i<7;i++){
if(buffer.regexp(SE_lineNoBlank_[0],rexsStart[i])){
level=i+1;
break;
}
}
if((level>0 && level<7) || (level==7 && is_open(current_level)==0)){
if(is_lazy_continuation){
this->close_all();
} else if(is_open(current_level)) this->curr_close();
SE_lineNoBlank_[0]=SE_line_[0];
MKblocks& block=this->append_block(MK::HTML_block,SE_line_,
SE_lineNoBlank_,blanks_line_);
block.level_=level;
}
}
if(this->give_type_last()==MK::HTML_block){
const char* rexsEnd[]={
"(?in)\\A[^\n]*</(script|pre|style)>",
"(?in)\\A.*-->",
"(?in)\\A.*\\?>",
"(?in)\\A.*>",
"(?in)\\A.*\\]\\]>",
"(?in)\\A\\s*$",
"(?in)\\A\\s*$"
};
MKblocks& block=blocks_[open_blocks_[end_MTS]];
block.pos_[1]=SE_line_[1];
block.posNoBlank_[1]=SE_lineNoBlank_[1];
block.blanks_[1]=blanks_line_[1];
if(buffer.regexp(SE_lineNoBlank_[0],rexsEnd[block.level_-1])){
int c=block.posNoBlank_[1];
if(c>block.posNoBlank_[0] && is_chars(buffer[c],ASCII_space_g_)){
c--;
}
block.posNoBlank_[1]=c;
if(block.level_==1 && buffer[block.pos_[1]]=='\n'){
block.posNoBlank_[1]=block.pos_[1];
}
this->curr_close();
}
return;
}
//################################################################################
// link_reference_definition
//################################################################################
if(!is_open(current_level) && blanks_line_[0]<=3 &&
is_chars(buffer[SE_lineNoBlank_[0]],"[")){
MKlink& link=links_.incr_num();
int c=link_label_name(buffer,SE_lineNoBlank_[0],link.name_);
int c_noblank;
if(c){
link_normalize(link.name_);
if(link.name_.num()==0) c=0;
else if(buffer[c]!=':') c=0;
else c++;
}
if(c){
c=link_destination(buffer,c,link.url_);
}
if(c){
int c_alt=link_title(buffer,c,link.title_);
if(c_alt!=0){
int c_alt2=spaces_num(buffer,c_alt,&num_spaces);
if(c_alt2!=0 && is_chars(buffer[c_alt2],"\r\n")){
c_noblank=c_alt;
c=c_alt2;
} else {
c_alt=0;
}
}
if(c_alt==0){
c_noblank=c;
c=spaces_num(buffer,c,&num_spaces);
if(!is_chars(buffer[c],"\r\n")){
c=0;
}
}
}
if(c){
if(links_.exists(link.name_.v())){
// necessary to emit a warning
} else {
links_.set(link.name_.v(),links_.num()-1);
}
SE_lineNoBlank_[1]=c_noblank;
SE_line_[1]=c;
blanks_line_[1]=c-c_noblank;
this->append_block(MK::link_reference_definition,SE_line_,
SE_lineNoBlank_,blanks_line_);
pos_=SE_line_[1];
this->curr_close();
return;
} else {
links_.decr_num();
}
}
//################################################################################
// normal paragraph
//################################################################################
int para_is_void=0;
if(SE_lineNoBlank_[0]==-1) para_is_void=1;
else if(SE_lineNoBlank_[0]>=SE_lineNoBlank_[1] &&
is_chars(buffer[SE_lineNoBlank_[0]],ASCII_space_g_)) para_is_void=1;
else if(SE_lineNoBlank_[0]==buffer.num()-1) para_is_void=1;
if(para_is_void){
if(SE_lineNoBlank_[0]<buffer.num()-1){
for(int i=open_blocks_.num();i>=current_level;i--){
int iblock;
if(i==open_blocks_.num()){
if(blocks_[open_blocks_[end_MTS]].children_.num()){
iblock=blocks_[open_blocks_[end_MTS]].children_[end_MTS];
} else {
continue;
}
} else {
iblock=open_blocks_[i];
}
if(i<open_blocks_.num() && blocks_[iblock].mtype_==MK::fenced_code_block) break;
blocks_[iblock].tight_=0;
break;
}
}
if(this->give_type_last()==MK::paragraph){
this->curr_close();
}
if(this->give_type_last()==MK::list_item){
int pos=blocks_[open_blocks_[end_MTS]].pos_[0];
const char* rex="^[ \t]*([-+*]|\\d{1,9}[.\\)])[ \t]*\n";
const char* mA[1]; int mL[1];
if(string_regexp(buffer.v(),pos,-1,rex,mA,mL,1)==1 && pos+mL[0]<=SE_line_[0]){
this->curr_close();
}
}
if(is_lazy_continuation && this->give_type(current_level)==MK::block_quote){
this->curr_close();
if(this->num_open()>current_level){
this->curr_close();
}
}
} else if(is_open(current_level) && this->give_type(current_level)!=MK::document){
MKblocks& block=blocks_[open_blocks_[end_MTS]];
if(block.mtype_!=MK::paragraph){
if(block.mtype_!=MK::list_item || current_level<open_blocks_.num()){
this->curr_close();
if(is_lazy_continuation){
while(open_blocks_.num()>current_level){
this->curr_close();
}
}
}
this->append_block(MK::paragraph,SE_line_,SE_lineNoBlank_,
blanks_line_);
} else {
block.pos_[1]=SE_line_[1];
block.posNoBlank_[1]=SE_lineNoBlank_[1];
block.blanks_[1]=blanks_line_[1];
}
} else {
if(is_lazy_continuation){
this->close_all();
}
this->append_block(MK::paragraph,SE_line_,SE_lineNoBlank_,
blanks_line_);
}
}
void MKstate::process_markdown(MyTSchar& buffer)
{
MKblocks& block=this->append_block(MK::document);
MyTSchar buffer0=buffer; buffer.clear();
for(int i=0;i<buffer0.num();i++){
if(i<buffer0.num()-1 && buffer0[i]=='\\'){
if(buffer0[i+1]=='n'){
buffer.append('\n');
} else if(buffer0[i+1]=='t'){
buffer.append('\t');
} else if(buffer0[i+1]=='r'){
// nothing
} else {
buffer.append(buffer0[i]);
buffer.append(buffer0[i+1]);
}
i++;
} else if(buffer0[i]=='\r'){
// nothing
} else {
buffer.append(buffer0[i]);
}
}
for(int i=0;i<buffer.num();i++){
switch(buffer[i]){
case ' ':
{
if(SE_line_[0]==-1){
SE_line_[0]=i;
}
if(SE_lineNoBlank_[0]==-1){
blanks_line_[0]++;
} else {
blanks_line_[1]++;
}
}
break;
case '\t':
{
if(SE_line_[0]==-1){
SE_line_[0]=i;
}
if(SE_lineNoBlank_[0]==-1){
blanks_line_[0]+=4;
} else {
blanks_line_[1]+=4;
}
}
break;
case '\n': case '\r':
{
if(SE_line_[0]==-1){
SE_line_[0]=i;
}
if(SE_lineNoBlank_[0]==-1){
SE_lineNoBlank_[0]=i;
}
if(SE_lineNoBlank_[1]==-1){
SE_lineNoBlank_[1]=i;
}
SE_line_[1]=i;
pos_=i;
this->create_append_paragraph(buffer,1);
i=pos_;
SE_line_[0]=SE_line_[1]=-1;
SE_lineNoBlank_[0]=SE_lineNoBlank_[1]=-1;
blanks_line_[0]=0;
if(i<buffer.num()-1 && buffer[i]=='\r' && buffer[i+1]=='\n'){
i++;
}
}
break;
case '\\':
{
if(SE_line_[0]==-1){
SE_line_[0]=i;
}
if(SE_lineNoBlank_[0]==-1){
SE_lineNoBlank_[0]=i;
}
SE_lineNoBlank_[1]=i;
blanks_line_[1]=0;
}
break;
default:
{
if(SE_line_[0]==-1){
SE_line_[0]=i;
}
if(SE_lineNoBlank_[0]==-1){
SE_lineNoBlank_[0]=i;
}
SE_lineNoBlank_[1]=i;
blanks_line_[1]=0;
}
break;
}
}
}
int MKstate::remove_block_quote_list_item_prefix(MyTSchar& buffer,int i,int end,int ibox)
{
int level=this->block_quote_level(ibox);
while(i<=end && level>0){
if(buffer[i]=='>'){
if(i<end && is_chars(buffer[i+1]," ")) i++;
level--;
if(level==0){
i++;
break;
}
} else {
break;
}
i++;
}
int prefix=this->list_item_level_prefix(buffer,ibox);
if(prefix>0){
int num_spaces;
spaces_num(buffer,i,&num_spaces);
if(prefix>num_spaces) prefix=num_spaces;
i+=num_spaces;
}
return i;
}
void MKstate::output_link(MyTSchar& out,MyTSchar& url,MyTSchar& title,
MyTSchar& text)
{
out.printE("<a href=\"");
this->output_url_encoded_string(url,out,0,url.num()-1);
out.printE("\"");
if(title.num()){
out.printE(" title=\"");
this->output_quoted_string_nobackslash(title,out,0,title.num()-1);
out.printE("\"");
}
out.printE(">");
this->output_quoted_string_nobackslash(text,out,0,text.num()-1);
out.printE("</a>");
}
void MKstate::output_paragraph(MyTSchar& buffer,MyTSchar& out,int start,int end,
int ibox,int endline_to_space)
{
int c;
for(int i=start;i<=end;i++){
if(i>start && buffer[i-1]=='\n'){
while(is_chars(buffer[i],ASCII_space_g_) && i<=end) i++;
if(i>end) break;
i=this->remove_block_quote_list_item_prefix(buffer,i,end,ibox);
}
if(buffer[i]=='\\' && i<end){
if(is_chars(buffer[i+1],ASCII_punctuation_g_)){
output_quoted_char(out,buffer[i+1]);
i++;
continue;
} else if(buffer[i+1]=='\n'){
out.printE("<br />");
continue;
}
}
if(is_chars(buffer[i],"_*")){
int n,nMax,nEnd=-1;
nMax=num_same_char_line_prefix(buffer,i,end,0);
for(n=nMax;n>=1;n--){
if(i+n>=end || is_chars(buffer[i+n],Unicode_space_g_)) continue;
if(is_chars(buffer[i+n],ASCII_punctuation_g_)){
if(i>start && !is_chars(buffer[i-1],ASCII_punctuation_SP_g_)){
continue;
}
}
nEnd=find_closing_delimiterEM(buffer,i+n,end,buffer[i],n);
if(nEnd!=-1) break;
}
if(i>start && buffer[i]=='_' &&
!is_chars(buffer[i-1],Unicode_space_g_) &&
!is_chars(buffer[i-1],ASCII_punctuation_SP_g_)){
nEnd=-1;
}
if(buffer[i+n]==buffer[i]){
nEnd=-1;
}
if(i>start && buffer[i-1]==buffer[i]){
nEnd=-1;
}
if(nEnd!=-1 && nEnd+n<=end && buffer[i]=='_' &&
!is_chars(buffer[nEnd+n],Unicode_space_g_) &&
!is_chars(buffer[nEnd+n],ASCII_punctuation_SP_g_)){
nEnd=-1;
}
if(nEnd!=-1 && nEnd>i+n){
const char* mA[1]; int mL[1];
if(string_regexp(buffer.v(),i+n,nEnd,"[`]+",mA,mL,1)==1){
int pos0=mA[0]-buffer.v();
int pos=find_closing_delimiterExact(buffer,pos0+mL[0],end,buffer[pos0],
mL[0]);
if(pos!=-1){
nEnd=-1;
}
}
}
if(nEnd!=-1 && nEnd>i+n){
if(n%2==1) out.printE("<em>");
for(int j=0;j<n/2;j++) out.printE("<strong>");
this->output_paragraph(buffer,out,i+n,nEnd-1,ibox);
for(int j=0;j<n/2;j++) out.printE("</strong>");
if(n%2==1) out.printE("</em>");
i=nEnd+n-1;
continue;
}
} else if(buffer[i]=='`' && (i==start || buffer[i-1]!='`')){
int n=num_same_char_line_prefix(buffer,i,end,0);
int nEnd=find_closing_delimiterExact(buffer,i+n,end,buffer[i],n);
if(nEnd!=-1){
out.printE("<code>");
this->output_quoted_string_code_span(buffer,out,i+n,nEnd-1);
out.printE("</code>");
i=nEnd+n-1;
continue;
}
} else if(buffer[i]=='['){
MyTSchar name,text,url,title;
int c=link_text(buffer,i,text);
if(c!=0){
if(buffer[c]=='('){
c++;
int c_alt=link_destination(buffer,c,url);
if(c_alt!=-1) c=c_alt;
c_alt=link_title(buffer,c,title);
if(c_alt!=-1) c=c_alt;
while(c<buffer.num() && is_chars(buffer[c],ASCII_space_g_)) c++;
if(buffer[c]!=')') c=0;
else c++;
} else if(buffer[c]=='['){
c++;
if(buffer[c]==']'){
name=text;
c++;
} else {
c=link_label_name(buffer,c,name);
}
if(c){
link_normalize(name);
if(name.num()==0) c=0;
}
} else {
name=text;
link_normalize(name);
if(name.num()==0) c=0;
}
}
if(c!=0 && name.num()!=0){
MKlink* link=links_.getH(name.v());
if(!link){
c=0;
} else {
url=link->url_;
title=link->title_;
}
}
if(c!=0){
replace_backslash(url);
replace_backslash(title);
replace_backslash(text);
this->output_link(out,url,title,text);
i=c-1;
continue;
}
} else if(buffer[i]=='<' && (c=is_autolink(buffer,i,end))!=-1){
MyTSchar name,text,url,title;
url.setV(&buffer[i+1],c-i-1);
text.setV(&buffer[i+1],c-i-1);
this->output_link(out,url,title,text);
i=c;
continue;
} else if(buffer[i]=='<' && (c=is_raw_html(buffer,i,end))!=-1){
for(int j=i;j<=c;j++){
out.printE("%c",buffer[j]);
}
i=c;
continue;
}
if(buffer[i]=='\n'){
if(endline_to_space){
output_quoted_char(out,' ');
} else {
output_quoted_char(out,'\n');
}
} else if(buffer[i]==' '){
int num_spaces;
int c=spaces_num(buffer,i,&num_spaces);
if(num_spaces>=2 && buffer[c]=='\n'){
out.printE("<br />\n");
i=c;
} else {
output_quoted_char(out,buffer[i]);
}
} else if(buffer[i]=='&'){
int c=entities_json_to_c(buffer,out,i);
if(c!=-1){
i=c;
} else {
output_quoted_char(out,buffer[i]);
}
} else {
output_quoted_char(out,buffer[i]);
}
}
}
void MKstate::output_paragraph(MyTSchar& buffer,MyTSchar& out,int ibox)
{
if(blocks_[ibox].posNoBlank_[0]==-1) return;
this->output_paragraph(buffer,out,blocks_[ibox].posNoBlank_[0],
blocks_[ibox].posNoBlank_[1],ibox);
}
void MKstate::output_paragraph_all_spaces(MyTSchar& buffer,MyTSchar& out,int ibox,
int print_endline,int num_indent_spaces_removed,int check_remove_start)
{
int start=blocks_[ibox].posNoBlank_[0];
if(start==-1) return;
int end=blocks_[ibox].posNoBlank_[1];
if(check_remove_start){
start=this->remove_block_quote_list_item_prefix(buffer,start,end,ibox);
}
for(int i=start;i<=end;i++){
if(i>start && buffer[i-1]=='\n'){
i=this->remove_block_quote_list_item_prefix(buffer,i,end,ibox);
if(i>end) break;
}
if(num_indent_spaces_removed>0 && (i==start || buffer[i-1]=='\n')){
int n=0;
while(i<=end && buffer[i]==' '){
n++;
i++;
if(n==num_indent_spaces_removed) break;
}
}
output_quoted_char(out,buffer[i]);
}
if(print_endline){
for(int i=blocks_[ibox].posNoBlank_[1]+1;i<=blocks_[ibox].pos_[1];i++){
output_quoted_char(out,buffer[i]);
}
}
}
void MKstate::output_paragraph_no_quoted(MyTSchar& buffer,MyTSchar& out,int ibox)
{
int start=blocks_[ibox].posNoBlank_[0];
if(start==-1) return;
int end=blocks_[ibox].posNoBlank_[1];
for(int i=start;i<=end;i++){
if(i>start && buffer[i-1]=='\n'){
i=this->remove_block_quote_list_item_prefix(buffer,i,end,ibox);
}
out.printE("%c",buffer[i]);
}
if(buffer[end]!='\n') out.printE("\n");
}
int MKstate::is_loose_last(int iblock)
{
if(blocks_[iblock].mtype_==MK::block_quote) return 0;
if(blocks_[iblock].tight_==0) return 1;
if(blocks_[iblock].children_.num()){
int child=blocks_[iblock].children_[end_MTS];
return this->is_loose_last(child);
}
return 0;
}
inline void force_line_start(MyTSchar& out)
{
if(out.num() && out[end_MTS]!='\n') out.printE("\n");
}
int MKstate::is_fenced_block_info_string(MyTSchar& buffer,int start,
MyTSchar& infostring)
{
infostring.clear();
for(int i=start;i<buffer.num();i++){
int pos=this->entities_json_to_c(buffer,infostring,i);
if(pos!=-1){
i=pos;
continue;
}
if(buffer[i]=='\n'){
if(infostring.num()) return 1;
else return 0;
} else if(is_chars(buffer[i],ASCII_space_g_)){
if(infostring.num()>0) return 1;
} else if(buffer[i]=='\\' && i<buffer.num()-1){
infostring.append(buffer[i+1]);
i++;
} else {
infostring.append(buffer[i]);
}
}
if(infostring.num()) return 1;
else return 0;
}
void MKstate::output_markdown(MyTSchar& buffer,MyTSchar& out,int iblock)
{
switch(blocks_[iblock].mtype_){
case MK::document:
{
// nothing
}
break;
case MK::indented_code_block:
{
int out_num=-1;
int iblock_prev=this->give_prev(iblock);
if(iblock_prev==-1 || blocks_[iblock_prev].mtype_!=MK::indented_code_block){
force_line_start(out);
out.printE("<pre><code>");
out_num=out.num();
} else {
int pos0=blocks_[iblock_prev].pos_[1]+1;
int len=blocks_[iblock].pos_[0];
int n=string_regexp_count(buffer.v(),pos0,len,"\n");
for(int i=0;i<n;i++){
out.printE("\n");
}
}
this->output_paragraph_all_spaces(buffer,out,iblock,1,0,0);
int iblock_next=this->give_next(iblock);
if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::indented_code_block){
if(out[end_MTS]!='\n' && out_num!=out.num()) out.printE("\n");
out.printE("</code></pre>\n");
}
}
break;
case MK::fenced_code_block:
{
int out_num=-1;
int iblock_prev=this->give_prev(iblock);
if(iblock_prev==-1 || blocks_[iblock_prev].mtype_!=MK::fenced_code_block){
int c=spaces_num(buffer,blocks_[iblock].pos_[0]);
c+=num_same_char_line_prefix(buffer,c,blocks_[iblock].pos_[1],0);
force_line_start(out);
MyTSchar infostring;
if(this->is_fenced_block_info_string(buffer,c,infostring)){
out.printE("<pre><code class=\"language-%s\">",infostring.v());
} else {
out.printE("<pre><code>");
}
out_num=out.num();
}
int num_spaces=0;
int iblock0=iblock;
while(1){
int iblock0L=this->give_prev(iblock0);
if(iblock0L==-1) break;
iblock0=iblock0L;
}
int pos=spaces_num(buffer,blocks_[iblock0].pos_[0]);
num_spaces=pos-blocks_[iblock0].pos_[0];
this->output_paragraph_all_spaces(buffer,out,iblock,0,num_spaces,1);
int iblock_next=this->give_next(iblock);
if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::fenced_code_block){
if(out[end_MTS]!='\n' && out_num!=out.num()) out.printE("\n");
out.printE("</code></pre>\n");
}
}
break;
case MK::HTML_block:
{
force_line_start(out);
this->output_paragraph_no_quoted(buffer,out,iblock);
}
break;
case MK::link_reference_definition:
{
// nothing
}
break;
case MK::block_quote:
{
force_line_start(out);
out.printE("<blockquote>\n");
}
break;
case MK::list_item:
{
int need_start=0;
int iblock_prev=this->give_prev(iblock);
if(iblock_prev==-1 || blocks_[iblock_prev].mtype_!=MK::list_item){
need_start=1;
} else {
MyTSchar matches1[4],matches2[4];
const char* rex="^\\s*(?:(\\d{1,9})([.\\)])|([-+*]))";
buffer.regexp(blocks_[iblock_prev].pos_[0],rex,matches1,4);
buffer.regexp(blocks_[iblock].pos_[0],rex,matches2,4);
need_start=1;
if(matches1[2].num() && matches2[2].num() && matches1[2][0]==matches2[2][0]){
need_start=0;
} else if(matches1[3].num() && matches2[3].num() && matches1[3][0]==matches2[3][0]){
need_start=0;
}
if(need_start){
if(matches1[2].num()){
out.printE("</ol>\n");
} else {
out.printE("</ul>\n");
}
}
}
if(need_start){
MyTSchar iblocks;
iblocks.append(iblock);
while(1){
int iblock_next=this->give_next(iblocks[end_MTS]);
if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::list_item){
break;
}
iblocks.append(iblock_next);
}
int tight=1;
for(int i=0;i<iblocks.num()-1;i++){
if(blocks_[iblocks[i]].tight_==0){
tight=0;
break;
}
if(this->is_loose_last(iblocks[i])){
tight=0;
break;
}
}
for(int i=0;i<iblocks.num();i++){
if(blocks_[iblocks[i]].children_.num()>1){
for(int j=0;j<blocks_[iblocks[i]].children_.num()-1;j++){
int child=blocks_[iblocks[i]].children_[j];
if(this->is_loose_last(child)){
tight=0;
break;
}
}
}
}
for(int i=0;i<iblocks.num();i++){
blocks_[iblocks[i]].tight_=tight;
if(blocks_[iblocks[i]].children_.num()>1){
for(int j=0;j<blocks_[iblocks[i]].children_.num()-1;j++){
int child=blocks_[iblocks[i]].children_[j];
if(blocks_[child].tight_==0){
blocks_[iblocks[i]].tight_=0;
break;
}
}
}
}
force_line_start(out);
MyTSchar matches[2];
if(buffer.regexp(blocks_[iblock].pos_[0],"^\\s*(\\d{1,9})[.\\)]",matches,2)){
while(matches[1].num()>1 && matches[1][0]=='0') matches[1].clear(0);
if(strcmp(matches[1].v(),"1")==0){
out.printE("<ol>\n");
} else {
out.printE("<ol start=\"%s\">\n",matches[1].v());
}
} else {
out.printE("<ul>\n");
}
}
out.printE("<li>");
}
break;
case MK::ATX_heading: case MK::setext_heading:
{
force_line_start(out);
out.printE("<h%d>",blocks_[iblock].level_);
this->output_paragraph(buffer,out,iblock);
out.printE("</h%d>\n",blocks_[iblock].level_);
}
break;
case MK::thematic_break:
{
force_line_start(out);
out.printE("<hr />\n");
}
break;
case MK::paragraph:
{
int tight=0;
if(blocks_[blocks_[iblock].parent_].mtype_==MK::list_item){
tight=blocks_[blocks_[iblock].parent_].tight_;
}
if(!tight){
force_line_start(out);
out.printE("<p>");
}
this->output_paragraph(buffer,out,iblock);
if(!tight){
out.printE("</p>\n");
}
}
break;
default:
{
out.printE("<p>");
this->output_paragraph(buffer,out,iblock);
out.printE("</p>\n");
}
break;
}
for(int i=0;i<blocks_[iblock].children_.num();i++){
this->output_markdown(buffer,out,blocks_[iblock].children_[i]);
}
switch(blocks_[iblock].mtype_){
case MK::list_item:
{
out.printE("</li>\n");
int iblock_next=this->give_next(iblock);
if(iblock_next==-1 || blocks_[iblock_next].mtype_!=MK::list_item){
if(buffer.regexp(blocks_[iblock].pos_[0],"^\\s*\\d{1,9}[.\\)]")){
out.printE("</ol>\n");
} else {
out.printE("</ul>\n");
}
}
}
break;
case MK::block_quote:
{
out.printE("</blockquote>\n");
}
break;
}
}
static void process_markdown(MyTSchar& buffer,MyTSchar& out)
{
MKstate mkstate;
mkstate.process_markdown(buffer);
mkstate.output_markdown(buffer,out,0);
#ifndef NDEBUG
MyTSchar deb;
mkstate.blocks_[0].nprint(0,mkstate.blocks_,buffer,deb);
FILE* dout=fopen("kk.xml","wb");
fprintf(dout,"<?xml version='1.0' encoding='UTF-8'?>\n");
fprintf(dout,"%s",deb.v());
fclose(dout);
#endif
}
static void process_markdown(const char* fileIn,const char* dataIn,const char* fileOut)
{
MyTSchar buffer,out;
FILE* fin=stdin,*fout=stdout;
if(fileIn){
fin=fopen(fileIn,"rb");
if(!fin){
fprintf(stderr,"infile not found\n");
exit(2);
}
}
if(dataIn){
buffer.appendV(dataIn);
} else {
fseek(fin,0,SEEK_END);
size_t lSize=ftell(fin);
rewind(fin);
buffer.set_num(lSize);
size_t result=fread(buffer.v(),1,lSize,fin);
fclose(fin);
if(result!=lSize){
fprintf(stderr,"file read incorrectly\n");
exit(2);
}
buffer.printE("");
}
process_markdown(buffer,out);
if(fileOut){
fout=fopen(fileOut,"wb");
if(!fout){
fprintf(stderr,"outfile not found\n");
exit(2);
}
}
fprintf(fout,"%s",out.v());
if(fout!=stdout) fclose(fout);
}
#ifdef MARKDOWN_AS_EXE
int main(int argc,const char* argv[])
{
const char* fileIn=NULL,*fileOut=NULL,*dataIn=NULL;
// only command necessary to initialize tcl
Tcl_FindExecutable(argv[0]);
if(argc>=3 && strcmp(argv[1],"-data")==0){
dataIn=argv[2];
argc--; argv++;
} else if(argc>=2){
fileIn=argv[1];
}
if(argc==3){
fileOut=argv[2];
}
process_markdown(fileIn,dataIn,fileOut);
}
#else
static int Markdown_process(ClientData clientData, Tcl_Interp *ip, int objc,Tcl_Obj *CONST objv[])
{
int result,iMatch;
MyTSchar buffer,out;
const char* varname=NULL;
char err_args[]= "?-variable varname? html|rdinfo content";
const char *markdown_options[] = { "-variable",NULL };
const char *markdown_cmds[] = { "html","rdinfo",NULL };
typedef enum class MOP { html,rdinfo } Markdown_options;
while(objc>3 && Tcl_GetString(objv[1])[0]=='-'){
result=Tcl_GetIndexFromObj(ip,objv[1],markdown_options,"option", 0,&iMatch);
if(result!=TCL_OK) return result;
switch(iMatch){
case 0:
if(objc<4){
Tcl_WrongNumArgs(ip,1,objv, err_args);
return TCL_ERROR;
}
objc--;
objv++;
varname=Tcl_GetString(objv[1]);
}
objc--;
objv++;
}
if (objc != 3) {
Tcl_WrongNumArgs(ip,1,objv,err_args);
return TCL_ERROR;
}
result=Tcl_GetIndexFromObj(ip,objv[1],markdown_cmds,"option", 0,&iMatch);
if(result!=TCL_OK) return result;
Markdown_options moptions=(Markdown_options) iMatch;
objc--;
objv++;
buffer.setV(Tcl_GetString(objv[1]),-1);
process_markdown(buffer,out);
Tcl_Obj *blockinfo=Tcl_NewStringObj(out.v(),out.num());
if(varname){
const char* blockinfoname=Tcl_GetString(objv[2]);
Tcl_UpVar(ip,"1",blockinfoname,"blockinfo",0);
Tcl_SetVar2Ex(ip,"blockinfo",NULL,blockinfo,0);
Tcl_DecrRefCount(blockinfo);
} else {
Tcl_SetObjResult(ip,blockinfo);
}
return TCL_OK;
}
extern "C" DLLEXPORT int Markdown_Init(Tcl_Interp *interp)
{
#ifdef USE_TCL_STUBS
Tcl_InitStubs(interp,"8.6",0);
#endif
Tcl_CreateObjCommand( interp, "markdown_process",Markdown_process,NULL,NULL);
return TCL_OK;
}
extern "C" DLLEXPORT int Markdown_SafeInit(Tcl_Interp *interp)
{
return Markdown_Init(interp);
}
extern "C" DLLEXPORT int Markdown_Unload(Tcl_Interp *interp,int flags)
{
return TCL_ERROR;
}
extern "C" DLLEXPORT int Markdown_SafeUnload(Tcl_Interp *interp,int flags)
{
return TCL_ERROR;
}
#endif // MARKDOWN_AS_EXE
const char* entities_json_to_c_g_[]={
"Æ","\\u00C6",
"Æ","\\u00C6",
"&","\\u0026",
"&","\\u0026",
"Á","\\u00C1",
"Á","\\u00C1",
"Ă","\\u0102",
"Â","\\u00C2",
"Â","\\u00C2",
"А","\\u0410",
"𝔄","\\uD835\\uDD04",
"À","\\u00C0",
"À","\\u00C0",
"Α","\\u0391",
"Ā","\\u0100",
"⩓","\\u2A53",
"Ą","\\u0104",
"𝔸","\\uD835\\uDD38",
"⁡","\\u2061",
"Å","\\u00C5",
"Å","\\u00C5",
"𝒜","\\uD835\\uDC9C",
"≔","\\u2254",
"Ã","\\u00C3",
"Ã","\\u00C3",
"Ä","\\u00C4",
"Ä","\\u00C4",
"∖","\\u2216",
"⫧","\\u2AE7",
"⌆","\\u2306",
"Б","\\u0411",
"∵","\\u2235",
"ℬ","\\u212C",
"Β","\\u0392",
"𝔅","\\uD835\\uDD05",
"𝔹","\\uD835\\uDD39",
"˘","\\u02D8",
"ℬ","\\u212C",
"≎","\\u224E",
"Ч","\\u0427",
"©","\\u00A9",
"©","\\u00A9",
"Ć","\\u0106",
"⋒","\\u22D2",
"ⅅ","\\u2145",
"ℭ","\\u212D",
"Č","\\u010C",
"Ç","\\u00C7",
"Ç","\\u00C7",
"Ĉ","\\u0108",
"∰","\\u2230",
"Ċ","\\u010A",
"¸","\\u00B8",
"·","\\u00B7",
"ℭ","\\u212D",
"Χ","\\u03A7",
"⊙","\\u2299",
"⊖","\\u2296",
"⊕","\\u2295",
"⊗","\\u2297",
"∲","\\u2232",
"”","\\u201D",
"’","\\u2019",
"∷","\\u2237",
"⩴","\\u2A74",
"≡","\\u2261",
"∯","\\u222F",
"∮","\\u222E",
"ℂ","\\u2102",
"∐","\\u2210",
"∳","\\u2233",
"⨯","\\u2A2F",
"𝒞","\\uD835\\uDC9E",
"⋓","\\u22D3",
"≍","\\u224D",
"ⅅ","\\u2145",
"⤑","\\u2911",
"Ђ","\\u0402",
"Ѕ","\\u0405",
"Џ","\\u040F",
"‡","\\u2021",
"↡","\\u21A1",
"⫤","\\u2AE4",
"Ď","\\u010E",
"Д","\\u0414",
"∇","\\u2207",
"Δ","\\u0394",
"𝔇","\\uD835\\uDD07",
"´","\\u00B4",
"˙","\\u02D9",
"˝","\\u02DD",
"`","\\u0060",
"˜","\\u02DC",
"⋄","\\u22C4",
"ⅆ","\\u2146",
"𝔻","\\uD835\\uDD3B",
"¨","\\u00A8",
"⃜","\\u20DC",
"≐","\\u2250",
"∯","\\u222F",
"¨","\\u00A8",
"⇓","\\u21D3",
"⇐","\\u21D0",
"⇔","\\u21D4",
"⫤","\\u2AE4",
"⟸","\\u27F8",
"⟺","\\u27FA",
"⟹","\\u27F9",
"⇒","\\u21D2",
"⊨","\\u22A8",
"⇑","\\u21D1",
"⇕","\\u21D5",
"∥","\\u2225",
"↓","\\u2193",
"⤓","\\u2913",
"⇵","\\u21F5",
"̑","\\u0311",
"⥐","\\u2950",
"⥞","\\u295E",
"↽","\\u21BD",
"⥖","\\u2956",
"⥟","\\u295F",
"⇁","\\u21C1",
"⥗","\\u2957",
"⊤","\\u22A4",
"↧","\\u21A7",
"⇓","\\u21D3",
"𝒟","\\uD835\\uDC9F",
"Đ","\\u0110",
"Ŋ","\\u014A",
"Ð","\\u00D0",
"Ð","\\u00D0",
"É","\\u00C9",
"É","\\u00C9",
"Ě","\\u011A",
"Ê","\\u00CA",
"Ê","\\u00CA",
"Э","\\u042D",
"Ė","\\u0116",
"𝔈","\\uD835\\uDD08",
"È","\\u00C8",
"È","\\u00C8",
"∈","\\u2208",
"Ē","\\u0112",
"◻","\\u25FB",
"▫","\\u25AB",
"Ę","\\u0118",
"𝔼","\\uD835\\uDD3C",
"Ε","\\u0395",
"⩵","\\u2A75",
"≂","\\u2242",
"⇌","\\u21CC",
"ℰ","\\u2130",
"⩳","\\u2A73",
"Η","\\u0397",
"Ë","\\u00CB",
"Ë","\\u00CB",
"∃","\\u2203",
"ⅇ","\\u2147",
"Ф","\\u0424",
"𝔉","\\uD835\\uDD09",
"◼","\\u25FC",
"▪","\\u25AA",
"𝔽","\\uD835\\uDD3D",
"∀","\\u2200",
"ℱ","\\u2131",
"ℱ","\\u2131",
"Ѓ","\\u0403",
">","\\u003E",
">","\\u003E",
"Γ","\\u0393",
"Ϝ","\\u03DC",
"Ğ","\\u011E",
"Ģ","\\u0122",
"Ĝ","\\u011C",
"Г","\\u0413",
"Ġ","\\u0120",
"𝔊","\\uD835\\uDD0A",
"⋙","\\u22D9",
"𝔾","\\uD835\\uDD3E",
"≥","\\u2265",
"⋛","\\u22DB",
"≧","\\u2267",
"⪢","\\u2AA2",
"≷","\\u2277",
"⩾","\\u2A7E",
"≳","\\u2273",
"𝒢","\\uD835\\uDCA2",
"≫","\\u226B",
"Ъ","\\u042A",
"ˇ","\\u02C7",
"^","\\u005E",
"Ĥ","\\u0124",
"ℌ","\\u210C",
"ℋ","\\u210B",
"ℍ","\\u210D",
"─","\\u2500",
"ℋ","\\u210B",
"Ħ","\\u0126",
"≎","\\u224E",
"≏","\\u224F",
"Е","\\u0415",
"IJ","\\u0132",
"Ё","\\u0401",
"Í","\\u00CD",
"Í","\\u00CD",
"Î","\\u00CE",
"Î","\\u00CE",
"И","\\u0418",
"İ","\\u0130",
"ℑ","\\u2111",
"Ì","\\u00CC",
"Ì","\\u00CC",
"ℑ","\\u2111",
"Ī","\\u012A",
"ⅈ","\\u2148",
"⇒","\\u21D2",
"∬","\\u222C",
"∫","\\u222B",
"⋂","\\u22C2",
"⁣","\\u2063",
"⁢","\\u2062",
"Į","\\u012E",
"𝕀","\\uD835\\uDD40",
"Ι","\\u0399",
"ℐ","\\u2110",
"Ĩ","\\u0128",
"І","\\u0406",
"Ï","\\u00CF",
"Ï","\\u00CF",
"Ĵ","\\u0134",
"Й","\\u0419",
"𝔍","\\uD835\\uDD0D",
"𝕁","\\uD835\\uDD41",
"𝒥","\\uD835\\uDCA5",
"Ј","\\u0408",
"Є","\\u0404",
"Х","\\u0425",
"Ќ","\\u040C",
"Κ","\\u039A",
"Ķ","\\u0136",
"К","\\u041A",
"𝔎","\\uD835\\uDD0E",
"𝕂","\\uD835\\uDD42",
"𝒦","\\uD835\\uDCA6",
"Љ","\\u0409",
"<","\\u003C",
"<","\\u003C",
"Ĺ","\\u0139",
"Λ","\\u039B",
"⟪","\\u27EA",
"ℒ","\\u2112",
"↞","\\u219E",
"Ľ","\\u013D",
"Ļ","\\u013B",
"Л","\\u041B",
"⟨","\\u27E8",
"←","\\u2190",
"⇤","\\u21E4",
"⇆","\\u21C6",
"⌈","\\u2308",
"⟦","\\u27E6",
"⥡","\\u2961",
"⇃","\\u21C3",
"⥙","\\u2959",
"⌊","\\u230A",
"↔","\\u2194",
"⥎","\\u294E",
"⊣","\\u22A3",
"↤","\\u21A4",
"⥚","\\u295A",
"⊲","\\u22B2",
"⧏","\\u29CF",
"⊴","\\u22B4",
"⥑","\\u2951",
"⥠","\\u2960",
"↿","\\u21BF",
"⥘","\\u2958",
"↼","\\u21BC",
"⥒","\\u2952",
"⇐","\\u21D0",
"⇔","\\u21D4",
"⋚","\\u22DA",
"≦","\\u2266",
"≶","\\u2276",
"⪡","\\u2AA1",
"⩽","\\u2A7D",
"≲","\\u2272",
"𝔏","\\uD835\\uDD0F",
"⋘","\\u22D8",
"⇚","\\u21DA",
"Ŀ","\\u013F",
"⟵","\\u27F5",
"⟷","\\u27F7",
"⟶","\\u27F6",
"⟸","\\u27F8",
"⟺","\\u27FA",
"⟹","\\u27F9",
"𝕃","\\uD835\\uDD43",
"↙","\\u2199",
"↘","\\u2198",
"ℒ","\\u2112",
"↰","\\u21B0",
"Ł","\\u0141",
"≪","\\u226A",
"⤅","\\u2905",
"М","\\u041C",
" ","\\u205F",
"ℳ","\\u2133",
"𝔐","\\uD835\\uDD10",
"∓","\\u2213",
"𝕄","\\uD835\\uDD44",
"ℳ","\\u2133",
"Μ","\\u039C",
"Њ","\\u040A",
"Ń","\\u0143",
"Ň","\\u0147",
"Ņ","\\u0145",
"Н","\\u041D",
"​","\\u200B",
"​","\\u200B",
"​","\\u200B",
"​","\\u200B",
"≫","\\u226B",
"≪","\\u226A",
"
","\\u000A",
"𝔑","\\uD835\\uDD11",
"⁠","\\u2060",
" ","\\u00A0",
"ℕ","\\u2115",
"⫬","\\u2AEC",
"≢","\\u2262",
"≭","\\u226D",
"∦","\\u2226",
"∉","\\u2209",
"≠","\\u2260",
"≂̸","\\u2242\\u0338",
"∄","\\u2204",
"≯","\\u226F",
"≱","\\u2271",
"≧̸","\\u2267\\u0338",
"≫̸","\\u226B\\u0338",
"≹","\\u2279",
"⩾̸","\\u2A7E\\u0338",
"≵","\\u2275",
"≎̸","\\u224E\\u0338",
"≏̸","\\u224F\\u0338",
"⋪","\\u22EA",
"⧏̸","\\u29CF\\u0338",
"⋬","\\u22EC",
"≮","\\u226E",
"≰","\\u2270",
"≸","\\u2278",
"≪̸","\\u226A\\u0338",
"⩽̸","\\u2A7D\\u0338",
"≴","\\u2274",
"⪢̸","\\u2AA2\\u0338",
"⪡̸","\\u2AA1\\u0338",
"⊀","\\u2280",
"⪯̸","\\u2AAF\\u0338",
"⋠","\\u22E0",
"∌","\\u220C",
"⋫","\\u22EB",
"⧐̸","\\u29D0\\u0338",
"⋭","\\u22ED",
"⊏̸","\\u228F\\u0338",
"⋢","\\u22E2",
"⊐̸","\\u2290\\u0338",
"⋣","\\u22E3",
"⊂⃒","\\u2282\\u20D2",
"⊈","\\u2288",
"⊁","\\u2281",
"⪰̸","\\u2AB0\\u0338",
"⋡","\\u22E1",
"≿̸","\\u227F\\u0338",
"⊃⃒","\\u2283\\u20D2",
"⊉","\\u2289",
"≁","\\u2241",
"≄","\\u2244",
"≇","\\u2247",
"≉","\\u2249",
"∤","\\u2224",
"𝒩","\\uD835\\uDCA9",
"Ñ","\\u00D1",
"Ñ","\\u00D1",
"Ν","\\u039D",
"Œ","\\u0152",
"Ó","\\u00D3",
"Ó","\\u00D3",
"Ô","\\u00D4",
"Ô","\\u00D4",
"О","\\u041E",
"Ő","\\u0150",
"𝔒","\\uD835\\uDD12",
"Ò","\\u00D2",
"Ò","\\u00D2",
"Ō","\\u014C",
"Ω","\\u03A9",
"Ο","\\u039F",
"𝕆","\\uD835\\uDD46",
"“","\\u201C",
"‘","\\u2018",
"⩔","\\u2A54",
"𝒪","\\uD835\\uDCAA",
"Ø","\\u00D8",
"Ø","\\u00D8",
"Õ","\\u00D5",
"Õ","\\u00D5",
"⨷","\\u2A37",
"Ö","\\u00D6",
"Ö","\\u00D6",
"‾","\\u203E",
"⏞","\\u23DE",
"⎴","\\u23B4",
"⏜","\\u23DC",
"∂","\\u2202",
"П","\\u041F",
"𝔓","\\uD835\\uDD13",
"Φ","\\u03A6",
"Π","\\u03A0",
"±","\\u00B1",
"ℌ","\\u210C",
"ℙ","\\u2119",
"⪻","\\u2ABB",
"≺","\\u227A",
"⪯","\\u2AAF",
"≼","\\u227C",
"≾","\\u227E",
"″","\\u2033",
"∏","\\u220F",
"∷","\\u2237",
"∝","\\u221D",
"𝒫","\\uD835\\uDCAB",
"Ψ","\\u03A8",
""","\\u0022",
""","\\u0022",
"𝔔","\\uD835\\uDD14",
"ℚ","\\u211A",
"𝒬","\\uD835\\uDCAC",
"⤐","\\u2910",
"®","\\u00AE",
"®","\\u00AE",
"Ŕ","\\u0154",
"⟫","\\u27EB",
"↠","\\u21A0",
"⤖","\\u2916",
"Ř","\\u0158",
"Ŗ","\\u0156",
"Р","\\u0420",
"ℜ","\\u211C",
"∋","\\u220B",
"⇋","\\u21CB",
"⥯","\\u296F",
"ℜ","\\u211C",
"Ρ","\\u03A1",
"⟩","\\u27E9",
"→","\\u2192",
"⇥","\\u21E5",
"⇄","\\u21C4",
"⌉","\\u2309",
"⟧","\\u27E7",
"⥝","\\u295D",
"⇂","\\u21C2",
"⥕","\\u2955",
"⌋","\\u230B",
"⊢","\\u22A2",
"↦","\\u21A6",
"⥛","\\u295B",
"⊳","\\u22B3",
"⧐","\\u29D0",
"⊵","\\u22B5",
"⥏","\\u294F",
"⥜","\\u295C",
"↾","\\u21BE",
"⥔","\\u2954",
"⇀","\\u21C0",
"⥓","\\u2953",
"⇒","\\u21D2",
"ℝ","\\u211D",
"⥰","\\u2970",
"⇛","\\u21DB",
"ℛ","\\u211B",
"↱","\\u21B1",
"⧴","\\u29F4",
"Щ","\\u0429",
"Ш","\\u0428",
"Ь","\\u042C",
"Ś","\\u015A",
"⪼","\\u2ABC",
"Š","\\u0160",
"Ş","\\u015E",
"Ŝ","\\u015C",
"С","\\u0421",
"𝔖","\\uD835\\uDD16",
"↓","\\u2193",
"←","\\u2190",
"→","\\u2192",
"↑","\\u2191",
"Σ","\\u03A3",
"∘","\\u2218",
"𝕊","\\uD835\\uDD4A",
"√","\\u221A",
"□","\\u25A1",
"⊓","\\u2293",
"⊏","\\u228F",
"⊑","\\u2291",
"⊐","\\u2290",
"⊒","\\u2292",
"⊔","\\u2294",
"𝒮","\\uD835\\uDCAE",
"⋆","\\u22C6",
"⋐","\\u22D0",
"⋐","\\u22D0",
"⊆","\\u2286",
"≻","\\u227B",
"⪰","\\u2AB0",
"≽","\\u227D",
"≿","\\u227F",
"∋","\\u220B",
"∑","\\u2211",
"⋑","\\u22D1",
"⊃","\\u2283",
"⊇","\\u2287",
"⋑","\\u22D1",
"Þ","\\u00DE",
"Þ","\\u00DE",
"™","\\u2122",
"Ћ","\\u040B",
"Ц","\\u0426",
"	","\\u0009",
"Τ","\\u03A4",
"Ť","\\u0164",
"Ţ","\\u0162",
"Т","\\u0422",
"𝔗","\\uD835\\uDD17",
"∴","\\u2234",
"Θ","\\u0398",
"  ","\\u205F\\u200A",
" ","\\u2009",
"∼","\\u223C",
"≃","\\u2243",
"≅","\\u2245",
"≈","\\u2248",
"𝕋","\\uD835\\uDD4B",
"⃛","\\u20DB",
"𝒯","\\uD835\\uDCAF",
"Ŧ","\\u0166",
"Ú","\\u00DA",
"Ú","\\u00DA",
"↟","\\u219F",
"⥉","\\u2949",
"Ў","\\u040E",
"Ŭ","\\u016C",
"Û","\\u00DB",
"Û","\\u00DB",
"У","\\u0423",
"Ű","\\u0170",
"𝔘","\\uD835\\uDD18",
"Ù","\\u00D9",
"Ù","\\u00D9",
"Ū","\\u016A",
"_","\\u005F",
"⏟","\\u23DF",
"⎵","\\u23B5",
"⏝","\\u23DD",
"⋃","\\u22C3",
"⊎","\\u228E",
"Ų","\\u0172",
"𝕌","\\uD835\\uDD4C",
"↑","\\u2191",
"⤒","\\u2912",
"⇅","\\u21C5",
"↕","\\u2195",
"⥮","\\u296E",
"⊥","\\u22A5",
"↥","\\u21A5",
"⇑","\\u21D1",
"⇕","\\u21D5",
"↖","\\u2196",
"↗","\\u2197",
"ϒ","\\u03D2",
"Υ","\\u03A5",
"Ů","\\u016E",
"𝒰","\\uD835\\uDCB0",
"Ũ","\\u0168",
"Ü","\\u00DC",
"Ü","\\u00DC",
"⊫","\\u22AB",
"⫫","\\u2AEB",
"В","\\u0412",
"⊩","\\u22A9",
"⫦","\\u2AE6",
"⋁","\\u22C1",
"‖","\\u2016",
"‖","\\u2016",
"∣","\\u2223",
"|","\\u007C",
"❘","\\u2758",
"≀","\\u2240",
" ","\\u200A",
"𝔙","\\uD835\\uDD19",
"𝕍","\\uD835\\uDD4D",
"𝒱","\\uD835\\uDCB1",
"⊪","\\u22AA",
"Ŵ","\\u0174",
"⋀","\\u22C0",
"𝔚","\\uD835\\uDD1A",
"𝕎","\\uD835\\uDD4E",
"𝒲","\\uD835\\uDCB2",
"𝔛","\\uD835\\uDD1B",
"Ξ","\\u039E",
"𝕏","\\uD835\\uDD4F",
"𝒳","\\uD835\\uDCB3",
"Я","\\u042F",
"Ї","\\u0407",
"Ю","\\u042E",
"Ý","\\u00DD",
"Ý","\\u00DD",
"Ŷ","\\u0176",
"Ы","\\u042B",
"𝔜","\\uD835\\uDD1C",
"𝕐","\\uD835\\uDD50",
"𝒴","\\uD835\\uDCB4",
"Ÿ","\\u0178",
"Ж","\\u0416",
"Ź","\\u0179",
"Ž","\\u017D",
"З","\\u0417",
"Ż","\\u017B",
"​","\\u200B",
"Ζ","\\u0396",
"ℨ","\\u2128",
"ℤ","\\u2124",
"𝒵","\\uD835\\uDCB5",
"á","\\u00E1",
"á","\\u00E1",
"ă","\\u0103",
"∾","\\u223E",
"∾̳","\\u223E\\u0333",
"∿","\\u223F",
"â","\\u00E2",
"â","\\u00E2",
"´","\\u00B4",
"´","\\u00B4",
"а","\\u0430",
"æ","\\u00E6",
"æ","\\u00E6",
"⁡","\\u2061",
"𝔞","\\uD835\\uDD1E",
"à","\\u00E0",
"à","\\u00E0",
"ℵ","\\u2135",
"ℵ","\\u2135",
"α","\\u03B1",
"ā","\\u0101",
"⨿","\\u2A3F",
"&","\\u0026",
"&","\\u0026",
"∧","\\u2227",
"⩕","\\u2A55",
"⩜","\\u2A5C",
"⩘","\\u2A58",
"⩚","\\u2A5A",
"∠","\\u2220",
"⦤","\\u29A4",
"∠","\\u2220",
"∡","\\u2221",
"⦨","\\u29A8",
"⦩","\\u29A9",
"⦪","\\u29AA",
"⦫","\\u29AB",
"⦬","\\u29AC",
"⦭","\\u29AD",
"⦮","\\u29AE",
"⦯","\\u29AF",
"∟","\\u221F",
"⊾","\\u22BE",
"⦝","\\u299D",
"∢","\\u2222",
"Å","\\u00C5",
"⍼","\\u237C",
"ą","\\u0105",
"𝕒","\\uD835\\uDD52",
"≈","\\u2248",
"⩰","\\u2A70",
"⩯","\\u2A6F",
"≊","\\u224A",
"≋","\\u224B",
"'","\\u0027",
"≈","\\u2248",
"≊","\\u224A",
"å","\\u00E5",
"å","\\u00E5",
"𝒶","\\uD835\\uDCB6",
"*","\\u002A",
"≈","\\u2248",
"≍","\\u224D",
"ã","\\u00E3",
"ã","\\u00E3",
"ä","\\u00E4",
"ä","\\u00E4",
"∳","\\u2233",
"⨑","\\u2A11",
"⫭","\\u2AED",
"≌","\\u224C",
"϶","\\u03F6",
"‵","\\u2035",
"∽","\\u223D",
"⋍","\\u22CD",
"⊽","\\u22BD",
"⌅","\\u2305",
"⌅","\\u2305",
"⎵","\\u23B5",
"⎶","\\u23B6",
"≌","\\u224C",
"б","\\u0431",
"„","\\u201E",
"∵","\\u2235",
"∵","\\u2235",
"⦰","\\u29B0",
"϶","\\u03F6",
"ℬ","\\u212C",
"β","\\u03B2",
"ℶ","\\u2136",
"≬","\\u226C",
"𝔟","\\uD835\\uDD1F",
"⋂","\\u22C2",
"◯","\\u25EF",
"⋃","\\u22C3",
"⨀","\\u2A00",
"⨁","\\u2A01",
"⨂","\\u2A02",
"⨆","\\u2A06",
"★","\\u2605",
"▽","\\u25BD",
"△","\\u25B3",
"⨄","\\u2A04",
"⋁","\\u22C1",
"⋀","\\u22C0",
"⤍","\\u290D",
"⧫","\\u29EB",
"▪","\\u25AA",
"▴","\\u25B4",
"▾","\\u25BE",
"◂","\\u25C2",
"▸","\\u25B8",
"␣","\\u2423",
"▒","\\u2592",
"░","\\u2591",
"▓","\\u2593",
"█","\\u2588",
"=⃥","\\u003D\\u20E5",
"≡⃥","\\u2261\\u20E5",
"⌐","\\u2310",
"𝕓","\\uD835\\uDD53",
"⊥","\\u22A5",
"⊥","\\u22A5",
"⋈","\\u22C8",
"╗","\\u2557",
"╔","\\u2554",
"╖","\\u2556",
"╓","\\u2553",
"═","\\u2550",
"╦","\\u2566",
"╩","\\u2569",
"╤","\\u2564",
"╧","\\u2567",
"╝","\\u255D",
"╚","\\u255A",
"╜","\\u255C",
"╙","\\u2559",
"║","\\u2551",
"╬","\\u256C",
"╣","\\u2563",
"╠","\\u2560",
"╫","\\u256B",
"╢","\\u2562",
"╟","\\u255F",
"⧉","\\u29C9",
"╕","\\u2555",
"╒","\\u2552",
"┐","\\u2510",
"┌","\\u250C",
"─","\\u2500",
"╥","\\u2565",
"╨","\\u2568",
"┬","\\u252C",
"┴","\\u2534",
"⊟","\\u229F",
"⊞","\\u229E",
"⊠","\\u22A0",
"╛","\\u255B",
"╘","\\u2558",
"┘","\\u2518",
"└","\\u2514",
"│","\\u2502",
"╪","\\u256A",
"╡","\\u2561",
"╞","\\u255E",
"┼","\\u253C",
"┤","\\u2524",
"├","\\u251C",
"‵","\\u2035",
"˘","\\u02D8",
"¦","\\u00A6",
"¦","\\u00A6",
"𝒷","\\uD835\\uDCB7",
"⁏","\\u204F",
"∽","\\u223D",
"⋍","\\u22CD",
"\","\\u005C",
"⧅","\\u29C5",
"⟈","\\u27C8",
"•","\\u2022",
"•","\\u2022",
"≎","\\u224E",
"⪮","\\u2AAE",
"≏","\\u224F",
"≏","\\u224F",
"ć","\\u0107",
"∩","\\u2229",
"⩄","\\u2A44",
"⩉","\\u2A49",
"⩋","\\u2A4B",
"⩇","\\u2A47",
"⩀","\\u2A40",
"∩︀","\\u2229\\uFE00",
"⁁","\\u2041",
"ˇ","\\u02C7",
"⩍","\\u2A4D",
"č","\\u010D",
"ç","\\u00E7",
"ç","\\u00E7",
"ĉ","\\u0109",
"⩌","\\u2A4C",
"⩐","\\u2A50",
"ċ","\\u010B",
"¸","\\u00B8",
"¸","\\u00B8",
"⦲","\\u29B2",
"¢","\\u00A2",
"¢","\\u00A2",
"·","\\u00B7",
"𝔠","\\uD835\\uDD20",
"ч","\\u0447",
"✓","\\u2713",
"✓","\\u2713",
"χ","\\u03C7",
"○","\\u25CB",
"⧃","\\u29C3",
"ˆ","\\u02C6",
"≗","\\u2257",
"↺","\\u21BA",
"↻","\\u21BB",
"®","\\u00AE",
"Ⓢ","\\u24C8",
"⊛","\\u229B",
"⊚","\\u229A",
"⊝","\\u229D",
"≗","\\u2257",
"⨐","\\u2A10",
"⫯","\\u2AEF",
"⧂","\\u29C2",
"♣","\\u2663",
"♣","\\u2663",
":","\\u003A",
"≔","\\u2254",
"≔","\\u2254",
",","\\u002C",
"@","\\u0040",
"∁","\\u2201",
"∘","\\u2218",
"∁","\\u2201",
"ℂ","\\u2102",
"≅","\\u2245",
"⩭","\\u2A6D",
"∮","\\u222E",
"𝕔","\\uD835\\uDD54",
"∐","\\u2210",
"©","\\u00A9",
"©","\\u00A9",
"℗","\\u2117",
"↵","\\u21B5",
"✗","\\u2717",
"𝒸","\\uD835\\uDCB8",
"⫏","\\u2ACF",
"⫑","\\u2AD1",
"⫐","\\u2AD0",
"⫒","\\u2AD2",
"⋯","\\u22EF",
"⤸","\\u2938",
"⤵","\\u2935",
"⋞","\\u22DE",
"⋟","\\u22DF",
"↶","\\u21B6",
"⤽","\\u293D",
"∪","\\u222A",
"⩈","\\u2A48",
"⩆","\\u2A46",
"⩊","\\u2A4A",
"⊍","\\u228D",
"⩅","\\u2A45",
"∪︀","\\u222A\\uFE00",
"↷","\\u21B7",
"⤼","\\u293C",
"⋞","\\u22DE",
"⋟","\\u22DF",
"⋎","\\u22CE",
"⋏","\\u22CF",
"¤","\\u00A4",
"¤","\\u00A4",
"↶","\\u21B6",
"↷","\\u21B7",
"⋎","\\u22CE",
"⋏","\\u22CF",
"∲","\\u2232",
"∱","\\u2231",
"⌭","\\u232D",
"⇓","\\u21D3",
"⥥","\\u2965",
"†","\\u2020",
"ℸ","\\u2138",
"↓","\\u2193",
"‐","\\u2010",
"⊣","\\u22A3",
"⤏","\\u290F",
"˝","\\u02DD",
"ď","\\u010F",
"д","\\u0434",
"ⅆ","\\u2146",
"‡","\\u2021",
"⇊","\\u21CA",
"⩷","\\u2A77",
"°","\\u00B0",
"°","\\u00B0",
"δ","\\u03B4",
"⦱","\\u29B1",
"⥿","\\u297F",
"𝔡","\\uD835\\uDD21",
"⇃","\\u21C3",
"⇂","\\u21C2",
"⋄","\\u22C4",
"⋄","\\u22C4",
"♦","\\u2666",
"♦","\\u2666",
"¨","\\u00A8",
"ϝ","\\u03DD",
"⋲","\\u22F2",
"÷","\\u00F7",
"÷","\\u00F7",
"÷","\\u00F7",
"⋇","\\u22C7",
"⋇","\\u22C7",
"ђ","\\u0452",
"⌞","\\u231E",
"⌍","\\u230D",
"$","\\u0024",
"𝕕","\\uD835\\uDD55",
"˙","\\u02D9",
"≐","\\u2250",
"≑","\\u2251",
"∸","\\u2238",
"∔","\\u2214",
"⊡","\\u22A1",
"⌆","\\u2306",
"↓","\\u2193",
"⇊","\\u21CA",
"⇃","\\u21C3",
"⇂","\\u21C2",
"⤐","\\u2910",
"⌟","\\u231F",
"⌌","\\u230C",
"𝒹","\\uD835\\uDCB9",
"ѕ","\\u0455",
"⧶","\\u29F6",
"đ","\\u0111",
"⋱","\\u22F1",
"▿","\\u25BF",
"▾","\\u25BE",
"⇵","\\u21F5",
"⥯","\\u296F",
"⦦","\\u29A6",
"џ","\\u045F",
"⟿","\\u27FF",
"⩷","\\u2A77",
"≑","\\u2251",
"é","\\u00E9",
"é","\\u00E9",
"⩮","\\u2A6E",
"ě","\\u011B",
"≖","\\u2256",
"ê","\\u00EA",
"ê","\\u00EA",
"≕","\\u2255",
"э","\\u044D",
"ė","\\u0117",
"ⅇ","\\u2147",
"≒","\\u2252",
"𝔢","\\uD835\\uDD22",
"⪚","\\u2A9A",
"è","\\u00E8",
"è","\\u00E8",
"⪖","\\u2A96",
"⪘","\\u2A98",
"⪙","\\u2A99",
"⏧","\\u23E7",
"ℓ","\\u2113",
"⪕","\\u2A95",
"⪗","\\u2A97",
"ē","\\u0113",
"∅","\\u2205",
"∅","\\u2205",
"∅","\\u2205",
" ","\\u2004",
" ","\\u2005",
" ","\\u2003",
"ŋ","\\u014B",
" ","\\u2002",
"ę","\\u0119",
"𝕖","\\uD835\\uDD56",
"⋕","\\u22D5",
"⧣","\\u29E3",
"⩱","\\u2A71",
"ε","\\u03B5",
"ε","\\u03B5",
"ϵ","\\u03F5",
"≖","\\u2256",
"≕","\\u2255",
"≂","\\u2242",
"⪖","\\u2A96",
"⪕","\\u2A95",
"=","\\u003D",
"≟","\\u225F",
"≡","\\u2261",
"⩸","\\u2A78",
"⧥","\\u29E5",
"≓","\\u2253",
"⥱","\\u2971",
"ℯ","\\u212F",
"≐","\\u2250",
"≂","\\u2242",
"η","\\u03B7",
"ð","\\u00F0",
"ð","\\u00F0",
"ë","\\u00EB",
"ë","\\u00EB",
"€","\\u20AC",
"!","\\u0021",
"∃","\\u2203",
"ℰ","\\u2130",
"ⅇ","\\u2147",
"≒","\\u2252",
"ф","\\u0444",
"♀","\\u2640",
"ffi","\\uFB03",
"ff","\\uFB00",
"ffl","\\uFB04",
"𝔣","\\uD835\\uDD23",
"fi","\\uFB01",
"fj","\\u0066\\u006A",
"♭","\\u266D",
"fl","\\uFB02",
"▱","\\u25B1",
"ƒ","\\u0192",
"𝕗","\\uD835\\uDD57",
"∀","\\u2200",
"⋔","\\u22D4",
"⫙","\\u2AD9",
"⨍","\\u2A0D",
"½","\\u00BD",
"½","\\u00BD",
"⅓","\\u2153",
"¼","\\u00BC",
"¼","\\u00BC",
"⅕","\\u2155",
"⅙","\\u2159",
"⅛","\\u215B",
"⅔","\\u2154",
"⅖","\\u2156",
"¾","\\u00BE",
"¾","\\u00BE",
"⅗","\\u2157",
"⅜","\\u215C",
"⅘","\\u2158",
"⅚","\\u215A",
"⅝","\\u215D",
"⅞","\\u215E",
"⁄","\\u2044",
"⌢","\\u2322",
"𝒻","\\uD835\\uDCBB",
"≧","\\u2267",
"⪌","\\u2A8C",
"ǵ","\\u01F5",
"γ","\\u03B3",
"ϝ","\\u03DD",
"⪆","\\u2A86",
"ğ","\\u011F",
"ĝ","\\u011D",
"г","\\u0433",
"ġ","\\u0121",
"≥","\\u2265",
"⋛","\\u22DB",
"≥","\\u2265",
"≧","\\u2267",
"⩾","\\u2A7E",
"⩾","\\u2A7E",
"⪩","\\u2AA9",
"⪀","\\u2A80",
"⪂","\\u2A82",
"⪄","\\u2A84",
"⋛︀","\\u22DB\\uFE00",
"⪔","\\u2A94",
"𝔤","\\uD835\\uDD24",
"≫","\\u226B",
"⋙","\\u22D9",
"ℷ","\\u2137",
"ѓ","\\u0453",
"≷","\\u2277",
"⪒","\\u2A92",
"⪥","\\u2AA5",
"⪤","\\u2AA4",
"≩","\\u2269",
"⪊","\\u2A8A",
"⪊","\\u2A8A",
"⪈","\\u2A88",
"⪈","\\u2A88",
"≩","\\u2269",
"⋧","\\u22E7",
"𝕘","\\uD835\\uDD58",
"`","\\u0060",
"ℊ","\\u210A",
"≳","\\u2273",
"⪎","\\u2A8E",
"⪐","\\u2A90",
">","\\u003E",
">","\\u003E",
"⪧","\\u2AA7",
"⩺","\\u2A7A",
"⋗","\\u22D7",
"⦕","\\u2995",
"⩼","\\u2A7C",
"⪆","\\u2A86",
"⥸","\\u2978",
"⋗","\\u22D7",
"⋛","\\u22DB",
"⪌","\\u2A8C",
"≷","\\u2277",
"≳","\\u2273",
"≩︀","\\u2269\\uFE00",
"≩︀","\\u2269\\uFE00",
"⇔","\\u21D4",
" ","\\u200A",
"½","\\u00BD",
"ℋ","\\u210B",
"ъ","\\u044A",
"↔","\\u2194",
"⥈","\\u2948",
"↭","\\u21AD",
"ℏ","\\u210F",
"ĥ","\\u0125",
"♥","\\u2665",
"♥","\\u2665",
"…","\\u2026",
"⊹","\\u22B9",
"𝔥","\\uD835\\uDD25",
"⤥","\\u2925",
"⤦","\\u2926",
"⇿","\\u21FF",
"∻","\\u223B",
"↩","\\u21A9",
"↪","\\u21AA",
"𝕙","\\uD835\\uDD59",
"―","\\u2015",
"𝒽","\\uD835\\uDCBD",
"ℏ","\\u210F",
"ħ","\\u0127",
"⁃","\\u2043",
"‐","\\u2010",
"í","\\u00ED",
"í","\\u00ED",
"⁣","\\u2063",
"î","\\u00EE",
"î","\\u00EE",
"и","\\u0438",
"е","\\u0435",
"¡","\\u00A1",
"¡","\\u00A1",
"⇔","\\u21D4",
"𝔦","\\uD835\\uDD26",
"ì","\\u00EC",
"ì","\\u00EC",
"ⅈ","\\u2148",
"⨌","\\u2A0C",
"∭","\\u222D",
"⧜","\\u29DC",
"℩","\\u2129",
"ij","\\u0133",
"ī","\\u012B",
"ℑ","\\u2111",
"ℐ","\\u2110",
"ℑ","\\u2111",
"ı","\\u0131",
"⊷","\\u22B7",
"Ƶ","\\u01B5",
"∈","\\u2208",
"℅","\\u2105",
"∞","\\u221E",
"⧝","\\u29DD",
"ı","\\u0131",
"∫","\\u222B",
"⊺","\\u22BA",
"ℤ","\\u2124",
"⊺","\\u22BA",
"⨗","\\u2A17",
"⨼","\\u2A3C",
"ё","\\u0451",
"į","\\u012F",
"𝕚","\\uD835\\uDD5A",
"ι","\\u03B9",
"⨼","\\u2A3C",
"¿","\\u00BF",
"¿","\\u00BF",
"𝒾","\\uD835\\uDCBE",
"∈","\\u2208",
"⋹","\\u22F9",
"⋵","\\u22F5",
"⋴","\\u22F4",
"⋳","\\u22F3",
"∈","\\u2208",
"⁢","\\u2062",
"ĩ","\\u0129",
"і","\\u0456",
"ï","\\u00EF",
"ï","\\u00EF",
"ĵ","\\u0135",
"й","\\u0439",
"𝔧","\\uD835\\uDD27",
"ȷ","\\u0237",
"𝕛","\\uD835\\uDD5B",
"𝒿","\\uD835\\uDCBF",
"ј","\\u0458",
"є","\\u0454",
"κ","\\u03BA",
"ϰ","\\u03F0",
"ķ","\\u0137",
"к","\\u043A",
"𝔨","\\uD835\\uDD28",
"ĸ","\\u0138",
"х","\\u0445",
"ќ","\\u045C",
"𝕜","\\uD835\\uDD5C",
"𝓀","\\uD835\\uDCC0",
"⇚","\\u21DA",
"⇐","\\u21D0",
"⤛","\\u291B",
"⤎","\\u290E",
"≦","\\u2266",
"⪋","\\u2A8B",
"⥢","\\u2962",
"ĺ","\\u013A",
"⦴","\\u29B4",
"ℒ","\\u2112",
"λ","\\u03BB",
"⟨","\\u27E8",
"⦑","\\u2991",
"⟨","\\u27E8",
"⪅","\\u2A85",
"«","\\u00AB",
"«","\\u00AB",
"←","\\u2190",
"⇤","\\u21E4",
"⤟","\\u291F",
"⤝","\\u291D",
"↩","\\u21A9",
"↫","\\u21AB",
"⤹","\\u2939",
"⥳","\\u2973",
"↢","\\u21A2",
"⪫","\\u2AAB",
"⤙","\\u2919",
"⪭","\\u2AAD",
"⪭︀","\\u2AAD\\uFE00",
"⤌","\\u290C",
"❲","\\u2772",
"{","\\u007B",
"[","\\u005B",
"⦋","\\u298B",
"⦏","\\u298F",
"⦍","\\u298D",
"ľ","\\u013E",
"ļ","\\u013C",
"⌈","\\u2308",
"{","\\u007B",
"л","\\u043B",
"⤶","\\u2936",
"“","\\u201C",
"„","\\u201E",
"⥧","\\u2967",
"⥋","\\u294B",
"↲","\\u21B2",
"≤","\\u2264",
"←","\\u2190",
"↢","\\u21A2",
"↽","\\u21BD",
"↼","\\u21BC",
"⇇","\\u21C7",
"↔","\\u2194",
"⇆","\\u21C6",
"⇋","\\u21CB",
"↭","\\u21AD",
"⋋","\\u22CB",
"⋚","\\u22DA",
"≤","\\u2264",
"≦","\\u2266",
"⩽","\\u2A7D",
"⩽","\\u2A7D",
"⪨","\\u2AA8",
"⩿","\\u2A7F",
"⪁","\\u2A81",
"⪃","\\u2A83",
"⋚︀","\\u22DA\\uFE00",
"⪓","\\u2A93",
"⪅","\\u2A85",
"⋖","\\u22D6",
"⋚","\\u22DA",
"⪋","\\u2A8B",
"≶","\\u2276",
"≲","\\u2272",
"⥼","\\u297C",
"⌊","\\u230A",
"𝔩","\\uD835\\uDD29",
"≶","\\u2276",
"⪑","\\u2A91",
"↽","\\u21BD",
"↼","\\u21BC",
"⥪","\\u296A",
"▄","\\u2584",
"љ","\\u0459",
"≪","\\u226A",
"⇇","\\u21C7",
"⌞","\\u231E",
"⥫","\\u296B",
"◺","\\u25FA",
"ŀ","\\u0140",
"⎰","\\u23B0",
"⎰","\\u23B0",
"≨","\\u2268",
"⪉","\\u2A89",
"⪉","\\u2A89",
"⪇","\\u2A87",
"⪇","\\u2A87",
"≨","\\u2268",
"⋦","\\u22E6",
"⟬","\\u27EC",
"⇽","\\u21FD",
"⟦","\\u27E6",
"⟵","\\u27F5",
"⟷","\\u27F7",
"⟼","\\u27FC",
"⟶","\\u27F6",
"↫","\\u21AB",
"↬","\\u21AC",
"⦅","\\u2985",
"𝕝","\\uD835\\uDD5D",
"⨭","\\u2A2D",
"⨴","\\u2A34",
"∗","\\u2217",
"_","\\u005F",
"◊","\\u25CA",
"◊","\\u25CA",
"⧫","\\u29EB",
"(","\\u0028",
"⦓","\\u2993",
"⇆","\\u21C6",
"⌟","\\u231F",
"⇋","\\u21CB",
"⥭","\\u296D",
"‎","\\u200E",
"⊿","\\u22BF",
"‹","\\u2039",
"𝓁","\\uD835\\uDCC1",
"↰","\\u21B0",
"≲","\\u2272",
"⪍","\\u2A8D",
"⪏","\\u2A8F",
"[","\\u005B",
"‘","\\u2018",
"‚","\\u201A",
"ł","\\u0142",
"<","\\u003C",
"<","\\u003C",
"⪦","\\u2AA6",
"⩹","\\u2A79",
"⋖","\\u22D6",
"⋋","\\u22CB",
"⋉","\\u22C9",
"⥶","\\u2976",
"⩻","\\u2A7B",
"⦖","\\u2996",
"◃","\\u25C3",
"⊴","\\u22B4",
"◂","\\u25C2",
"⥊","\\u294A",
"⥦","\\u2966",
"≨︀","\\u2268\\uFE00",
"≨︀","\\u2268\\uFE00",
"∺","\\u223A",
"¯","\\u00AF",
"¯","\\u00AF",
"♂","\\u2642",
"✠","\\u2720",
"✠","\\u2720",
"↦","\\u21A6",
"↦","\\u21A6",
"↧","\\u21A7",
"↤","\\u21A4",
"↥","\\u21A5",
"▮","\\u25AE",
"⨩","\\u2A29",
"м","\\u043C",
"—","\\u2014",
"∡","\\u2221",
"𝔪","\\uD835\\uDD2A",
"℧","\\u2127",
"µ","\\u00B5",
"µ","\\u00B5",
"∣","\\u2223",
"*","\\u002A",
"⫰","\\u2AF0",
"·","\\u00B7",
"·","\\u00B7",
"−","\\u2212",
"⊟","\\u229F",
"∸","\\u2238",
"⨪","\\u2A2A",
"⫛","\\u2ADB",
"…","\\u2026",
"∓","\\u2213",
"⊧","\\u22A7",
"𝕞","\\uD835\\uDD5E",
"∓","\\u2213",
"𝓂","\\uD835\\uDCC2",
"∾","\\u223E",
"μ","\\u03BC",
"⊸","\\u22B8",
"⊸","\\u22B8",
"⋙̸","\\u22D9\\u0338",
"≫⃒","\\u226B\\u20D2",
"≫̸","\\u226B\\u0338",
"⇍","\\u21CD",
"⇎","\\u21CE",
"⋘̸","\\u22D8\\u0338",
"≪⃒","\\u226A\\u20D2",
"≪̸","\\u226A\\u0338",
"⇏","\\u21CF",
"⊯","\\u22AF",
"⊮","\\u22AE",
"∇","\\u2207",
"ń","\\u0144",
"∠⃒","\\u2220\\u20D2",
"≉","\\u2249",
"⩰̸","\\u2A70\\u0338",
"≋̸","\\u224B\\u0338",
"ʼn","\\u0149",
"≉","\\u2249",
"♮","\\u266E",
"♮","\\u266E",
"ℕ","\\u2115",
" ","\\u00A0",
" ","\\u00A0",
"≎̸","\\u224E\\u0338",
"≏̸","\\u224F\\u0338",
"⩃","\\u2A43",
"ň","\\u0148",
"ņ","\\u0146",
"≇","\\u2247",
"⩭̸","\\u2A6D\\u0338",
"⩂","\\u2A42",
"н","\\u043D",
"–","\\u2013",
"≠","\\u2260",
"⇗","\\u21D7",
"⤤","\\u2924",
"↗","\\u2197",
"↗","\\u2197",
"≐̸","\\u2250\\u0338",
"≢","\\u2262",
"⤨","\\u2928",
"≂̸","\\u2242\\u0338",
"∄","\\u2204",
"∄","\\u2204",
"𝔫","\\uD835\\uDD2B",
"≧̸","\\u2267\\u0338",
"≱","\\u2271",
"≱","\\u2271",
"≧̸","\\u2267\\u0338",
"⩾̸","\\u2A7E\\u0338",
"⩾̸","\\u2A7E\\u0338",
"≵","\\u2275",
"≯","\\u226F",
"≯","\\u226F",
"⇎","\\u21CE",
"↮","\\u21AE",
"⫲","\\u2AF2",
"∋","\\u220B",
"⋼","\\u22FC",
"⋺","\\u22FA",
"∋","\\u220B",
"њ","\\u045A",
"⇍","\\u21CD",
"≦̸","\\u2266\\u0338",
"↚","\\u219A",
"‥","\\u2025",
"≰","\\u2270",
"↚","\\u219A",
"↮","\\u21AE",
"≰","\\u2270",
"≦̸","\\u2266\\u0338",
"⩽̸","\\u2A7D\\u0338",
"⩽̸","\\u2A7D\\u0338",
"≮","\\u226E",
"≴","\\u2274",
"≮","\\u226E",
"⋪","\\u22EA",
"⋬","\\u22EC",
"∤","\\u2224",
"𝕟","\\uD835\\uDD5F",
"¬","\\u00AC",
"¬","\\u00AC",
"∉","\\u2209",
"⋹̸","\\u22F9\\u0338",
"⋵̸","\\u22F5\\u0338",
"∉","\\u2209",
"⋷","\\u22F7",
"⋶","\\u22F6",
"∌","\\u220C",
"∌","\\u220C",
"⋾","\\u22FE",
"⋽","\\u22FD",
"∦","\\u2226",
"∦","\\u2226",
"⫽⃥","\\u2AFD\\u20E5",
"∂̸","\\u2202\\u0338",
"⨔","\\u2A14",
"⊀","\\u2280",
"⋠","\\u22E0",
"⪯̸","\\u2AAF\\u0338",
"⊀","\\u2280",
"⪯̸","\\u2AAF\\u0338",
"⇏","\\u21CF",
"↛","\\u219B",
"⤳̸","\\u2933\\u0338",
"↝̸","\\u219D\\u0338",
"↛","\\u219B",
"⋫","\\u22EB",
"⋭","\\u22ED",
"⊁","\\u2281",
"⋡","\\u22E1",
"⪰̸","\\u2AB0\\u0338",
"𝓃","\\uD835\\uDCC3",
"∤","\\u2224",
"∦","\\u2226",
"≁","\\u2241",
"≄","\\u2244",
"≄","\\u2244",
"∤","\\u2224",
"∦","\\u2226",
"⋢","\\u22E2",
"⋣","\\u22E3",
"⊄","\\u2284",
"⫅̸","\\u2AC5\\u0338",
"⊈","\\u2288",
"⊂⃒","\\u2282\\u20D2",
"⊈","\\u2288",
"⫅̸","\\u2AC5\\u0338",
"⊁","\\u2281",
"⪰̸","\\u2AB0\\u0338",
"⊅","\\u2285",
"⫆̸","\\u2AC6\\u0338",
"⊉","\\u2289",
"⊃⃒","\\u2283\\u20D2",
"⊉","\\u2289",
"⫆̸","\\u2AC6\\u0338",
"≹","\\u2279",
"ñ","\\u00F1",
"ñ","\\u00F1",
"≸","\\u2278",
"⋪","\\u22EA",
"⋬","\\u22EC",
"⋫","\\u22EB",
"⋭","\\u22ED",
"ν","\\u03BD",
"#","\\u0023",
"№","\\u2116",
" ","\\u2007",
"⊭","\\u22AD",
"⤄","\\u2904",
"≍⃒","\\u224D\\u20D2",
"⊬","\\u22AC",
"≥⃒","\\u2265\\u20D2",
">⃒","\\u003E\\u20D2",
"⧞","\\u29DE",
"⤂","\\u2902",
"≤⃒","\\u2264\\u20D2",
"<⃒","\\u003C\\u20D2",
"⊴⃒","\\u22B4\\u20D2",
"⤃","\\u2903",
"⊵⃒","\\u22B5\\u20D2",
"∼⃒","\\u223C\\u20D2",
"⇖","\\u21D6",
"⤣","\\u2923",
"↖","\\u2196",
"↖","\\u2196",
"⤧","\\u2927",
"Ⓢ","\\u24C8",
"ó","\\u00F3",
"ó","\\u00F3",
"⊛","\\u229B",
"⊚","\\u229A",
"ô","\\u00F4",
"ô","\\u00F4",
"о","\\u043E",
"⊝","\\u229D",
"ő","\\u0151",
"⨸","\\u2A38",
"⊙","\\u2299",
"⦼","\\u29BC",
"œ","\\u0153",
"⦿","\\u29BF",
"𝔬","\\uD835\\uDD2C",
"˛","\\u02DB",
"ò","\\u00F2",
"ò","\\u00F2",
"⧁","\\u29C1",
"⦵","\\u29B5",
"Ω","\\u03A9",
"∮","\\u222E",
"↺","\\u21BA",
"⦾","\\u29BE",
"⦻","\\u29BB",
"‾","\\u203E",
"⧀","\\u29C0",
"ō","\\u014D",
"ω","\\u03C9",
"ο","\\u03BF",
"⦶","\\u29B6",
"⊖","\\u2296",
"𝕠","\\uD835\\uDD60",
"⦷","\\u29B7",
"⦹","\\u29B9",
"⊕","\\u2295",
"∨","\\u2228",
"↻","\\u21BB",
"⩝","\\u2A5D",
"ℴ","\\u2134",
"ℴ","\\u2134",
"ª","\\u00AA",
"ª","\\u00AA",
"º","\\u00BA",
"º","\\u00BA",
"⊶","\\u22B6",
"⩖","\\u2A56",
"⩗","\\u2A57",
"⩛","\\u2A5B",
"ℴ","\\u2134",
"ø","\\u00F8",
"ø","\\u00F8",
"⊘","\\u2298",
"õ","\\u00F5",
"õ","\\u00F5",
"⊗","\\u2297",
"⨶","\\u2A36",
"ö","\\u00F6",
"ö","\\u00F6",
"⌽","\\u233D",
"∥","\\u2225",
"¶","\\u00B6",
"¶","\\u00B6",
"∥","\\u2225",
"⫳","\\u2AF3",
"⫽","\\u2AFD",
"∂","\\u2202",
"п","\\u043F",
"%","\\u0025",
".","\\u002E",
"‰","\\u2030",
"⊥","\\u22A5",
"‱","\\u2031",
"𝔭","\\uD835\\uDD2D",
"φ","\\u03C6",
"ϕ","\\u03D5",
"ℳ","\\u2133",
"☎","\\u260E",
"π","\\u03C0",
"⋔","\\u22D4",
"ϖ","\\u03D6",
"ℏ","\\u210F",
"ℎ","\\u210E",
"ℏ","\\u210F",
"+","\\u002B",
"⨣","\\u2A23",
"⊞","\\u229E",
"⨢","\\u2A22",
"∔","\\u2214",
"⨥","\\u2A25",
"⩲","\\u2A72",
"±","\\u00B1",
"±","\\u00B1",
"⨦","\\u2A26",
"⨧","\\u2A27",
"±","\\u00B1",
"⨕","\\u2A15",
"𝕡","\\uD835\\uDD61",
"£","\\u00A3",
"£","\\u00A3",
"≺","\\u227A",
"⪳","\\u2AB3",
"⪷","\\u2AB7",
"≼","\\u227C",
"⪯","\\u2AAF",
"≺","\\u227A",
"⪷","\\u2AB7",
"≼","\\u227C",
"⪯","\\u2AAF",
"⪹","\\u2AB9",
"⪵","\\u2AB5",
"⋨","\\u22E8",
"≾","\\u227E",
"′","\\u2032",
"ℙ","\\u2119",
"⪵","\\u2AB5",
"⪹","\\u2AB9",
"⋨","\\u22E8",
"∏","\\u220F",
"⌮","\\u232E",
"⌒","\\u2312",
"⌓","\\u2313",
"∝","\\u221D",
"∝","\\u221D",
"≾","\\u227E",
"⊰","\\u22B0",
"𝓅","\\uD835\\uDCC5",
"ψ","\\u03C8",
" ","\\u2008",
"𝔮","\\uD835\\uDD2E",
"⨌","\\u2A0C",
"𝕢","\\uD835\\uDD62",
"⁗","\\u2057",
"𝓆","\\uD835\\uDCC6",
"ℍ","\\u210D",
"⨖","\\u2A16",
"?","\\u003F",
"≟","\\u225F",
""","\\u0022",
""","\\u0022",
"⇛","\\u21DB",
"⇒","\\u21D2",
"⤜","\\u291C",
"⤏","\\u290F",
"⥤","\\u2964",
"∽̱","\\u223D\\u0331",
"ŕ","\\u0155",
"√","\\u221A",
"⦳","\\u29B3",
"⟩","\\u27E9",
"⦒","\\u2992",
"⦥","\\u29A5",
"⟩","\\u27E9",
"»","\\u00BB",
"»","\\u00BB",
"→","\\u2192",
"⥵","\\u2975",
"⇥","\\u21E5",
"⤠","\\u2920",
"⤳","\\u2933",
"⤞","\\u291E",
"↪","\\u21AA",
"↬","\\u21AC",
"⥅","\\u2945",
"⥴","\\u2974",
"↣","\\u21A3",
"↝","\\u219D",
"⤚","\\u291A",
"∶","\\u2236",
"ℚ","\\u211A",
"⤍","\\u290D",
"❳","\\u2773",
"}","\\u007D",
"]","\\u005D",
"⦌","\\u298C",
"⦎","\\u298E",
"⦐","\\u2990",
"ř","\\u0159",
"ŗ","\\u0157",
"⌉","\\u2309",
"}","\\u007D",
"р","\\u0440",
"⤷","\\u2937",
"⥩","\\u2969",
"”","\\u201D",
"”","\\u201D",
"↳","\\u21B3",
"ℜ","\\u211C",
"ℛ","\\u211B",
"ℜ","\\u211C",
"ℝ","\\u211D",
"▭","\\u25AD",
"®","\\u00AE",
"®","\\u00AE",
"⥽","\\u297D",
"⌋","\\u230B",
"𝔯","\\uD835\\uDD2F",
"⇁","\\u21C1",
"⇀","\\u21C0",
"⥬","\\u296C",
"ρ","\\u03C1",
"ϱ","\\u03F1",
"→","\\u2192",
"↣","\\u21A3",
"⇁","\\u21C1",
"⇀","\\u21C0",
"⇄","\\u21C4",
"⇌","\\u21CC",
"⇉","\\u21C9",
"↝","\\u219D",
"⋌","\\u22CC",
"˚","\\u02DA",
"≓","\\u2253",
"⇄","\\u21C4",
"⇌","\\u21CC",
"‏","\\u200F",
"⎱","\\u23B1",
"⎱","\\u23B1",
"⫮","\\u2AEE",
"⟭","\\u27ED",
"⇾","\\u21FE",
"⟧","\\u27E7",
"⦆","\\u2986",
"𝕣","\\uD835\\uDD63",
"⨮","\\u2A2E",
"⨵","\\u2A35",
")","\\u0029",
"⦔","\\u2994",
"⨒","\\u2A12",
"⇉","\\u21C9",
"›","\\u203A",
"𝓇","\\uD835\\uDCC7",
"↱","\\u21B1",
"]","\\u005D",
"’","\\u2019",
"’","\\u2019",
"⋌","\\u22CC",
"⋊","\\u22CA",
"▹","\\u25B9",
"⊵","\\u22B5",
"▸","\\u25B8",
"⧎","\\u29CE",
"⥨","\\u2968",
"℞","\\u211E",
"ś","\\u015B",
"‚","\\u201A",
"≻","\\u227B",
"⪴","\\u2AB4",
"⪸","\\u2AB8",
"š","\\u0161",
"≽","\\u227D",
"⪰","\\u2AB0",
"ş","\\u015F",
"ŝ","\\u015D",
"⪶","\\u2AB6",
"⪺","\\u2ABA",
"⋩","\\u22E9",
"⨓","\\u2A13",
"≿","\\u227F",
"с","\\u0441",
"⋅","\\u22C5",
"⊡","\\u22A1",
"⩦","\\u2A66",
"⇘","\\u21D8",
"⤥","\\u2925",
"↘","\\u2198",
"↘","\\u2198",
"§","\\u00A7",
"§","\\u00A7",
";","\\u003B",
"⤩","\\u2929",
"∖","\\u2216",
"∖","\\u2216",
"✶","\\u2736",
"𝔰","\\uD835\\uDD30",
"⌢","\\u2322",
"♯","\\u266F",
"щ","\\u0449",
"ш","\\u0448",
"∣","\\u2223",
"∥","\\u2225",
"­","\\u00AD",
"­","\\u00AD",
"σ","\\u03C3",
"ς","\\u03C2",
"ς","\\u03C2",
"∼","\\u223C",
"⩪","\\u2A6A",
"≃","\\u2243",
"≃","\\u2243",
"⪞","\\u2A9E",
"⪠","\\u2AA0",
"⪝","\\u2A9D",
"⪟","\\u2A9F",
"≆","\\u2246",
"⨤","\\u2A24",
"⥲","\\u2972",
"←","\\u2190",
"∖","\\u2216",
"⨳","\\u2A33",
"⧤","\\u29E4",
"∣","\\u2223",
"⌣","\\u2323",
"⪪","\\u2AAA",
"⪬","\\u2AAC",
"⪬︀","\\u2AAC\\uFE00",
"ь","\\u044C",
"/","\\u002F",
"⧄","\\u29C4",
"⌿","\\u233F",
"𝕤","\\uD835\\uDD64",
"♠","\\u2660",
"♠","\\u2660",
"∥","\\u2225",
"⊓","\\u2293",
"⊓︀","\\u2293\\uFE00",
"⊔","\\u2294",
"⊔︀","\\u2294\\uFE00",
"⊏","\\u228F",
"⊑","\\u2291",
"⊏","\\u228F",
"⊑","\\u2291",
"⊐","\\u2290",
"⊒","\\u2292",
"⊐","\\u2290",
"⊒","\\u2292",
"□","\\u25A1",
"□","\\u25A1",
"▪","\\u25AA",
"▪","\\u25AA",
"→","\\u2192",
"𝓈","\\uD835\\uDCC8",
"∖","\\u2216",
"⌣","\\u2323",
"⋆","\\u22C6",
"☆","\\u2606",
"★","\\u2605",
"ϵ","\\u03F5",
"ϕ","\\u03D5",
"¯","\\u00AF",
"⊂","\\u2282",
"⫅","\\u2AC5",
"⪽","\\u2ABD",
"⊆","\\u2286",
"⫃","\\u2AC3",
"⫁","\\u2AC1",
"⫋","\\u2ACB",
"⊊","\\u228A",
"⪿","\\u2ABF",
"⥹","\\u2979",
"⊂","\\u2282",
"⊆","\\u2286",
"⫅","\\u2AC5",
"⊊","\\u228A",
"⫋","\\u2ACB",
"⫇","\\u2AC7",
"⫕","\\u2AD5",
"⫓","\\u2AD3",
"≻","\\u227B",
"⪸","\\u2AB8",
"≽","\\u227D",
"⪰","\\u2AB0",
"⪺","\\u2ABA",
"⪶","\\u2AB6",
"⋩","\\u22E9",
"≿","\\u227F",
"∑","\\u2211",
"♪","\\u266A",
"¹","\\u00B9",
"¹","\\u00B9",
"²","\\u00B2",
"²","\\u00B2",
"³","\\u00B3",
"³","\\u00B3",
"⊃","\\u2283",
"⫆","\\u2AC6",
"⪾","\\u2ABE",
"⫘","\\u2AD8",
"⊇","\\u2287",
"⫄","\\u2AC4",
"⟉","\\u27C9",
"⫗","\\u2AD7",
"⥻","\\u297B",
"⫂","\\u2AC2",
"⫌","\\u2ACC",
"⊋","\\u228B",
"⫀","\\u2AC0",
"⊃","\\u2283",
"⊇","\\u2287",
"⫆","\\u2AC6",
"⊋","\\u228B",
"⫌","\\u2ACC",
"⫈","\\u2AC8",
"⫔","\\u2AD4",
"⫖","\\u2AD6",
"⇙","\\u21D9",
"⤦","\\u2926",
"↙","\\u2199",
"↙","\\u2199",
"⤪","\\u292A",
"ß","\\u00DF",
"ß","\\u00DF",
"⌖","\\u2316",
"τ","\\u03C4",
"⎴","\\u23B4",
"ť","\\u0165",
"ţ","\\u0163",
"т","\\u0442",
"⃛","\\u20DB",
"⌕","\\u2315",
"𝔱","\\uD835\\uDD31",
"∴","\\u2234",
"∴","\\u2234",
"θ","\\u03B8",
"ϑ","\\u03D1",
"ϑ","\\u03D1",
"≈","\\u2248",
"∼","\\u223C",
" ","\\u2009",
"≈","\\u2248",
"∼","\\u223C",
"þ","\\u00FE",
"þ","\\u00FE",
"˜","\\u02DC",
"×","\\u00D7",
"×","\\u00D7",
"⊠","\\u22A0",
"⨱","\\u2A31",
"⨰","\\u2A30",
"∭","\\u222D",
"⤨","\\u2928",
"⊤","\\u22A4",
"⌶","\\u2336",
"⫱","\\u2AF1",
"𝕥","\\uD835\\uDD65",
"⫚","\\u2ADA",
"⤩","\\u2929",
"‴","\\u2034",
"™","\\u2122",
"▵","\\u25B5",
"▿","\\u25BF",
"◃","\\u25C3",
"⊴","\\u22B4",
"≜","\\u225C",
"▹","\\u25B9",
"⊵","\\u22B5",
"◬","\\u25EC",
"≜","\\u225C",
"⨺","\\u2A3A",
"⨹","\\u2A39",
"⧍","\\u29CD",
"⨻","\\u2A3B",
"⏢","\\u23E2",
"𝓉","\\uD835\\uDCC9",
"ц","\\u0446",
"ћ","\\u045B",
"ŧ","\\u0167",
"≬","\\u226C",
"↞","\\u219E",
"↠","\\u21A0",
"⇑","\\u21D1",
"⥣","\\u2963",
"ú","\\u00FA",
"ú","\\u00FA",
"↑","\\u2191",
"ў","\\u045E",
"ŭ","\\u016D",
"û","\\u00FB",
"û","\\u00FB",
"у","\\u0443",
"⇅","\\u21C5",
"ű","\\u0171",
"⥮","\\u296E",
"⥾","\\u297E",
"𝔲","\\uD835\\uDD32",
"ù","\\u00F9",
"ù","\\u00F9",
"↿","\\u21BF",
"↾","\\u21BE",
"▀","\\u2580",
"⌜","\\u231C",
"⌜","\\u231C",
"⌏","\\u230F",
"◸","\\u25F8",
"ū","\\u016B",
"¨","\\u00A8",
"¨","\\u00A8",
"ų","\\u0173",
"𝕦","\\uD835\\uDD66",
"↑","\\u2191",
"↕","\\u2195",
"↿","\\u21BF",
"↾","\\u21BE",
"⊎","\\u228E",
"υ","\\u03C5",
"ϒ","\\u03D2",
"υ","\\u03C5",
"⇈","\\u21C8",
"⌝","\\u231D",
"⌝","\\u231D",
"⌎","\\u230E",
"ů","\\u016F",
"◹","\\u25F9",
"𝓊","\\uD835\\uDCCA",
"⋰","\\u22F0",
"ũ","\\u0169",
"▵","\\u25B5",
"▴","\\u25B4",
"⇈","\\u21C8",
"ü","\\u00FC",
"ü","\\u00FC",
"⦧","\\u29A7",
"⇕","\\u21D5",
"⫨","\\u2AE8",
"⫩","\\u2AE9",
"⊨","\\u22A8",
"⦜","\\u299C",
"ϵ","\\u03F5",
"ϰ","\\u03F0",
"∅","\\u2205",
"ϕ","\\u03D5",
"ϖ","\\u03D6",
"∝","\\u221D",
"↕","\\u2195",
"ϱ","\\u03F1",
"ς","\\u03C2",
"⊊︀","\\u228A\\uFE00",
"⫋︀","\\u2ACB\\uFE00",
"⊋︀","\\u228B\\uFE00",
"⫌︀","\\u2ACC\\uFE00",
"ϑ","\\u03D1",
"⊲","\\u22B2",
"⊳","\\u22B3",
"в","\\u0432",
"⊢","\\u22A2",
"∨","\\u2228",
"⊻","\\u22BB",
"≚","\\u225A",
"⋮","\\u22EE",
"|","\\u007C",
"|","\\u007C",
"𝔳","\\uD835\\uDD33",
"⊲","\\u22B2",
"⊂⃒","\\u2282\\u20D2",
"⊃⃒","\\u2283\\u20D2",
"𝕧","\\uD835\\uDD67",
"∝","\\u221D",
"⊳","\\u22B3",
"𝓋","\\uD835\\uDCCB",
"⫋︀","\\u2ACB\\uFE00",
"⊊︀","\\u228A\\uFE00",
"⫌︀","\\u2ACC\\uFE00",
"⊋︀","\\u228B\\uFE00",
"⦚","\\u299A",
"ŵ","\\u0175",
"⩟","\\u2A5F",
"∧","\\u2227",
"≙","\\u2259",
"℘","\\u2118",
"𝔴","\\uD835\\uDD34",
"𝕨","\\uD835\\uDD68",
"℘","\\u2118",
"≀","\\u2240",
"≀","\\u2240",
"𝓌","\\uD835\\uDCCC",
"⋂","\\u22C2",
"◯","\\u25EF",
"⋃","\\u22C3",
"▽","\\u25BD",
"𝔵","\\uD835\\uDD35",
"⟺","\\u27FA",
"⟷","\\u27F7",
"ξ","\\u03BE",
"⟸","\\u27F8",
"⟵","\\u27F5",
"⟼","\\u27FC",
"⋻","\\u22FB",
"⨀","\\u2A00",
"𝕩","\\uD835\\uDD69",
"⨁","\\u2A01",
"⨂","\\u2A02",
"⟹","\\u27F9",
"⟶","\\u27F6",
"𝓍","\\uD835\\uDCCD",
"⨆","\\u2A06",
"⨄","\\u2A04",
"△","\\u25B3",
"⋁","\\u22C1",
"⋀","\\u22C0",
"ý","\\u00FD",
"ý","\\u00FD",
"я","\\u044F",
"ŷ","\\u0177",
"ы","\\u044B",
"¥","\\u00A5",
"¥","\\u00A5",
"𝔶","\\uD835\\uDD36",
"ї","\\u0457",
"𝕪","\\uD835\\uDD6A",
"𝓎","\\uD835\\uDCCE",
"ю","\\u044E",
"ÿ","\\u00FF",
"ÿ","\\u00FF",
"ź","\\u017A",
"ž","\\u017E",
"з","\\u0437",
"ż","\\u017C",
"ℨ","\\u2128",
"ζ","\\u03B6",
"𝔷","\\uD835\\uDD37",
"ж","\\u0436",
"⇝","\\u21DD",
"𝕫","\\uD835\\uDD6B",
"𝓏","\\uD835\\uDCCF",
"‍","\\u200D",
"‌","\\u200C",
};
void MKstate::setup_entities_json_to_c()
{
entities_json_to_c_.set(entities_json_to_c_g_);
is_setup_entities_json_to_c_=1;
}