hschumann2/TempleOS-Source-Code
0847
1 2#help_index "DolDoc/Conversion"3 4//See ::/Doc/Credits.DD.5 6#define DOCET_UNDEF_COLOR 0x1000000007#define DOCET_LINK_UNDERLINE 0x2000000008U0 HtmlPutS(CDoc *doc,I64 u32_attr,I64 *_old_u32_attr,Bool underline_update,9 U8 *st,I64 *_col,U8 *style_bitmap=NULL)10{11 U8 *ch,*ptr;12 u32_attr&=0xFFFFFF00;13 if (u32_attr&DOCET_INVERT)14 u32_attr.u8[1]=(u32_attr.u8[1]&15)<<4|u32_attr.u8[1]>>4;15 if (underline_update &&16 !(u32_attr&DOCET_UNDERLINE) && *_old_u32_attr&DOCET_UNDERLINE) {17 if (!(*_old_u32_attr&DOCET_LINK_UNDERLINE))18 DocPrint(doc,"</u>");19 *_old_u32_attr&=~DOCET_LINK_UNDERLINE;20 }21 if (!(u32_attr&DOCET_BLINK) && *_old_u32_attr&DOCET_BLINK)22 DocPrint(doc,"</blink>");23 if (u32_attr&0xFF00!=*_old_u32_attr&0xFF00) {24 if (!(*_old_u32_attr&DOCET_UNDEF_COLOR))25 DocPrint(doc,"</span>");26 DocPrint(doc,"<span class=c%02X>",u32_attr.u8[1]);27 if (style_bitmap)28 LBts(style_bitmap,u32_attr.u8[1]);29 }30 if (u32_attr&DOCET_BLINK && !(*_old_u32_attr&DOCET_BLINK))31 DocPrint(doc,"<blink>");32 if (underline_update) {33 if (u32_attr&DOCET_UNDERLINE && !(*_old_u32_attr&DOCET_UNDERLINE))34 DocPrint(doc,"<u>");35 } else //Keep same underline status.36 u32_attr=u32_attr&~DOCET_UNDERLINE | *_old_u32_attr&DOCET_UNDERLINE;37 38 *_old_u32_attr=u32_attr | *_old_u32_attr&DOCET_LINK_UNDERLINE;39 40 while (ch=*st++) {41 switch (ch) {42 case '\t':43 do {44 DocPutKey(doc,CH_SPACE,0);45 *_col=*_col+1;46 } while (*_col&7);47 break;48 49 start:50 case 'pi': ptr="pi"; break;51 case 'theta': ptr="theta"; break;52 case 'phi': ptr="phi"; break;53 case 'omega': ptr="omega"; break;54 case 'inf': ptr="inf"; break;55 case 'u': ptr="u"; break;56 end:57 DocPrint(doc,ptr);58 *_col=*_col+StrLen(ptr);59 break;60 61 start:62 case CH_SHIFT_SPACE: ptr=" "; break;63 case '&': ptr="&"; break;64 case '<': ptr="<"; break;65 case '>': ptr=">"; break;66 case '"': ptr="""; break;67 end:68 DocPrint(doc,ptr);69 *_col=*_col+1;70 break;71 72 default:73 if (CH_SPACE<=ch<0x7F || ch=='\n')74 DocPutKey(doc,ch,0);75 else76 DocPrint(doc,".");77 *_col=*_col+1;78 }79 }80}81 82U8 *TOSLinkCvt2(U8 *filename,I64 line_num)83{// ::/ --> /Wb/84//Make your own LinkCvt routine85 U8 *res=NULL,*st;86 if (filename) {87 st=ExtChg(filename,"html");88 if (st && StrLen(st)>3 && !StrNCmp(st+1,":/",2))89 res=MStrPrint("/Wb/%s#l%d",st+3,line_num);90 Free(st);91 }92 return res;93}94 95U8 *URLBibleGateway(U8 *src)96{97 U8 buf[STR_LEN],*dst=buf;98 if (!MemCmp(src,"BF:",3))99 src+=3;100 while (*src) {101 if (*src==CH_SPACE || *src==',')102 *dst++='+';103 else104 *dst++=*src;105 src++;106 }107 *dst=0;108 if (StrOcc(buf,'-'))109 return MStrPrint(110 "http://www.biblegateway.com/passage/?search=%s&version=NIV",buf);111 else112 return MStrPrint(113 "http://www.biblegateway.com/verse/en/%s",buf);114}115 116U8 *TOSLinkCvt1(U8 *link_st)117{118 static CDoc *bible=NULL;119 static I64 locks=0;120 U8 *res=NULL,*filename,*needle;121 I64 i,num;122 if (link_st) {123 switch (i=EdLinkCvt(link_st,&filename,&needle,&num)) {124 case LK_FILE_LINE:125 case LK_PLAIN_LINE:126 case LK_FILE:127 res=TOSLinkCvt2(filename,num);128 break;129 case -1:130 case LK_DEF:131 case LK_HELP_INDEX:132 case LK_DOC:133 case LK_DOC_ANCHOR:134 case LK_DOC_FIND:135 case LK_DOC_LINE:136 break;137 case LK_BIBLE_FIND:138 while (LBts(&locks,0))139 Yield;140 if (!bible)141 bible=Adam("DocRead(\"%s\");",filename);142 if (DocFind(bible,num,needle))143 res=URLBibleGateway(link_st);144 LBtr(&locks,0);145 break;146 default:147 if (DocFileEd(i,filename,needle,&num,EDF_UNCOLLAPSE|EDF_BAIL))148 res=TOSLinkCvt2(filename,num);149 }150 Free(filename);151 Free(needle);152 }153 return res;154}155 156public CDoc *Doc2Html(CDoc *doc_in,U8 *html_header=NULL,U8 *body_header=NULL,157 U8 *body_footer=NULL,U8 *html_footer=NULL,Bool line_anchors=TRUE,158 U8 (*link_cvt)(U8 *link_st)=&TOSLinkCvt1,Bool line_nums=FALSE)159{//Cvt DolDocdoc to HTML file.160 CDocEntry *doc_e,*style,*doc_e2;161 I64 i,y,old_y=I64_MIN,col,old_u32_attr=DOCET_UNDEF_COLOR,old_attr,digits;162 U32 *hl,*src;163 U8 *st,st_2[2],*link_st,*style_bitmap=CAlloc(256/8);164 CBGR48 p[COLORS_NUM];165 GrPaletteGet(p);166 CDoc *doc_out=DocNew;167 Bool unlock_doc_in=DocLock(doc_in),no_bwd;168 169 old_attr=doc_in->win_task->text_attr;170 doc_in->win_task->text_attr=DOC_ATTR_DFT_TEXT;171 172 for (i=0xF0;i<=0xFF;i++)173 LBts(style_bitmap,i);174 175 DocRecalc(doc_in,RECALCt_NORMAL|RECALCF_TO_HTML);176 177 digits=Log10(doc_in->head.last->y+1)+1;178 179 st_2[0]=0; st_2[1]=0;180 doc_out->flags|=DOCF_PLAIN_TEXT|DOCF_NO_CURSOR;181 182 if (!html_header) html_header=183 "<!DOCTYPE HTML>\n"184 "<html>\n"185 "<head>\n"186 "<meta http-equiv=\"Content-Type\" "187 "content=\"text/html;charset=US-ASCII\">\n"188 "<meta name=\"generator\" content=\"TempleOS V5.03\">\n";189 if (!body_header) body_header=190 "<body>\n"191 "<pre style=\"font-family:courier;font-size:10pt\">\n";192 if (!body_footer) body_footer=193 "</pre></body>\n</html>\n";194 if (!html_footer) html_footer=195 "</html>\n";196 197 DocPrint(doc_out,"%s",html_header);198 199 DocPrint(doc_out,"<style type=\"text/css\">\n");200 style=doc_out->cur_entry->last;201 DocPrint(doc_out,202 "</style>\n"203 "</head>\n");204 DocPrint(doc_out,"%s",body_header);205 206 doc_e=doc_in->head.next;207 col=doc_e->x;208 y=doc_e->y;209 while (doc_e!=doc_in) {210 if (!(doc_e->de_flags&DOCEF_SKIP)) {211 if (y!=old_y) {212 if (line_anchors)213 DocPrint(doc_out,"<a name=\"l%d\"></a>",y+1);214 if (line_nums)215 DocPrint(doc_out,"%0*d ",digits,y+1);216 old_y=y;217 }218 while (y<doc_e->y) {219 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,&old_u32_attr,FALSE,220 "\n",&col,style_bitmap);221 if (++y!=old_y) {222 if (line_anchors)223 DocPrint(doc_out,"<a name=\"l%d\"></a>",y+1);224 if (line_nums)225 DocPrint(doc_out,"%0*d ",digits,y+1);226 old_y=y;227 }228 col=0;229 }230 231 no_bwd=TRUE;232 doc_e2=doc_e->next;233 while (doc_e2!=doc_in && doc_e2->y==doc_e->y) {234 if (doc_e2->x<doc_e->x) {235 no_bwd=FALSE;236 break;237 }238 doc_e2=doc_e2->next;239 }240 241 if (no_bwd)242 while (col<doc_e->x)243 HtmlPutS(doc_out,doc_e->settings.final_u32_attr&~DOCET_UNDERLINE,244 &old_u32_attr,TRUE," ",&col,style_bitmap);245 246 link_st=NULL;247 if (doc_e->de_flags&DOCEF_HTML_LINK)248 link_st=StrNew(doc_e->html_link);249 else if (st=DocEntryLink(doc_in,doc_e)) {250 link_st=link_cvt(st);251 Free(st);252 }253 254 if (link_st) {255 if (old_u32_attr&DOCET_UNDERLINE &&!(old_u32_attr&DOCET_LINK_UNDERLINE))256 DocPrint(doc_out,"</u>");257 if (old_u32_attr&DOCET_BLINK)258 DocPrint(doc_out,"</blink>");259 if (!(old_u32_attr&DOCET_UNDEF_COLOR))260 DocPrint(doc_out,"</span>");261 old_u32_attr=DOCET_UNDEF_COLOR|DOCET_UNDERLINE|DOCET_LINK_UNDERLINE;262 DocPrint(doc_out,"<a href=\"%s\">",link_st);263 }264 265 switch (doc_e->type_u8) {266 case DOCT_TEXT:267 if (doc_e->de_flags&DOCEF_HIGHLIGHT) {268 if (doc_e->last==doc_in)269 MemCpy(&doc_e->settings,&doc_in->settings_head,270 sizeof(CDocSettings));271 else272 MemCpy(&doc_e->settings,&doc_e->last->settings,273 sizeof(CDocSettings));274 src=hl=DocHighlight(doc_e,doc_e->tag,StrLen(doc_e->tag),275 doc_e->type&0xFF00);276 while (*src) {277 st_2[0]=*src&0xFF;278 HtmlPutS(doc_out,*src++,&old_u32_attr,TRUE,279 st_2,&col,style_bitmap);280 }281 Free(hl);282 } else283 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,284 &old_u32_attr,TRUE,doc_e->tag,&col,style_bitmap);285 break;286 case DOCT_TAB:287 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,&old_u32_attr,TRUE,288 "\t",&col,style_bitmap);289 break;290 case DOCT_HTML_CODE:291 if (old_u32_attr&DOCET_UNDERLINE &&292 !(old_u32_attr&DOCET_LINK_UNDERLINE))293 DocPrint(doc_out,"</u>");294 if (old_u32_attr&DOCET_BLINK)295 DocPrint(doc_out,"</blink>");296 if (!(old_u32_attr&DOCET_UNDEF_COLOR))297 DocPrint(doc_out,"</span>");298 old_u32_attr=DOCET_UNDEF_COLOR;299 DocPrint(doc_out,"%s",doc_e->tag);300 break;301 case DOCT_SPRITE:302 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,303 &old_u32_attr,TRUE,doc_e->tag,&col,style_bitmap);304 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,305 &old_u32_attr,TRUE,"/* Graphics Not Rendered in HTML */",306 &col,style_bitmap);307 break;308 default:309 if (doc_e->de_flags&DOCEF_TAG)310 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,311 &old_u32_attr,TRUE,doc_e->tag,&col,style_bitmap);312 }313 if (link_st) {314 if (old_u32_attr&DOCET_UNDERLINE &&!(old_u32_attr&DOCET_LINK_UNDERLINE))315 DocPrint(doc_out,"</u>");316 if (old_u32_attr&DOCET_BLINK)317 DocPrint(doc_out,"</blink>");318 if (!(old_u32_attr&DOCET_UNDEF_COLOR))319 DocPrint(doc_out,"</span>");320 DocPrint(doc_out,"</a>");321 old_u32_attr=DOCET_UNDEF_COLOR|DOCET_UNDERLINE|DOCET_LINK_UNDERLINE;322 Free(link_st);323 }324 }325 doc_e=doc_e->next;326 }327 while (y++<doc_e->y) {328 HtmlPutS(doc_out,doc_e->settings.final_u32_attr,329 &old_u32_attr,TRUE,"\n",&col,style_bitmap);330 col=0;331 }332 if (old_u32_attr&DOCET_UNDERLINE && !(old_u32_attr&DOCET_LINK_UNDERLINE))333 DocPrint(doc_out,"</u>");334 if (old_u32_attr&DOCET_BLINK)335 DocPrint(doc_out,"</blink>");336 if (!(old_u32_attr&DOCET_UNDEF_COLOR))337 DocPrint(doc_out,"</span>");338 old_u32_attr=DOCET_UNDEF_COLOR;339 DocPrint(doc_out,"%s",body_footer);340 DocPrint(doc_out,"%s",html_footer);341 342 doc_out->cur_entry=style->next;343 for (i=0;i<256;i++)344 if (Bt(style_bitmap,i))345 DocPrint(doc_out,346 ".c%02X{color:#%02x%02x%02x;background-color:#%02x%02x%02x;}\n",347 i,p[i&15].r>>8,p[i&15].g>>8,p[i&15].b>>8,348 p[i/16].r>>8,p[i/16].g>>8,p[i/16].b>>8);349 doc_out->cur_entry=&doc_out->head;350 DocRecalc(doc_out);351 352 doc_in->win_task->text_attr=old_attr;353 354 if (unlock_doc_in)355 DocUnlock(doc_in);356 return doc_out;357}358 359#help_index "Cmd Line (Typically);DolDoc/Conversion;DolDoc/Cmd Line (Typically)"360public U0 ToHtml(U8 *_in_name,U8 *_out_name=NULL,U8 *html_header=NULL,361 U8 *body_header=NULL,U8 *body_footer=NULL,U8 *html_footer=NULL,362 I64 width=80,Bool line_anchors=TRUE,363 U8 (*link_cvt)(U8 *link_st)=&TOSLinkCvt1,Bool line_nums=FALSE)364{//Convert DolDocfile to HTML.365//Supply your own link_cvt routine.366 U8 *in_name,*out_name;367 CDoc *doc_in,*doc_out;368 369 SettingsPush; //See SettingsPush370 WinHorz(0,width-1); //Sets doc width for word wrap.371 372 in_name=ExtDft(_in_name,"HC.Z");373 if (_out_name)374 out_name=ExtDft(_out_name,"html");375 else376 out_name=ExtChg(_in_name,"html");377 378 doc_in=DocRead(in_name);379 doc_out=Doc2Html(doc_in,html_header,body_header,body_footer,html_footer,380 line_anchors,link_cvt,line_nums);381 StrCpy(&doc_out->filename.name,out_name);382 383 SettingsPop;384 385 DocWrite(doc_out);386 DocDel(doc_in);387 DocDel(doc_out);388 Free(in_name);389 Free(out_name);390}391 