The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Oб одном подходе к русификации Ted (rus ed)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: rus, ed,  (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _ From : Victor Wagner 2:5020/219.27 26 Oct 99 00:25:18 Subj : Oб одном подходе к русификации Ted ________________________________________________________________________________ From: vitus@wagner.rinet.ru (Victor Wagner) Есть такой симпатичный редактор Ted. Точнее, не редактор а WordProcessor. Маленький (относительно, всего мегабайта два), с достаточно мощными возможностями вставления картинок и создания таблиц, небогатым но достаточным шрифтовым оформлением. Hо самым главным его полезным свойством является то, что он использует в качестве формата файлов rtf. Да, тот самый rtf, в котором всякий более-менее разумный пользователь MS-Office, не желающий прослыть распространителем вирусов и показать всему миру свои диалапные пароли, рассылает по почте документы сделанные в Word. Впрочем, главная ценность rtf не в этом. Его ценность в том, что _получив_ по почте документ rtf пользователь Windows видит иконку Word, кликает на ней и видит Word с документом внутри. Поэтому идея использовать Ted для писания документов для начальства кажется весьма привлекательной. (для тех, кто не знает, ted берется с http://www.nllgg.nl/Ted) Русификация этого редактора большой проблемы вроде бы не представляет. Подсуньте ему русские Type-1 шрифты, напишите ему xfonts.dir для отображения постскриптовских имен в X-овые и все Ok. Xkb он понимает с ходу. Одно но - у меня локаль ru_RU.KOI8-R, а пользователи Windows по каким-то странным причинам все больше cp1251 используют. Подумав, я пришел к выводу, что буде система у меня в KOI8, то общаться с X-ами (как по части ввода, так и по части вывода) и с подсистемой печати Ted должен в KOI8, а вот писать и читать rtf-ы, раз уж этот формат изобретен фирмой Microsoft - в cp1251. Поэтому самое место для встраивания перекодировки - блок чтения записи rtf. Подумав еще немного, я понял, что проблема эта будет стоять не только перед русскими, но скажем и перед чехами, у которых будет другая пара кодировок, и, следовательно данная фича должа быть конфигурируема. В результате родился нижеследующий patch. Он работает следующим образом - появляется новый ресурс Ted.alternateCharset, который можно прописать в Ted.ad, или в свой домашний .Xdefaults Этот ресурс содержит имя файла, в котором хранится таблица перекодировки из системной кодировки в желаемую кодировку rtf-файла в том же формате, что и таблицы кодировки в Russian Apache. Включенная в патч koi-win.tab просто-таки оттуда и выдрана. Если имя файла начинается со слэша, то путь абсолютный. Иначе - относительно PKGDIR (в дефолтной установке это /usr/local) Если этот ресурс задан, файл найден и формат его правильный, то все rtf-ы будут читаться и писаться с перекодировкой. Dixi. - --- ted-2.6.orig/Ted/docBuf.h +++ ted-2.6/Ted/docBuf.h @@ -1207,4 +1207,6 @@ extern int docSubstitutePageNumber( BufferItem * bi, int pageNumber ); +extern int * charsetInTable; +extern int * charsetOutTable; # endif - --- ted-2.6.orig/Ted/docRtf.h +++ ted-2.6/Ted/docRtf.h @@ -1313,3 +1313,8 @@ const RtfControlWord * rcw, int arg, RtfReadingContext * rrc ); + +extern void docRtfLoadCharsets (char *charset_name); +extern int *charsetInTable; +extern int *charsetOutTable; +int charsetRecode(int c, int *table); - --- ted-2.6.orig/Ted/docRtfUtil.c +++ ted-2.6/Ted/docRtfUtil.c @@ -380,6 +380,8 @@ b[2]= '\0'; sscanf( b, "%x", &c ); + if (c>127) + c=charsetRecode(c,charsetInTable); } goto defaultCase; default: @@ -963,3 +965,45 @@ const unsigned char * text, int len ) { return 0; } + +int* charsetInTable=NULL; +int* charsetOutTable=NULL; +void docRtfLoadCharsets (char *charset_name) { + FILE *f; + int native,alternate,i; + char buffer[256]; + if (*charset_name=='/') { + /* absolute path */ + strncpy(buffer,charset_name,255); + buffer[256]=0; + } else { + strcpy(buffer,PKGDIR); + strcat(buffer,"/"); + strcat(buffer,charset_name); + } + fprintf(stderr,"Loading charset %s\n",buffer); + f=fopen(buffer,"r"); + if (!f) return; + charsetInTable=(int *)calloc(256,sizeof(int)); + charsetOutTable=(int *)calloc(256,sizeof(int)); + for (i=0;i<256;i++) { + charsetInTable[i]=charsetOutTable[i]=i; + } + while (!feof(f)) { + fgets(buffer,256,f); + if (sscanf(buffer,"%i %i",&native,&alternate)==2 && + 0<=native && native<256 && 0<=alternate && alternate<256) { + charsetInTable[alternate]=native; + charsetOutTable[native]=alternate; + } + } + fprintf(stderr,"charset loaded successfully. InTable=%x\n",(int) charsetInTable); +} + +int charsetRecode(int c, int *table) { + if (table) { + return table[c]; + } else { + return c; + } +} - --- ted-2.6.orig/Ted/docRtfWrite.c +++ ted-2.6/Ted/docRtfWrite.c @@ -65,6 +65,7 @@ { static char hexdigits[]= "0123456789abcdef"; + c = charsetRecode(c,charsetOutTable); sioOutPutCharacter( '\\', sos ); sioOutPutCharacter( '\'', sos ); sioOutPutCharacter( hexdigits[ ( c >> 4 ) & 0x0f ], sos ); - --- ted-2.6.orig/Ted/tedMain.c +++ ted-2.6/Ted/tedMain.c @@ -49,6 +49,7 @@ char * tarDocTableMenuText; char * tarHelpMenuText; char * tarAppHelpFileName; + char * tarAlternateCharset; } TedAppResources; # define xx(x) x,x @@ -116,6 +117,9 @@ { xx("documentFileName"), XtRString, sizeof(char *), offsetof(TedAppResources,tarAppHelpFileName), XtRString, INFODIR "/TedDocument.rtf" }, + { xx("alternateCharset"), XtRString, sizeof(char *), + offsetof(TedAppResources,tarAlternateCharset), + XtRString, ""}, }; @@ -233,6 +237,7 @@ if ( dot && ! strcmp( dot, ".rtf" ) ) { /* 2 */ + fprintf(stderr,"alternate charset = '%s'\n",TEDResources.tarAlternateCharset); bd= docRtfReadFile( sis ); sioInClose( sis ); @@ -316,6 +321,10 @@ int forgetName= 0; + if (charsetInTable == NULL && TEDResources.tarAlternateCharset + && *(TEDResources.tarAlternateCharset)) { + docRtfLoadCharsets(TEDResources.tarAlternateCharset); + } if ( tedOpenDocumentFile( ea, &ed->edFormat, &td->tdDocument, &forgetName, filename, relative, option ) ) { /*SDEB(filename);*/ return -1; } @@ -326,7 +335,21 @@ return 0; } +/********************************************************************/ +/* Just a wrapper around tedNewDocument in tedDocument.c to get */ +/* access to app resource alternateCharset */ +/********************************************************************/ +static int tedCreateNewDocument ( EditApplication * ea, + EditDocument * ed, + const char * filename ) + { + if (charsetInTable == NULL && TEDResources.tarAlternateCharset + && *(TEDResources.tarAlternateCharset)) { + docRtfLoadCharsets(TEDResources.tarAlternateCharset); + } + return tedNewDocument(ea,ed,filename); + } /************************************************************************/ /* */ /* Display the online manual. */ @@ -1631,7 +1654,7 @@ tedSetPrivateData, tedMakeDocumentWidget, tedOpenDocument, - tedNewDocument, + tedCreateNewDocument, tedSetupDocument, tedFinishDocumentSetup, NULL, /* CanSave */ - --- ted-2.6.orig/appFrame/appFont.c +++ ted-2.6/appFrame/appFont.c @@ -32,8 +32,9 @@ static EditFontEncoding EditFontXEncodings[]= { - { "iso8859", "1" }, /* For Text */ - { "iso8859", "2" }, /* For Text */ +/* { "iso8859", "1" },*/ /* For Text */ +/* { "iso8859", "2" },*/ /* For Text */ + { "koi8", "r" }, /* For russian text */ { "adobe", "fontspecific" }, /* Symbol. */ }; - --- ted-2.6.orig/koi-win.tab +++ ted-2.6/koi-win.tab @@ -0,0 +1,70 @@ +# koi8-win recoding table for Russian Apache +# by Dmitry M. Klimoff (dmk@kosnet.ru) +# With "YO" support + +0xe1 0xc0 +0xe2 0xc1 +0xf7 0xc2 +0xe7 0xc3 +0xe4 0xc4 +0xe5 0xc5 +0xf6 0xc6 +0xfa 0xc7 +0xe9 0xc8 +0xea 0xc9 +0xeb 0xca +0xec 0xcb +0xed 0xcc +0xee 0xcd +0xef 0xce +0xf0 0xcf +0xf2 0xd0 +0xf3 0xd1 +0xf4 0xd2 +0xf5 0xd3 +0xe6 0xd4 +0xe8 0xd5 +0xe3 0xd6 +0xfe 0xd7 +0xfb 0xd8 +0xfd 0xd9 +0xff 0xda +0xf9 0xdb +0xf8 0xdc +0xfc 0xdd +0xe0 0xde +0xf1 0xdf +0xc1 0xe0 +0xc2 0xe1 +0xd7 0xe2 +0xc7 0xe3 +0xc4 0xe4 +0xc5 0xe5 +0xd6 0xe6 +0xda 0xe7 +0xc9 0xe8 +0xca 0xe9 +0xcb 0xea +0xcc 0xeb +0xcd 0xec +0xce 0xed +0xcf 0xee +0xd0 0xef +0xd2 0xf0 +0xd3 0xf1 +0xd4 0xf2 +0xd5 0xf3 +0xc6 0xf4 +0xc8 0xf5 +0xc3 0xf6 +0xde 0xf7 +0xdb 0xf8 +0xdd 0xf9 +0xdf 0xfa +0xd9 0xfb +0xd8 0xfc +0xdc 0xfd +0xc0 0xfe +0xd1 0xff +0xb3 0xa8 +0xa3 0xb8 -- Victor Wagner @ home = vitus@wagner.rinet.ru I don't answer questions by private E-Mail from this address. --- ifmail v.2.14.os-p7 * Origin: Where is your mouse [/dev/Wagner's home (2:5020/219.27@fidonet)

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру