Skip to content

Instantly share code, notes, and snippets.

@hodzanassredin
Created May 12, 2023 21:22
Show Gist options
  • Save hodzanassredin/200d9559f6a3a0da8114b43ab26af0a9 to your computer and use it in GitHub Desktop.
Save hodzanassredin/200d9559f6a3a0da8114b43ab26af0a9 to your computer and use it in GitHub Desktop.
poc of packages manager for bb
MODULE PaketView;
IMPORT Dialog, Strings, StdLinks, HyperHttp, TextRulers, Ports, Views, Files, TextViews, StdTextConv, TextControllers, TextModels, TextMappers, Stores, StdLog, StdCoder, Converters;
TYPE Package* = RECORD
data: ARRAY 4 OF TextMappers.String;
isInstalled : BOOLEAN;
depends : PackageList;
END;
PackageList = POINTER TO RECORD
package: Package;
next : PackageList;
END;
CONST
feedUrl = "http://blackbox.oberon.org/list";
name = 0;
description = 1;
descriptionRu = 2;
url = 3;
VAR
packages* : PackageList;
selected : Package;
PROCEDURE NormalizeUrl(VAR url: TextMappers.String);
BEGIN
IF url[4] = 's' THEN
Strings.Replace(url, 0,5,"http");
StdLog.String("Fixed:");
StdLog.String(url);
StdLog.Ln;
END;
END NormalizeUrl;
PROCEDURE ReadPackages(s: TextMappers.Scanner; to : INTEGER) : PackageList;
VAR result, current : PackageList; i, line:INTEGER;
BEGIN
i := 0;
NEW(current);
WHILE ((s.start < to) OR (to = -1)) & (s.type # TextMappers.eot) DO
IF i = 4 THEN
IF result = NIL THEN result := current; END;
NEW(current.next);
current := current.next;
i := 0;
END;
IF s.type = TextMappers.string THEN
current.package.data[i] := s.string;
IF i = url THEN NormalizeUrl(current.package.data[i]) END;
INC(i);
END;
s.Scan
END;
RETURN result;
END ReadPackages;
PROCEDURE ReadFromSelection*;
VAR c: TextControllers.Controller; from, to, ints, reals, strings: INTEGER;
s: TextMappers.Scanner;
BEGIN
c := TextControllers.Focus();
IF (c # NIL) & c.HasSelection() THEN
c.GetSelection(from, to);
s.ConnectTo(c.text);
s.SetPos(from);
s.Scan;
packages := ReadPackages(s, to);
StdLog.String("Packages read finished")
END
END ReadFromSelection;
PROCEDURE FillList (f: Files.File; url: ARRAY OF CHAR);
VAR
s: Stores.Store; res: INTEGER;
text: TextModels.Model;
rd: TextModels.Reader;
sc: TextMappers.Scanner;
BEGIN
StdTextConv.ImportUtf8(f, s);
sc.ConnectTo(s(TextViews.View).ThisModel());
sc.SetPos(0);
sc.Scan;
packages := ReadPackages(sc, -1);
END FillList;
PROCEDURE DownloadList* ();
VAR d: HyperHttp.Downloading;
BEGIN
d := HyperHttp.NewDownloading(feedUrl);
d.onFinish := FillList;
(* d.silent := TRUE; (* to hide log view *) *)
d.Start;
END DownloadList;
PROCEDURE PrintPackageList*();
VAR c : PackageList; i: INTEGER;
BEGIN
c := packages;
WHILE c # NIL DO
FOR i := 0 TO 3 DO
StdLog.String(c.package.data[i]);
StdLog.String(" ");
END;
StdLog.Ln;
c := c.next;
END;
END PrintPackageList;
PROCEDURE WriteRuler (VAR f: TextMappers.Formatter);
CONST cm = 10 * Ports.mm; (* universal units *)
VAR ruler: TextRulers.Ruler;
BEGIN
ruler := TextRulers.dir.New(NIL);
TextRulers.AddTab(ruler, 4 * cm);
TextRulers.AddTab(ruler, 8 * cm);
f.WriteView(ruler)
END WriteRuler;
PROCEDURE Render*;
VAR
c : PackageList;
t: TextModels.Model;
f: TextMappers.Formatter;
v: TextViews.View;
link: StdLinks.Link;
default,blue: TextModels.Attributes;
BEGIN
t := TextModels.dir.New();
f.ConnectTo(t);
WriteRuler(f);
default := f.rider.attr;
blue := TextModels.NewColor(default, Ports.blue);
c := packages;
WHILE c # NIL DO
f.WriteString(c.package.data[name]);
f.WriteTab;
f.rider.SetAttr(blue);
link := StdLinks.dir.NewLink("PaketView.Install('" + c.package.data[url]+ "')");
f.WriteView(link);
IF ~c.package.isInstalled THEN
f.WriteString("install");
ELSE
f.WriteString("reinstall");
END;
link := StdLinks.dir.NewLink("");
f.WriteView(link);
f.rider.SetAttr(default);
f.WriteLn;
IF LEN(c.package.data[description]$) = 0 THEN
f.WriteString("No Description");
ELSE
f.WriteString(c.package.data[description]);
f.WriteInt(LEN(c.package.data[description]$));
END;
f.WriteLn;
f.WriteLn;
c := c.next;
END;
v := TextViews.dir.New(t);
Views.OpenView(v)
END Render;
PROCEDURE ExtractPackage(f: Files.File; url: ARRAY OF CHAR);
VAR text: TextModels.Model;s: Stores.Store; ask : BOOLEAN;
BEGIN
StdTextConv.ImportText(f, s);
text := s(TextViews.View).ThisModel();
ask := StdCoder.askOption;
StdCoder.askOption := FALSE;
StdCoder.DecodeAllFromText (text, 0, FALSE);
StdCoder.askOption := ask;
selected.isInstalled := TRUE;
END ExtractPackage;
PROCEDURE FindPackageByUrl(packetUrl : TextMappers.String; OUT p: Package) ;
VAR c : PackageList;
BEGIN
c := packages;
WHILE c # NIL DO
IF c.package.data[url] = packetUrl THEN
p := c.package;
END;
c := c.next;
END;
END FindPackageByUrl;
PROCEDURE AddDependency(package, dep: Package);
VAR c: PackageList;
BEGIN
IF package.depends = NIL THEN
NEW(package.depends);
package.depends.package := dep
ELSE
c := package.depends;
WHILE c.next # NIL DO c := c.next; END;
NEW(c.next);
c.next.package := dep
END;
END AddDependency;
PROCEDURE GetDependencies*();
VAR loc: Files.Locator; conv: Converters.Converter;
v: Views.View; t: TextModels.Model; sc: TextMappers.Scanner; fName:Files.Name;
foundLine:BOOLEAN;
BEGIN
loc := Files.dir.This(selected.data[name] + "/Docu");
conv := NIL;
fName := "Quick-Start.odc";
v := Views.Old(FALSE, loc, fName, conv);
IF (v # NIL) & (v IS TextViews.View) THEN
t := v(TextViews.View).ThisModel();
sc.ConnectTo(t);
sc.SetOpts(sc.opts + {TextMappers.returnCtrlChars});
sc.SetPos(0);
sc.Scan;
WHILE (sc.type # TextMappers.eot) & ~foundLine DO
IF (sc.type = TextMappers.string) & (sc.string = "Depends") THEN
foundLine:= TRUE;
END;
sc.Scan;
END;
IF foundLine THEN
sc.Scan;
ASSERT(sc.char = ':');
sc.Scan; (* expecting words separated by , *)
WHILE (sc.type # TextMappers.line) DO
IF (sc.type = TextMappers.string) & (sc.string = "Depends") THEN
foundLine:= TRUE;
END;
sc.Scan;
END;
END;
END;
END GetDependencies;
PROCEDURE Install*(packetUrl : TextMappers.String);
VAR d: HyperHttp.Downloading;
BEGIN
FindPackageByUrl(packetUrl, selected);
IF selected.isInstalled THEN RETURN; END;
d := HyperHttp.NewDownloading(packetUrl);
d.onFinish := ExtractPackage;
(* d.silent := TRUE; (* to hide log view *) *)
d.Start;
END Install;
BEGIN
END PaketView.
PaketView.DownloadList
PaketView.ReadFromSelection
PaketView.PrintPackageList
PaketView.Render
PaketView.GetDependencies
"Ogl" "" "" "https://stdcoded.oberon.org/bbext/ogl.txt"
"Grid" "Tables" "Таблицы" "http://blackbox.oberon.org/download/Grid.txt"
"Hyper" "Download content by HTTP" "Скачивает данные по протоколу HTTP" "https://stdcoded.oberon.org/bbext/hyper.txt"
"Xmlcore" "The subsystem Xmlcore is an implementation of the DOM Level 2 and a XML-parser, based on DOM." "Подсистема Xmlcore реализует DOM уровня 2 и XML-парсер на базе DOM." "http://blackbox.oberon.org/download/Xmlcore.txt"
"Tabs" "Automatic aux windows management with tabs on the top panel and panel menu" "Автоматическое управление положением внутренних окон через панель вкладок, а также панель меню с иконками" "http://blackbox.oberon.org/download/Tabs.txt"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment