#define titolo "La majstro kaj Margarita "
#define beto pikto("bet.gif","Biblio:", "bottom",32,32); 
#include "hiper.c"


void subbanner(){
  int krampo = 0;
  while(ch && ch != '.'){
       putStr(krampo++ ? "</em> | <em>" : "[ <em>");
       putStr("<a href=\"");
       do{
           putch(ch);
           getch();
       }while(isalnum(ch));
       putch('.');
       putStr(Html);
       putStr("\">");
       presCxen( !bannerNumber && ch
               ? "Antaý"
               : "Sekv"
               );
       if(ch == '+') getch();
       putStr("a fragmento</a>");
  }
  if(ch == '.') getch();
  else{
     putStr(krampo++ ? "</em> | <em>" : "[ <em>");
     putStr("<a href=\"ENHAVO.");
     putStr(Html);
     putStr("\">Enhavtabelo</a></em> | <em>");
     putStr("<a href=\"KOVRILO.html\">Kovrilo</a>");
  }
  if(krampo) putStr("</em> ]");
  if(bannerNumber == 2) putStr("</body></html>");
  if(++bannerNumber > 3) eraro("Too many banners");
}


void kapvorto(String s1, String s2){
   char x;
   if(finilo) eraro("atendatas kapvortkomenco");
   else {
       parNro='0'; x=0; fermuOL();
       if(isdigit(ento)) { putch('('); putch(x=ento); }
       putStr(s1); filtru('<'); ankro();
       if(x) { putch('-'); putch(x); }
       getch(); elemento(); putStr("\" href=\"#."); ankro(); putStr("\">"); 
       elcxenigu(); putStr(s2);
   }
}

void hyperlink(char n){
  int i; char l1, l2;
  putStr("<a href=\"");
  if('0'<=ch && ch<='9') {
     if(ch == '9') getch();
     while(ch != '#') {putch(ch); getch();}
     getch(); putStr(".\261");
  }
  filtru('\''); getch();
  putch('#'); ankro();
  if(bannerNumber == 1) {putStr("\" name=\"."); ankro();}
  putStr("\">"); elcxenigu();
  while( litero(ch) ){
      putch(ch);
      getch();
  }
  putStr("</a>");
} /* hyperlink */

void preformat(){
  if(finilo!=pre) eraro("finilo=pre");
  if(finilo) { putStr("</pre>"); pre=falso; freshPar=1; }
  else { fermuOL(); putStr(" <pre>"); sbrosBuf(); pre=vero; putStr("   ");
 }
}

void paragrafo(){
  getch();
  if('0'<ch && ch<'9') {
     ++parNro;
     if(kursivo || parNro!=ch) eraro("fusxa <OL>");
     if(align!=defavxlto) { align=defavxlto; putStr("</p>"); }
     else if(freshPar>1) putStr("<p>");
     freshPar=0;
     if(ch=='1') putStr("<OL>");
     putStr("<LI>");
  }else if(ch=='|') putStr("<br>");
  else if(ch=='>') {
      freshPar=0; putStr("<p align=\"right\">"); align=right;
  }else {
     if(ch=='0') fermuOL();
     else if(litero(ch) || ch&0x80) {
           putStr("<tt>");
           switch(ch){
              case 'A': putStr("Angl"); break;
              case 'Â': putStr("Arame"); break;
              case 'B': putStr("Bulgar"); break;
              case 'Æ': presCxen("Æe¶"); break;
              case 'F': putStr("Franc"); break;
              case 'G': putStr("German"); break;
              case 'Õ': putStr("Grek"); break;
              case '¡': putStr("Hebre"); break;
              case 'H': putStr("Hispan"); break;
              case 'I': putStr("Ital"); break;
              case 'L': putStr("Latin"); break;
              case 'O': putStr("orig"); break;
              case 'P': putStr("Pol"); break;
              case 'R': putStr("Rus"); break;
              case 'Ç': putStr("Slavon"); break;
              case 'U': putStr("Ukrajn"); break;
              default : eraro("misa paragraf-litero");
	   }
           getch();
           while(ch!=' ' && ch){putch(ch); getch();}
           getch(); putStr(" </tt>"); return;
     } else {putch('§'); putch(ch); return;}
  }
  getch(); skip();
}  /* paragrafo  */


