",c);
*_old_c=c;
if (style_bitmap)
LBts(style_bitmap,c);
}
while (ch=*st++) {
switch (ch) {
case '\t':
do {
DocPutKey(doc,CH_SPACE,0);
*_col=*_col+1;
} while (*_col&7);
break;
case '&':
DocPrint(doc,"&");
*_col=*_col+1;
break;
case '<':
DocPrint(doc,"<");
*_col=*_col+1;
break;
case '>':
DocPrint(doc,">");
*_col=*_col+1;
break;
case '"':
DocPrint(doc,""");
*_col=*_col+1;
break;
case 'ã':
DocPrint(doc,"pi");
*_col=*_col+1;
break;
case 'é':
DocPrint(doc,"theta");
*_col=*_col+1;
break;
case 'è':
DocPrint(doc,"phi");
*_col=*_col+1;
break;
case 'ê':
DocPrint(doc,"omega");
*_col=*_col+1;
break;
case 'ì':
DocPrint(doc,"inf");
*_col=*_col+1;
break;
case 'æ':
DocPrint(doc,"u");
*_col=*_col+1;
break;
case CH_SHIFT_SPACE:
DocPrint(doc," ");
*_col=*_col+1;
break;
default:
if (CH_SPACE<=ch<0x7F || ch=='\n')
DocPutKey(doc,ch,0);
else
DocPrint(doc,".");
*_col=*_col+1;
}
}
}
U8 *TSLinkCvt2(U8 *filename,I64 line_num)
{ // ::/TempleOS/ --> http://www.templeos.org/Wb/
// Make your own LinkCvt routine
U8 *result=NULL,*st;
if (filename) {
st=ChgExt(filename,"html");
if (st && StrLen(st)>12 && !StrNCmp(st+1,":/TempleOS/",11))
result=MPrint("http://www.templeos.org/Wb/%s#l%d",st+12,line_num);
Free(st);
}
return result;
}
U8 *TSLinkCvt1(U8 *link_st)
{
static CDoc *bible=NULL;
static I64 locks=0;
U8 *result=NULL,*filename,*pattern;
I64 i,num;
if (link_st) {
switch (i=EdLinkCvt(link_st,&filename,&pattern,&num)) {
case LK_FILE_LINE:
case LK_PLAIN_LINE:
case LK_FILE:
result=TSLinkCvt2(filename,num);
break;
case -1:
case LK_DEF:
case LK_HELP_INDEX:
break;
case LK_BIBLE_FIND:
while (LBts(&locks,0))
Yield;
if (!bible)
bible=Adam("DocRead(\"%s\");",filename);
if (DocPatternFind(bible,num,pattern))
result=TSLinkCvt2(filename,bible->cur_entry->y+1);
LBtr(&locks,0);
break;
default:
if (DocFileEd(i,filename,pattern,&num,EDF_UNCOLLAPSE|EDF_BAIL))
result=TSLinkCvt2(filename,num);
}
Free(filename);
Free(pattern);
}
return result;
}
public CDoc *Doc2Html(CDoc *doc_in,
U8 *html_header=NULL,
U8 *body_header=NULL,U8 *body_footer=NULL,Bool line_anchors=TRUE,
U8 (*link_cvt)(U8 *link_st)=&TSLinkCvt1)
{
CDocEntry *doc_e,*style,*doc_e2;
CDocSettings *s;
I64 i,y,old_y=MIN_I64,cur_u8_attr,col,old_c=-1,old_attr;
U32 *hl,*src;
U8 *st,st_2[2],*link_st,*style_bitmap=CAlloc(256/8);
CBGR p[16];
GetVGAPalette4(p);
CDoc *doc_out=DocNew;
Bool unlock_doc_in=DocLock(doc_in),no_backward;
old_attr=doc_in->win_task->text_attr;
doc_in->win_task->text_attr=DOC_ATTR_DFT_TEXT;
for (i=0xF0;i<=0xFF;i++)
LBts(style_bitmap,i);
DocRecalc(doc_in);
st_2[0]=0; st_2[1]=0;
doc_out->flags|=DOCF_PLAIN_TEXT|DOCF_NO_CURSOR;
if (!html_header) html_header="";
if (!body_header) body_header="";
if (!body_footer) body_footer="";
DocPrint(doc_out,
"\n"
"\n"
"\n"
"\n"
"%s"
"\n"
"\n"
"\n"
"\n"
"\n");
DocPrint(doc_out,"%s",body_header);
doc_e=doc_in->root.next;
s=DocSettingsLast(doc_e);
col=doc_e->x;
y=doc_e->y;
cur_u8_attr=doc_e->type.u8[1];
while (doc_e!=doc_in) {
if (!(doc_e->flags1&(DOCEF1_SKIP|DOCEF1_HARD_SKIP))) {
if (line_anchors && y!=old_y) {
DocPrint(doc_out,"",y+1);
old_y=y;
}
while (yy) {
HtmlPutS(doc_out,cur_u8_attr,&old_c,"\n",&col,style_bitmap);
y++;
if (line_anchors && y!=old_y) {
DocPrint(doc_out,"",y+1);
old_y=y;
}
col=0;
}
no_backward=TRUE;
doc_e2=doc_e->next;
while (doc_e2!=doc_in && doc_e2->y==doc_e->y) {
if (doc_e2->xx) {
no_backward=FALSE;
break;
}
doc_e2=doc_e2->next;
}
if (no_backward)
while (colx)
HtmlPutS(doc_out,cur_u8_attr,&old_c," ",&col,style_bitmap);
link_st=NULL;
if (doc_e->flags1&DOCEF1_HTML_LINK)
link_st=StrNew(doc_e->html_link);
else if (st=DocEntryLink(doc_in,doc_e)) {
link_st=link_cvt(st);
Free(st);
}
if (link_st) {
if (old_c!=-1) {
DocPrint(doc_out,"");
old_c=-1;
}
DocPrint(doc_out,"