Created
May 12, 2023 21:22
-
-
Save hodzanassredin/200d9559f6a3a0da8114b43ab26af0a9 to your computer and use it in GitHub Desktop.
poc of packages manager for bb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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