📄 htmlout.c
字号:
OD->TStack[OD->HTTags] = i; if (TMatchArr[i].TTidx >= TTagLen) { RTFMsg ("Fatal Error"); context(); RTFPanic ("Internal trap - tried to push special: %d\n",TMatchArr[i].TTidx); } putwrap(TTagArr[TMatchArr[i].TTidx].StartTag, OD,OD->wrap); } } } } }DoPmark(OD) struct FDest *OD;{ /* pop all text styles, print the paragraph mark and push them back */ int i; OD->NeedPar=0; for(i=OD->HTTags;i>OD->HPTags;i--){ putwrap(TTagArr[TMatchArr[OD->TStack[i]].TTidx].EndTag, OD,OD->wrap); } putwrap(PTagArr[OD->PTidx].ParTag, OD,OD->wrap); for(i=OD->HPTags+1; i<=OD->HTTags;i++){ putwrap(TTagArr[TMatchArr[OD->TStack[i]].TTidx].StartTag, OD,OD->wrap); }}PutSpecial(Special) int Special;{ int i,j,n,opos,dataleft; char orec[MAXOBUF]; struct FDest *OD; switch (destination) { /* string destinations */ case rtfITitle: case rtfInfo: case rtfISubject: case rtfIAuthor: case rtfIOperator: case rtfIKeywords: case rtfIComment: case rtfIVersion: case rtfIDoccomm: return; case rtfParNumText: SaveSt(&PNSave,1+Special); PNText=1; return; /* file destinations */ case rtfHeader: case rtfHeaderLeft: case rtfHeaderRight: case rtfHeaderFirst: case rtfFooter: case rtfFooterLeft: case rtfFooterRight: case rtfFooterFirst: return; case rtfFootnote: OD = &Footnote; break; default: OD = &File1; break; } if(PNText){ /* We have saved ParNumText */ PNText=0; PlayST(&PNSave); } if(FNText==1){ FNText=2; PlayST(&FNSave); FNText=0; } if (IStyle_Chg){ if(inTable){ TFont="--Not a Font--"; TStyle=0; TSize=9999; ParStyle="_Table"; } TestStyle(OD); } if (OD->NeedPar) { DoPmark(OD); OD->NeedPar = 0; } switch (Special) { case rtfRow: /* Clear out all saved cell data */ dataleft=1; for(i=firstcell;i<lastcell;i++) cell[i].cpos=0; while(dataleft){ dataleft=0; opos=0; for(i=firstcell;i<lastcell;i++){ if(cell[i].merge||cell[i].cpos>=cell[i].cbuff.used){ for(j=0;j<=cell[i].width;j++){ orec[opos++]=' '; } continue; } cell[i].cpos+=nextfield(&(cell[i].cbuff.ptr[cell[i].cpos]), cell[i].width-1, &(orec[opos]), cell[i].just,1); /* skip leading blanks */ while(cell[i].cbuff.ptr[cell[i].cpos]==' '||cell[i].cbuff.ptr[cell[i].cpos]=='\t') cell[i].cpos++; n=strlen(&(orec[opos])); orec[opos+n]=' '; orec[opos+n+1]=' '; opos+=n+2; if(cell[i].cpos<cell[i].cbuff.used) dataleft=1; } orec[opos++]='\n'; orec[opos]='\0'; putwrap(orec, OD,0); } for(i=firstcell;i<lastcell;i++) cell[i].cbuff.used=0; break; case rtfPar: if(inTable){ AppendText(&(cell[cellno].cbuff), " "); return; } if (OD->TSpecial == MTDiscard) return; if (OD->InCol2==0 && PTagArr[OD->PTidx].DeleteCol1==1) { /* We deleted Everything */ if(SkipCol.used>0){ RTFMsg ("Warning - required Tab missing from list entry - recovering text"); context(); putwrap(SkipCol.ptr,OD,OD->wrap); } } OD->NeedPar = 1; OD->InCol2 = 0; SkipCol.used=0; if(ToC&&ToCText&&OD==&File1&&HToCLev>0){ putwrap("</a>",&ToCFile,0); putwrap("</a>",OD,0); ToCText=0; } break; case rtfTab: if(inTable){ AppendText(&(cell[cellno].cbuff), " "); return; } if (OD->TSpecial == MTDiscard) return; if (!OD->InCol2) { putwrap(PTagArr[OD->PTidx].Col2Tag, OD,OD->wrap); SkipCol.used=0; OD->InCol2 = 1; } else { putwrap(PTagArr[OD->PTidx].TabTag, OD,OD->wrap); } break; }}context(){ int cptr; char ctxbuff[256]; sprintf (ctxbuff,"At line %ld, position %d.\n",rtfLineNum, rtfLinePos); RTFMsg (ctxbuff);}voidPutHTMLString(p) char *p;{ int i, j; struct FDest *OD; switch (destination) { /* string destinations */ case rtfITitle: AppendText(&Title, p); return; case rtfInfo: case rtfISubject: case rtfIAuthor: case rtfIOperator: case rtfIKeywords: case rtfIComment: case rtfIVersion: case rtfIDoccomm: return; case rtfParNumText: AppendText(&PNSave.SD, p); if (IStyle_Chg)SaveSt(&PNSave,0); PNText=1; return; case rtfObjItem: AppendText(&Item, p); return; case rtfBookmarkStart: AppendText(&BkName, p); return; case rtfBookmarkEnd: return; /* file destinations */ case rtfHeader: case rtfHeaderLeft: case rtfHeaderRight: case rtfHeaderFirst: case rtfFooter: case rtfFooterLeft: case rtfFooterRight: case rtfFooterFirst: return; case rtfFootnote: OD = &Footnote; break; default: OD = &File1; break; } if(PNText){ /* We have saved ParNumText */ PNText=0; PlayST(&PNSave); } if(inTable){ AppendText(&(cell[cellno].cbuff), p); return; } if(FNText==1){ FNText=2; PlayST(&FNSave); FNText=0; } else if(FNText==0&&IStyle_Chg&&destination!=rtfFootnote) { /* We have a candidate footnote */ FNText=1; AppendText(&FNSave.SD, p); SaveSt(&FNSave,0); return; } if (IStyle_Chg){ TestStyle(OD); } if (OD->TSpecial == MTDiscard) return; if (OD->InCol2==0 && PTagArr[OD->PTidx].DeleteCol1==1){ AppendText(&SkipCol, p); return; } if (OD->NeedPar) { DoPmark(OD); OD->NeedPar = 0; } /* If we are looking at <,> or & that have been translated and we are in MHLiteral, untranslated them. */ if (OD->TSpecial == MTLiteral){ if(strcmp(p,"<")==0)p="<"; else if(strcmp(p,">")==0)p=">"; else if(strcmp(p,"&")==0)p="&"; } else if ((ConvertCaps) && p[0] != '&' && p[0] != '[') { /* do uppercasing if string doesn't begin with '&' or '[' */ char *s = p; while (*s != '\0') { if (islower(*s)) *s = toupper(*s); ++s; } } if(ToC&&OD==&File1&&HToCLev>0){ while(oToCLev>HToCLev){ putwrap("</ol>",&ToCFile,0); oToCLev--; } while(oToCLev<HToCLev){ putwrap("<ol>",&ToCFile,0); oToCLev++; } if(ToCText==0){ anyTOC=1; sprintf(LineBuffer,"\n<li><a href=\"%s.html#RTFToC%d\">", FPrefixR,ToCidx); putwrap(LineBuffer,&ToCFile,0); sprintf(LineBuffer,"<a name=\"RTFToC%d\">",ToCidx++); putwrap(LineBuffer,OD,0); ToCText=1; } putwrap(p,&ToCFile,0); } putwrap(p, OD,OD->wrap);}voidPutHTML(){ char *p; p = MapChar(rtfMinor); PutHTMLString(p);}/* * Map a standard character code to an output string. * Returns pointer to static string. */static char *MapChar(stdCode) int stdCode;{ static char buf[100]; char *oStr; if (stdCode == rtfSC_nothing){ sprintf(buf,"&#%d;",rtfMajor); RTFMsg("Invalid Character Code \\`%x - outputting &#%d;\n",rtfMajor,rtfMajor); }else { oStr = outMap[stdCode]; if (oStr == (char *) NULL) { /* no output sequence in map */ sprintf(buf, "[[%s]]", RTFStdCharName(stdCode)); RTFMsg("No output translation for :%s\n",RTFStdCharName(stdCode)); } else (void) strcpy(buf, oStr); } return (buf);}static voidAppendText(OD, text) struct SDest *OD; char *text;{ int need; char *ptr; need = OD->used + 1 + strlen(text); /* need space for next char + '\0' */ if (OD->alloc < need) { OD->alloc += DSALLOC * (1 + (need / DSALLOC)); ptr = (char *) RTFAlloc( (int) sizeof(char) * OD->alloc); if (ptr == NULL) { RTFMsg ("Memory Allocation Failed\n"); context(); RTFPanic (""); } if (OD->ptr != NULL) { (void) strcpy(ptr, OD->ptr); RTFFree(OD->ptr); } OD->ptr = ptr; } strcpy(&(OD->ptr[(OD->used)]), text); OD->used += strlen(text);}/* Need to save off Special Character (int) and current text position and current save state pointer*/SaveSt(SS,Special)struct SSStruct *SS;{ struct SSData *ptr; int i; if(SS->alloc==SS->used){ SS->alloc+=40; ptr = (struct SSData *) RTFAlloc( (int) sizeof(struct SSData) * SS->alloc); if (ptr == NULL) { RTFMsg ("Memory Allocation Failed\n"); context(); RTFPanic (""); } if(SS->data != NULL) { for(i=0;i<SS->used;i++){ ptr[i]=SS->data[i]; } RTFFree(SS->data); } SS->data=ptr; } SS->data[SS->used].Special=Special; if(IStyle_Chg){ SS->data[SS->used].TheState=SaveIState(); } else { SS->data[SS->used].TheState=NULL; } SS->data[SS->used++].cpos=SS->SD.used;}PlayST(SS)struct SSStruct *SS;{ int i,tidx=0; InStateStack *SavedState; char savchar; SavedState=SaveIState(); for(i=0;i<SS->used;i++){ if(SS->data[i].TheState){ RestoreIState(SS->data[i].TheState); SS->data[i].TheState=NULL; if(destination==rtfParNumText){ destination=SavedState->destination; ParStyle=SavedState->ParStyle; } else if(destination!=rtfFootnote && SavedState->destination==rtfFootnote){ FNMatch.TStyle = TStyle; FNMatch.Font= TFont; FNMatch.FSize = TSize; } } /* First dispense with all leading text */ if(tidx < SS->SD.used){ savchar=SS->SD.ptr[SS->data[i].cpos]; SS->SD.ptr[SS->data[i].cpos]='\0'; PutHTMLString(&(SS->SD.ptr[tidx])); tidx=SS->data[i].cpos; SS->SD.ptr[SS->data[i].cpos]=savchar; } if(SS->data[i].Special){ PutSpecial(SS->data[i].Special-1); } } SS->SD.used=0; SS->used=0; RestoreIState(SavedState);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -