omcUnicodeMap

Запись текста-карты юникод-литер 0000-FFFF

Команда Unicode_map.Open формирует текст с картой юникод-литер и открывает его в режиме обзора (Dev→Browser Mode):

  • Копирование литер: выделить (двойной щелчок) и перетащить в нужный документ.
  • Навигация — по полужирным числам-кодам: по-горизонтали — прыжок на соотв-ю 100H-ю пределах текущей 1000H-и; по-вертикали — прыжок на соответствующую тысячу.
  • Перед 1000H-ми — ссылки на юникод-карты в википедии: http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF

Замечания:

  • Литеры 00H-1FH и 7FH являются особыми для текстов Блэкбокса, поэтому выводятся их коды.
  • Если документ сохранять — имеет смысл убрать1) две первые бесполезные строчки.
  • Для вставки в текст частоупотребимых литер (после того, как они найдены в таблице), можно завести команды в меню2):
    	PROCEDURE InsertChar* (x: INTEGER);
    		VAR msg: Controllers.EditMsg;
    	BEGIN
    		msg.op := Controllers.pasteChar; msg.char := CHR(x);
    		Controllers.Forward(msg)
    	END InsertChar;
    	"Вставить тире"		""	"Xxx.InsertChar(2015H)"	"StdCmds.PasteCharGuard"
MODULE Unicode_map;
 
    IMPORT
        Strings, Ports, Views, Containers, Fonts,
        StdLinks,
        TextModels, TextViews, TextControllers, TextMappers, TextRulers;
 
    PROCEDURE IntToHex4Str (x: INTEGER; OUT s: ARRAY OF CHAR);
    BEGIN
        Strings.IntToStringForm(x, Strings.hexadecimal, 4, "0", Strings.hideBase, s)
    END IntToHex4Str;
 
    PROCEDURE WriteLLink (VAR fmt: TextMappers.Formatter; IN cmd: ARRAY OF CHAR);
    BEGIN
        fmt.WriteView(StdLinks.dir.NewLink(cmd))
    END WriteLLink;
 
    PROCEDURE WriteLLinkX (VAR fmt: TextMappers.Formatter; c: INTEGER);
        VAR    s: ARRAY 5 OF CHAR;
    BEGIN
        IntToHex4Str(c, s);
        WriteLLink(fmt, "StdLinks.ShowTarget('" + s + "')")
    END WriteLLinkX;
 
    PROCEDURE WriteLTargetX (VAR fmt: TextMappers.Formatter; c: INTEGER);
        VAR    s: ARRAY 5 OF CHAR;
    BEGIN
        Strings.IntToStringForm(c, Strings.hexadecimal, 4, "0", Strings.hideBase, s);
        fmt.WriteView(StdLinks.dir.NewTarget(s))
    END WriteLTargetX;
 
    PROCEDURE WriteRLink (VAR fmt: TextMappers.Formatter);
    BEGIN
        fmt.WriteView(StdLinks.dir.NewLink(""))
    END WriteRLink;
 
    PROCEDURE WriteRTarget (VAR fmt: TextMappers.Formatter);
    BEGIN
        fmt.WriteView(StdLinks.dir.NewTarget(""))
    END WriteRTarget;
 
    PROCEDURE WriteWikiLink (VAR fmt: TextMappers.Formatter; c: INTEGER);
        VAR
            normal, blueUnderlined: TextModels.Attributes;
            s: ARRAY 5 OF CHAR; s1: ARRAY 10 OF CHAR;
    BEGIN
        normal := fmt.rider.attr;
        blueUnderlined := TextModels.NewColor(
            TextModels.NewStyle(fmt.rider.attr, {Fonts.underline}),
            Ports.blue);
        IntToHex4Str(c, s1); IntToHex4Str(c + 0FFFH, s);
        s1 := s1 + "-" + s;
        fmt.WriteLn;
        fmt.rider.SetAttr(blueUnderlined);
        WriteLTargetX(fmt, c);
        WriteRTarget(fmt);
        WriteLLink(fmt, "i21sysCalls.Open('"
            + "http://en.wikibooks.org/wiki/Unicode/Character_reference/" + s1
            + "')");
        fmt.WriteString(s1);
        WriteRLink(fmt);
        fmt.rider.SetAttr(normal)
    END WriteWikiLink;
 
    PROCEDURE WriteHeader (VAR fmt: TextMappers.Formatter; c: INTEGER);
        VAR
            i: INTEGER;
            normal, bold: TextModels.Attributes;
    BEGIN
        normal := fmt.rider.attr;
        bold := TextModels.NewWeight(fmt.rider.attr, Fonts.bold);
        fmt.WriteLn;
        fmt.rider.SetAttr(bold);
        WriteLTargetX(fmt, c);
        fmt.WriteString("U+");
        WriteRTarget(fmt);
        i := 0;
        WHILE i < 10H DO
            fmt.WriteTab;
            WriteLLinkX(fmt, (c - c MOD 1000H) + i * 100H);
            fmt.WriteIntForm(i, TextMappers.hexadecimal, 1, "0", TextMappers.hideBase);
            WriteRLink(fmt);
            INC(i)
        END;
        fmt.rider.SetAttr(normal)
    END WriteHeader;
 
    PROCEDURE WriteText (VAR fmt: TextMappers.Formatter);
        VAR
            c: INTEGER;
            normal, bold: TextModels.Attributes;
    BEGIN
        normal := fmt.rider.attr;
        bold := TextModels.NewWeight(fmt.rider.attr, Fonts.bold);
        c := 0H;
        WHILE c <= 0FFFFH DO
            IF c MOD 1000H = 0 THEN WriteWikiLink(fmt, c) END;
            IF c MOD 100H = 0 THEN WriteHeader(fmt, c) END;
            IF c MOD 10H = 0 THEN
                fmt.WriteLn;
                fmt.rider.SetAttr(bold);
                WriteLLinkX(fmt, c DIV 10H MOD 10H * 1000H);
                fmt.WriteIntForm(c, TextMappers.hexadecimal, 4, "0", TextMappers.hideBase);
                WriteRLink(fmt);
                fmt.rider.SetAttr(normal)
            END;
            fmt.WriteTab; fmt.WriteChar(CHR(c));
            INC(c)
        END
    END WriteText;
 
    PROCEDURE MakeRuler (OUT r: TextRulers.Ruler);
        VAR    i: INTEGER;
    BEGIN
        r := TextRulers.dir.New(NIL);
        TextRulers.AddTab(r, 15 * Ports.mm);
        i := 1;
        WHILE i <= 16 DO
            TextRulers.AddTab(r, (15 + 9 * i) * Ports.mm);
            INC(i)
        END
    END MakeRuler;
 
    PROCEDURE Open*;
        VAR
            t: TextModels.Model; fmt: TextMappers.Formatter;
            v: TextViews.View; r: TextRulers.Ruler;
    BEGIN
        t := TextModels.dir.New();
        fmt.ConnectTo(t); WriteText(fmt);
        v := TextViews.dir.New(t);
        MakeRuler(r); v.SetDefaults(r, TextModels.dir.attr);
        Views.OpenView(v);
        v.ThisController().SetOpts({Containers.noCaret})
    END Open;
 
END Unicode_map.
1) переключишись в режим правки (Dev→Edit Mode)
2) Текст процедуры и пункта меню списаны с команд TextCmds.Insert…
© 2005-2016 OberonCore и коллектив авторов.