Ключевые слова: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: [email protected] (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 ([email protected])
+# 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 = [email protected]
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)