Nickolay.info. јлгоритмы.  онвертируем из Ћексикона в HTML

ѕомните, был такой знаменитый текстовый редактор в до-виндовую эпоху (кстати, есть здесь). Ёта программа - учебна€, раз лежит в данном разделе, поэтому она работает только со шрифтами Ћексикона 1-5, не трога€, скажем, арифметических формул (шрифт 7). «апускаетс€ с параметрами командной строки в виде

lex2html.exe lexicon_file html_file
/*
  онвертер из "Ћексикона" в HTML.
 ”читывет только выделени€ шрифтами Ћексикона 1-5 и некоторые специальные
 символы.
  онвертирует из DOS в Windows-1251 и замен€ет "критичные" дл€ HTML символы
 <,>,&."
 
 Borland C++ 3.1
 Options:
 [X] Unsigned characters
*/
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_STR 128
 
char Str[MAX_STR];
 
void Error (int Code) { //—ообщени€ об ошибках и завершение работы
 char *Msg[]={
  "ќ ",
  "Lexicon 2 HTML converter. Run me:\n lex2html.exe lexicon_file html_file",
  "File open error",
  "File operation error",
  "No memory"
 };
 cprintf ("\r\n Returned: %d:\r\n %s!\r\n Press ENTER...",
  Code,Msg[Code]);
 fflush (stdin); getch(); fcloseall();
 window (1,1,80,25); clrscr();
 exit (Code);
}
 
//////////// Ќј„јЋќ блока функций работы с файлами
FILE *Open(char *Name, char *Mode) { //ќткрытие файла
 FILE *f;
 f=fopen (Name,Mode);
 if (f==NULL) Error (2);
 return f;
}
 
int Close (FILE *f) { //«акрытие файла
 return (fclose (f));
}
 
char *ReadStr (FILE *f, char *Str) { //„тение строки из файла
 char *Ptr=fgets (Str,MAX_STR,f);
 int l=strlen(Str)-1;
 while ((Str[l]=='\n') || (Str[l]=='\r')) Str[l--]='\0';
 return Ptr;
}
 
int WriteStr (FILE *f, char *Str) { //«апись строки в файл
 int i;
 i=fputs (Str,f);
 fputs ("\n",f);
 return (i);
}
////////////  ќЌ≈÷  блока функций работы с файлами
 
//ѕреобразование из Ћексикона в HTML со сменой кодировки на русскую Windows:
char *Dos=
 "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю€",
     *Win=
 "јЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмноп                                                рстуфхцчшщъыьэю€®Є              ";
#define MAX_RECURSE 3 /*„исло вложений тагов Ћексикона*/
 
void Convert (char *s,char *d) {
 char *Tag[]={
  "", "<i>", "<b>", "<b><i>", "<sub>", "<sup>"
 },
      *Tag2[]={
  "", "</i>", "</b>", "</i></b>", "</sub>", "</sup>"
 };
 int i,k,j=0,l=strlen (s),Fonts=0;
 char c,Font[MAX_RECURSE],UnLine=0;
 d[0]='\0';
 for (i=0; i<l; i++) { //ѕеребираем символы строки
  c=s[i];
  switch (c) {
   case 0xFF: //Ќачало тага Ћексикона
    c=s[i+1];
    if ((c>='0') && (c<'6')) { //Ўрифтовое выделение
     for (k=Fonts-1; k>=0; k--) { //≈сть открытые таги - закрыть их все
      strcat (d,Tag2[Font[k]]);
      j+=strlen(Tag2[Font[k]]);
     }
     Fonts=0;
     c-=48;
     strcat (d,Tag[c]); j+=strlen(Tag[c]); i++;
     Font[Fonts++]=c; //«аписали, какой таг открыли
    }
    else if (c=='_') { //ќткрылось подчеркивание
     strcat (d,"<u>"); j+=3; i++; UnLine=1;
    }
    else if (c=='.') { //«акрылось подчеркивание
     strcat (d,"</u>"); j+=4; i++; UnLine=0;
    }
    else if (c=='7') { //ћатематика
     c=s[i+2];
     i+=2; //!!!
     switch (c) {
      case 'e': strcat (d,"&infty;"); j+=7; break; //Ѕесконечность
      //...!!!
      default:  strcat (d," "); j+=1; break; //Ћюбой другой - пробел.
     }
    }
    else { //Ћюбой другой таг игнорируем
     goto DEFAULT;
    }
   break;
   case '"': strcat (d,"&quot;"); j+=6; break;
   case '<': strcat (d,"&lt;");   j+=4; break;
   case '>': strcat (d,"&gt;");   j+=4; break;
   case '&': strcat (d,"&amp;");  j+=5; break;
   default:
DEFAULT:
    if (c>127) c=Win[c-128]; // онвертируем в Windows!
    d[j++]=c; d[j]='\0';
   break;
  }
 }
 for (k=Fonts-1; k>=0; k--) { //≈сть открытые таги - закрыть их все
  strcat (d,Tag2[Font[k]]);
 }
 if (UnLine) strcat (d,"</u>"); //Ќе закрыто подчеркивание
}
 
int main (int argc, char *argv[]) {
 FILE *f,*w;
 char Str2[MAX_STR*3];
 
 if (argc>1) {
  if ((argv[1][0]=='/') || (argv[1][0]=='?')) Error (1);
  else f=Open(argv[1],"rt");
 }
 else Error (1);
 if (argc>2) w=Open(argv[2],"wt");
 else Error (1);
 
 WriteStr (w,"<HTML><HEAD><TITLE>");
 WriteStr (w,argv[2]);
 WriteStr (w,"</TITLE></HEAD><BODY><PRE>");
 while (!feof(f)) {
  ReadStr (f,Str);
  Convert (Str,Str2);
  WriteStr (w,Str2);
 }
 WriteStr (w,"</PRE></BODY></HTML>");
 Close (w); Close (f);
 Error (0);
 return 0;
}

Ќе уверен, что все символы DOS перенеслись в строку char *Dos корректно, уточнить взаимное соответствие кодировок можно, например, здесь.

–ейтинг@Mail.ru

вверх гостева€; E-mail