Пётр Кушнир писал(а):
Бинарник вот тут
https://dl.dropboxusercontent.com/u/953 ... extract.7zИсходник для него пока в подсистеме YWin в репозитории bb.open, соответственно, он только для Windows.
Пётр, скажу честно, разработка — шедевр реализации!
Пробовал адаптировать ваши наработки для Linux на основе закрытой версии, чтобы сразу выдавалось в вывод содержимое файла без встроенных отображений и т.п.. Вот что у меня получилось:
Вложение:
odctoutf8.7z [305.11 КБ]
Скачиваний: 424
Исходный код:
Код:
MODULE Init;
IMPORT Kernel, Dialog, Converters, HostMenus, Log, LinLog, TextModels, Stores, Files, TextViews, Views, Strings;
CONST
CR = 0DX;
PROCEDURE LogUTF8Char (ch: CHAR);
BEGIN (* UTF-8 format *)
IF ch <= 7FX THEN
Log.Char(CHR(SHORT(SHORT(ORD(ch)))))
ELSIF ch <= 7FFX THEN
Log.Char(CHR(SHORT(SHORT( - 64 + ORD(ch) DIV 64))));
Log.Char(CHR(SHORT(SHORT( - 128 + ORD(ch) MOD 64))))
ELSE
Log.Char(CHR(SHORT(SHORT( - 32 + ORD(ch) DIV 4096))));
Log.Char(CHR(SHORT(SHORT( - 128 + ORD(ch) DIV 64 MOD 64))));
Log.Char(CHR(SHORT(SHORT( - 128 + ORD(ch) MOD 64))))
END
END LogUTF8Char;
PROCEDURE SplitFileName (fullpath: ARRAY OF CHAR; woExt: BOOLEAN; OUT path, name, type: ARRAY OF CHAR);
VAR i, dot, slash, shift: INTEGER; ok: BOOLEAN;
BEGIN
i := LEN(fullpath$); dot := - 1; slash := - 1; ok := FALSE;
path := ''; name := ''; type := '';
WHILE (i >= 0) & ~ok DO
IF (fullpath[i] = '.') & (dot = - 1) THEN dot := i
ELSIF ((fullpath[i] = '/') OR (fullpath[i] = '\')) & (slash = - 1) THEN slash := i END;
ok := (slash # - 1);
DEC(i)
END;
IF dot > - 1 THEN Strings.Extract(fullpath, dot + 1, LEN(fullpath$), type) ELSE dot := 0 END;
IF slash > - 1 THEN Strings.Extract(fullpath, 0, slash, path); INC(slash) ELSE slash := 0 END;
IF LEN(fullpath$) > (LEN(type$) + LEN(path$) + 2) THEN
IF slash=0 THEN shift:=1 ELSE shift:=2 END;
IF woExt THEN Strings.Extract(fullpath, slash, LEN(fullpath$) - LEN(path$) - LEN(type$) - shift, name)
ELSE Strings.Extract(fullpath, slash, LEN(fullpath$) - (LEN(path$)) + 1, name) END;
END
END SplitFileName;
PROCEDURE Init;
VAR res: INTEGER; m: Kernel.Module; actualPath, vs, p0, n0, t0: ARRAY 2048 OF CHAR; loc: Files.Locator; name: Files.Name; conv: Converters.Converter; view: Views.View;
md: TextModels.Model; rd: TextModels.Reader; ch: CHAR;
BEGIN
LinLog.Open;
Converters.Register("Documents.ImportDocument", "Documents.ExportDocument", "", "odc", {});
IF Kernel.bootInfo.argc = 2 THEN
SplitFileName(Kernel.bootInfo.argv[1]$, TRUE, p0, n0, t0 );
conv := NIL;
name := n0$ + "." + t0$;
loc := Files.dir.This(p0);
view := Views.Old (Views.dontAsk,loc, name, conv);
IF view # NIL THEN
WITH view: TextViews.View DO
md := view(TextViews.View).ThisModel();
IF md # NIL THEN
rd := md.NewReader(NIL);
rd.ReadChar(ch);
WHILE ~rd.eot DO
IF ch = CR THEN Log.Ln ELSE LogUTF8Char(ch) END;
rd.ReadChar(ch)
END
END
ELSE
Log.String("odc contains not a text view")
END
ELSE
Log.String("no file" + Kernel.bootInfo.argv[1]$); Log.Ln
END
ELSE
Log.String("no file specified"); Log.Ln
END
END Init;
BEGIN
Init
END Init.
Собирал я это дело часа три на линукс версии
пришлось выкорчевывать систему печати из разных модулей, так как она не портирована. Каков же результат?
Команда:
Код:
./odctoutf8 Host/Mod/Files.odc
Выдает содержимое файла в консоль. Чудесно, но когда это дело прикручиваю к git, он ругается, что прочитать файл не может:
Код:
divan@hp:~/oberon/cb16$ git diff HEAD^^^^ HEAD^^^^^
diff --git a/Sql/Code/DB.ocf b/Sql/Code/DB.ocf
index 36a98d9..36b5942 100644
Binary files a/Sql/Code/DB.ocf and b/Sql/Code/DB.ocf differ
fatal: unable to read files to diff
Если вывод пропустить через вот такой скрипт:
Код:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
oneline = False
try:
p = os.popen('/usr/local/bin/odctoutf8 ' + sys.argv[1], "r")
while 1:
line = p.readline()
if not line: break
newline = "".join([i for i in line if ord(i) < 128 and ord(i) > 31 or ord(i) == 9])+"\n"
newline = newline.replace("\t", " ")
if newline != "\n" and newline != "":
print newline,
oneline = True
except IndexError:
print "Error: no file passed to converter. Please report event to admin."
if not oneline:
print "empty result of odc-to-ascii conversation"
То все работает прекрасно:
Код:
divan@hp:~/oberon/cb16$ git diff HEAD^^^^ HEAD^^^^^
diff --git a/Sql/Code/DB.ocf b/Sql/Code/DB.ocf
index 36a98d9..36b5942 100644
Binary files a/Sql/Code/DB.ocf and b/Sql/Code/DB.ocf differ
diff --git a/Sql/Mod/DB.odc b/Sql/Mod/DB.odc
index ecdbfa3..19eca6a 100644
--- a/Sql/Mod/DB.odc
+++ b/Sql/Mod/DB.odc
@@ -142,7 +142,7 @@ MODULE SqlDB;
VAR j: INTEGER;
BEGIN (* extract the designator that describes a global variable *)
j := 0;
- IF (CAP(ch) >= "A") & (CAP(ch) <= "Z") THEN
+ IF (CAP(ch) >= "A") & (CAP(ch) < "Z") THEN
REPEAT
t[j] := ch; INC(j);
INC(i); ch := s[i]
В локальном репозитории все шикарно почти! Но вот беда, Gtk2 требует себе дисплей на сервере:
Цитата:
(odctoutf8:23318): Gtk-WARNING **: cannot open display:
Проблему решил установкой виртуального дисплея! В консоли не сервере заработало, НО вот когда Питон это все дело запускает опять ругается на отсутствие дисплея:
Выкорчевывать Gtk2 из всех модулей у меня уже сил нет в ближайшие дни. Может у кого есть идеи, как без TextViews и TextModels можно обойтись??? Это бы сильно упростило задачу!!!