void cxefciklo(){   /* ------------------------- */
    for(;;){ 
        getch();
      A:
        if(dosierfino) break;
        switch(ch){
            case' ':
                if(!pre){
                    do getch(); while(ch == ' ' && !dosierfino);
                    putch(' ');
                    goto A;
                }
      case 0:
          if(pre) break;
          putch(' ');
          do getch(); while(ch==' ' && !dosierfino);
          if(ch == 0){
              skip();
              freshPar = 1;
          }
          goto A;
      case'<' :
          {
              getch();
              switch(elemento()){
               case bibref: bibliografio(); break;
               case ccode:if(finilo) putStr("</tt></p>");
                          else putStr("<p align=\"center\"><tt>");
                          freshPar=0; skip(); break;
               case centra: if(finilo) putStr("</p>");
                            else {
                               putStr("<p align=\"center\">");
                               freshPar=0;
                            }
                            freshPar=0; skip(); break;
               case cirilete:
                   if(kviete = !finilo){
                       putStr("<em>");
                       lStako[ll++] = lingvo;
                       lingvo = rusa;
                   }else{
                       putStr("</em>");
                       lingvo = lStako[--ll];}
                   break;                            
               case code:   preformat(); break;
               case egale:  kapvorto("<b><tt><a name=\"","</a></tt></b>");
                            break;  
               case evi:
                   kapvorto("<img src=\"bildoj/evi.gif\""
                            "align=\"middle\" alt=\"[Evi.]\"><b> <a name=\"",
                            "</a></b>");
                   break;
               case grafiko:
                          if(finilo) {
                             putStr(".gif\">");
                             bildo("fig.gif","FIG.","bottom",20,20);
                             putStr("></a>");
                          }else{
                            putStr("<a href=\"");
                            putStr(bildvojo);
                            putch('/');
                          }
                          goto A;
               case html: break;
              case greke:
                  if(uni){
                      uniGreka();
                      goto A;
                  }else if(kviete = !finilo){
                      putStr("<i>");
                      lStako[ll++] = lingvo; lingvo = eo;
                  }else{
                      lingvo = lStako[--ll];
                      putStr("</i>"); }
                  break;
               case bildego:
                          clearall = vero; /*no break*/
               case inlineimg:
                          if(finilo) putStr("\" align=\"middle\">");
                          else{
                            putStr("<img src=\"");
                            putStr(bildvojo);
                            putch('/');
                          }
                          sintakse = !finilo;
                          goto A;
               case l1:  if(finilo){ lingvo=lStako[--ll]; putStr("</em>"); }
                         else {
                          putStr("<em>"); lStako[ll++]=lingvo; lingvo=lat1;
                         } 
                         goto A;
               case l2:  if(finilo) lingvo=lStako[--ll];
                         else {
                             lStako[ll++]=lingvo; lingvo=lat2;
                         }
                         goto A;
               case l3:  if(finilo){ lingvo=lStako[--ll]; putStr("</em>"); }
                         else {
                          putStr("<em>"); lStako[ll++]=lingvo; lingvo=eo;
                         } 
                         goto A;
               case kapvorta: lingvo=eo;
                              kapvorto("<b><a name=\"", "</a></b> ");
                              putUniSym(8212,"---");
                              fermuOL(); skip(); break;
               case mat: mmode= ! finilo;
                         if(finilo) putStr("</math>"); else putStr("<math>");
                         goto A;
               case numero:kapvorto(") <b><a name=\"","</a></b>"); break;
               case quote: if(finilo) {
                                fermuOL(); putStr("</blockquote>");
                           }else putStr("<blockquote>");
                           skip(); goto A;
               case subkapa:kapvorto("<b><a name=\"","</a></b>"); break;
             }
             goto A;
           }
      case'-': if(pre || signaro == 'a') break;
               getch();
               if(ch == '>'){
                   getch();
                   if(ch == '>') getch();
                   putUniSym(8594, "->"); goto A;
               }
               if(mmode){ putUniSym(8722, "-"); goto A; }
               if(verbatim){ putch('-'); goto A; }
               if(ch != '-'){ putUni4Sym('x', 0x2010, "-"); goto A; }
               getch();
               if(ch == '-') {putUniSym(8212, "---"); getch();}
               else putUniSym(8211, "--");
               goto A;
      case'.': if( (!uni) || verbatim||pre) break;
               getch();
               if(ch!='.') { putch('.'); goto A; }
               getch();
               if(ch!='.') putStr("..");
               else { putUni(8230); getch(); }
               goto A;
      case'`':
          getch();
          if(ch == '`') {
              if(uni || signaro == '1') ch = 0xab; /* << */
              else putch(ch);
              break;
          }else hyperlink('0');
          goto A;
      case'\'':
          getch();
          if(ch == '\''){
              if(uni || signaro == '1') ch = 0xbb; /* >> */
              else putch(ch);
              break;
          }else putch('\'');
          goto A;
      case'^': if(!mmode) break;
               putStr("<sup>"); getch(); putch(ch); putStr("</sup>"); 
               getch(); goto A;
      case'_': if(mmode) {
                  putStr("<sub>"); getch(); putch(ch); putStr("</sub>"); 
               } else {
                   if(pre) break;
                   putStr(kursivo? "</i>" : "<i>"); kursivo=!kursivo;
	       }
               getch(); goto A;
      case ns: if(signaro == 'k') {putStr("&nbsp;"); getch(); goto A;}
               break;
      case'~': if(lingvo == lat2){
                 getch();
                 if(ch == 'l') putUniSym(0x142,"l/");
                 else if(ch == 'L') putUniSym(0x141,"L/");
                 else {eraro("Trastreko??"); break;}
                 getch(); goto A;
               }
      case Co: if(signaro == '1' || uni) break;
               if(lingvo != lat1) break;
               img_src("/copyrigh.gif\" alt=\"(c)\">");
               getch(); goto A;
      case hstroke:
               if(en_tabelo) {putStr("<th>"); getch(); goto A;}
               else if(!kviete) {putStr(Html); getch(); goto A;}
               break;
    case acute: if(lingvo != lat2) break;
                getch();
                if(ch == 'c') putUniSym(0x107,"c\'");
                else if(ch == 'C') putUniSym(0x106,"C\'");
                else if(ch == 'n') putUniSym(0x144,"n\'");
                else if(ch == 's') putUniSym(0x15b,"s\'");
                else {eraro("dekstra korno??"); break;}
                getch(); goto A;
   case tremao:if(lingvo != lat1) break;
                getch();
                if(ch == 'a') {
                   if(uni || (signaro == '1')) ch = (char)0xe6;
                   else {putch('a'); ch = 'e';}
                   break;
                }else if(ch == 'A') {
                   if(uni || (signaro == '1')) ch = (char)0xc6;
                   else {putch('A'); ch = 'E';}
                   break;
                }else if(ch == 'o') putUniSym(0x153,"oe,");
                else if(ch == 'n') putUniSym(0x14b,"ng");
                else {eraro("Ligaturo??"); break;}
                getch(); goto A;
    case zoeto:if(lingvo != lat2) break;
               getch();
               if(ch == 'a') putUniSym(0x105,"a,");
               else if(ch == 'e') putUniSym(0x119,"e,");
               else {eraro("Ogonek??"); break;}
               getch(); goto A;
      case'£': fermuOL(); putStr("<i>Ling.</i"); ch='>'; break;
      case ff: fermuOL();
               if(clearall) { putStr("<br clear=all>"); clearall=falso; }
               putStr("<hr>"); getch(); skip(); lingvo=eo; goto A;
      case'&': if( !kajo() ) getch();
               goto A;
      case'§': paragrafo(); goto A;
   }
   skribu(ch);
  }
}
