text:
Oberon/A2/Oberon.News.Mod

(* ETH Oberon, Copyright 2001 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *) MODULE News IN Oberon; (** portable *)	(* ejz, *) IMPORT BTrees, Strings, HyperDocs, Files, Objects, Texts, Display, Fonts, Display3, Oberon, NetSystem, NetTools, Gadgets, Attributes, TextGadgets, TextDocs, Documents, Desktops, Links, Modules, MIME, Streams, TextStreams, Mail, Dates, FileDir; (** This module implements a newsreader (RFC 977, 1036) for oberon. The News-module supports news and nntp urls. 		The nntp host is specified in the NetSystem section of the Registry (e.g. NNTP=news.inf.ethz.ch). 		The following lines should be added to the LinkSchemes section of the Registry: 			nntp = News.NewNNTPLinkScheme 			news = News.NewNewsLinkScheme 		And the following lines to the Documents section: 			nntp News.NewDoc 			news News.NewDoc. 		For sending or posting new articles your e-mail address should be defined in the NetSystem section of the Registry. 		e.g.: EMail = "me@home" *) CONST DefPort = 119; InitText = "News.Read.Text"; Done* = NetTools.Done; ErrGroup* = 1; ErrXOver* = 2; ErrArticle* = 3; ErrStat* = 4; ErrList* = 5; ErrPost* = 6; Failed* = NetTools.Failed; MaxMessages = 16*1024; TYPE ArtNrs = POINTER TO ArtNrsDesc; ArtNrsDesc = RECORD beg, end: SIGNED32; next: ArtNrs END; Group = POINTER TO GroupDesc; GroupDesc = RECORD name: ARRAY 128 OF CHAR; subscribed: BOOLEAN; readArtNrs: ArtNrs; next: Group END; (** The connection to an nntp. *) Session* = POINTER TO SessionDesc; SessionDesc* = RECORD (Mail.SMTPSessionDesc) END; VAR W, Wr: Texts.Writer; groups, curGrp: Group; curGrpNewOnly: BOOLEAN; newgDate, newgTime: SIGNED32; EMail: ARRAY NetTools.ServerStrLen OF CHAR; refs: Files.File; indexM, indexA: BTrees.Tree; availBeg, beg, end, level, thread: SIGNED32; marked: POINTER TO ARRAY OF BOOLEAN; line: ARRAY 2*NetTools.MaxLine OF CHAR; newsFont: Fonts.Font; trace: BOOLEAN; PROCEDURE ScanInt(VAR S: Texts.Scanner; VAR i: SIGNED16); BEGIN IF S.class = Texts.Int THEN i := SHORT(S.i); Texts.Scan(S) ELSE i := 0 END END ScanInt; PROCEDURE ScanDate(VAR S: Texts.Scanner; VAR date: SIGNED32); VAR day, month, year: SIGNED16; BEGIN ScanInt(S, day); ScanInt(S, month); ScanInt(S, year); IF year < 100 THEN IF (month = 0) OR (day = 0) THEN year := 1980; month := 1; day := 1 ELSE year := year + 1900 END END; date := Dates.ToDate(year, month, day) END ScanDate; PROCEDURE ScanTime(VAR S: Texts.Scanner; VAR time: SIGNED32); VAR hour, min, sec: SIGNED16; BEGIN ScanInt(S, hour); ScanInt(S, min); ScanInt(S, sec); time := Dates.ToTime(hour, min, sec) END ScanTime; PROCEDURE TwoDigit(i: SIGNED16; VAR str: ARRAY OF CHAR); BEGIN str[0] := CHR((i DIV 10)+ORD("0")); str[1] := CHR((i MOD 10)+ORD("0")); str[2] := 0X END TwoDigit; PROCEDURE ConcatDate(VAR line: ARRAY OF CHAR; VAR date: SIGNED32); VAR str: ARRAY 8 OF CHAR; day, month, year: SIGNED16; BEGIN Dates.ToYMD(date, year, month, day); IF year < 2000 THEN TwoDigit(year MOD 100, str) ELSE Strings.IntToStr(year, str) END; Strings.Append(line, str); TwoDigit(month, str); Strings.Append(line, str); TwoDigit(day, str); Strings.Append(line, str) END ConcatDate; PROCEDURE ConcatTime(VAR line: ARRAY OF CHAR; VAR time: SIGNED32); VAR str: ARRAY 8 OF CHAR; hour, min, sec: SIGNED16; BEGIN Dates.ToHMS(time, hour, min, sec); TwoDigit(hour, str); Strings.Append(line, str); TwoDigit(min, str); Strings.Append(line, str); TwoDigit(sec, str); Strings.Append(line, str) END ConcatTime; PROCEDURE LoadInitText; VAR text: Texts.Text; S: Texts.Scanner; group, lastg: Group; art, last: ArtNrs; i: SIGNED32; val: ARRAY 64 OF CHAR; BEGIN IF NetTools.QueryString("NewsFont", val) & (Fonts.This(val) # NIL) THEN newsFont := Fonts.This(val) ELSE newsFont := Fonts.Default END; groups := NIL; lastg := NIL; NEW(text); Texts.Open(text, InitText); Texts.OpenScanner(S, text, 0); Texts.Scan(S); ScanDate(S, newgDate); ScanTime(S, newgTime); WHILE ~S.eot DO 			NEW(group); IF (S.class = Texts.Char) & (S.c = "!") THEN group.subscribed := FALSE; Texts.Scan(S) ELSE group.subscribed := TRUE END; IF S.class IN {Texts.Name, Texts.String} THEN COPY(S.s, group.name); i := 0; WHILE group.name[i] # 0X DO 					INC(i) END; IF group.name[i-1] = ":" THEN group.name[i-1] := 0X END; group.next := NIL; IF lastg # NIL THEN lastg.next := group ELSE groups := group END; lastg := group; group.readArtNrs := NIL; last := NIL; Texts.Scan(S); IF ((S.class = Texts.Char) & (S.c = ":")) OR ((S.class IN {Texts.Name, Texts.String}) & (S.s = ":")) THEN Texts.Scan(S) END; WHILE ~S.eot & (S.class = Texts.Int) DO 					NEW(art); art.next := NIL; IF last = NIL THEN group.readArtNrs := art ELSE last.next := art END; last := art; art.beg := S.i; Texts.Scan(S); IF ((S.class = Texts.Char) & (S.c = "-")) OR ((S.class IN {Texts.Name, Texts.String}) & (S.s = "-")) THEN Texts.Scan(S); IF S.class = Texts.Int THEN art.end := S.i; 							Texts.Scan(S) ELSE art.end := art.beg END ELSIF (S.class = Texts.Int) & (S.i < 0) THEN art.end := -S.i; 						Texts.Scan(S) ELSE art.end := art.beg END; IF (S.class = Texts.Char) & (S.c = ",") THEN Texts.Scan(S) END END ELSE Texts.Scan(S) END END END LoadInitText; PROCEDURE WriteDate(VAR W: Texts.Writer; VAR date: SIGNED32); VAR day, month, year: SIGNED16; BEGIN Dates.ToYMD(date, year, month, day); Texts.WriteInt(W, day, 0); Texts.Write(W, " "); Texts.WriteInt(W, month, 0); Texts.Write(W, " "); Texts.WriteInt(W, year, 0) END WriteDate; PROCEDURE WriteTime(VAR W: Texts.Writer; VAR time: SIGNED32); VAR hour, min, sec: SIGNED16; BEGIN Dates.ToHMS(time, hour, min, sec); Texts.WriteInt(W, hour, 0); Texts.Write(W, " "); Texts.WriteInt(W, min, 0); Texts.Write(W, " "); Texts.WriteInt(W, sec, 0) END WriteTime; PROCEDURE storeInitText; VAR text: Texts.Text; group: Group; art: ArtNrs; F: Files.File; len: SIGNED32; name: FileDir.FileName; BEGIN NEW(text); Texts.Open(text, ""); WriteDate(W, newgDate); Texts.Write(W, " "); WriteTime(W, newgTime); Texts.WriteLn(W); group := groups; WHILE group # NIL DO 			IF ~group.subscribed THEN Texts.Write(W, "!") END; len := 0; WHILE (group.name[len] # 0X) & (Strings.IsAlpha(group.name[len]) OR (group.name[len] = ".")) DO 				INC(len) END; IF group.name[len] # 0X THEN Texts.Write(W, 22X); Texts.WriteString(W, group.name); Texts.Write(W, 22X) ELSE Texts.WriteString(W, group.name) END; Texts.WriteString(W, ": "); art := group.readArtNrs; WHILE art # NIL DO 				Texts.WriteInt(W, art.beg, 0); IF art.end > art.beg THEN Texts.WriteString(W, " - "); Texts.WriteInt(W, art.end, 0) END; art := art.next; IF art # NIL THEN Texts.WriteString(W, ", ") END END; Texts.WriteLn(W); group := group.next END; Texts.Append(text, W.buf); F := Files.Old(InitText); IF F # NIL THEN Files.GetName(F, name) ELSE COPY(InitText, name) END; F := Files.New(name); Texts.Store(text, F, 0, len); Files.Register(F) END storeInitText; (** News.StoreInitText 		Store information on read articles and subscribed groups. *) PROCEDURE StoreInitText*; BEGIN Texts.WriteString(W, "Store "); Texts.WriteString(W, InitText); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); storeInitText END StoreInitText; PROCEDURE NewArtNr(nr: SIGNED32): ArtNrs; VAR art: ArtNrs; BEGIN NEW(art); art.next := NIL; art.beg := nr; art.end := nr; RETURN art END NewArtNr; PROCEDURE AddArtNr(group: Group; nr: SIGNED32); VAR prev, cur, art: ArtNrs; BEGIN prev := NIL; cur := group.readArtNrs; WHILE (cur # NIL) & (cur.beg <= nr) DO 			prev := cur; cur := cur.next END; IF cur # NIL THEN IF cur.beg = (nr+1) THEN cur.beg := nr 			ELSIF prev # NIL THEN IF prev.end = (nr-1) THEN prev.end := nr 				ELSIF prev.end < nr THEN art := NewArtNr(nr); prev.next := art; art.next := cur END ELSE art := NewArtNr(nr); prev := art; group.readArtNrs := art; art.next := cur END; IF (prev # NIL) & ((prev.end+1) = cur.beg) THEN prev.end := cur.end; prev.next := cur.next END ELSIF prev # NIL THEN IF prev.end = (nr-1) THEN prev.end := nr 			ELSIF prev.end < nr THEN art := NewArtNr(nr); prev.next := art END ELSE art := NewArtNr(nr); group.readArtNrs := art END END AddArtNr; PROCEDURE GetGroup(name: ARRAY OF CHAR; new: BOOLEAN): Group; VAR group: Group; BEGIN group := groups; WHILE (group # NIL) & (group.name # name) DO 			group := group.next END; IF (group = NIL) & new THEN NEW(group); COPY(name, group.name); group.subscribed := FALSE; group.readArtNrs := NIL; group.next := groups; groups := group END; RETURN group END GetGroup; PROCEDURE ReadArt(group: Group; nr: SIGNED32): BOOLEAN; VAR article: ArtNrs; BEGIN article := group.readArtNrs; WHILE (article # NIL) & (article.beg <= nr) DO 			IF (nr >= article.beg) & (nr <= article.end) THEN RETURN TRUE END; article := article.next END; RETURN FALSE END ReadArt; PROCEDURE ReadResponse(S: Session); VAR i: SIGNED32; BEGIN NetSystem.ReadString(S.C, S.reply); IF trace THEN Texts.WriteString(W, "RCV: "); Texts.WriteString(W, S.reply); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END; Strings.StrToInt(S.reply, i); S.status := SHORT(i) END ReadResponse; (** Open a new session to nntp-host host on ort port. *) PROCEDURE Open*(VAR S: Session; host: ARRAY OF CHAR; port: SIGNED16); BEGIN NEW(S); IF NetTools.Connect(S.C, port, host, FALSE) THEN ReadResponse(S); IF S.status # 200 THEN NetTools.Disconnect(S.C); S.C := NIL; S.S := NIL ELSE S.S := NetTools.OpenStream(S.C); S.res := Done; RETURN END ELSE S.reply := "no connection" END; S.res := Failed END Open; PROCEDURE Open1*(VAR S: Session; host, user, passwd: ARRAY OF CHAR; port: SIGNED16); BEGIN IF trace THEN Texts.WriteString(W, "--- NNTP"); Texts.WriteLn(W); Texts.WriteString(W, "host = "); Texts.WriteString(W, host); Texts.WriteLn(W); Texts.WriteString(W, "user = "); Texts.WriteString(W, user); Texts.WriteLn(W); (* Texts.WriteString(W, "passwd = "); Texts.WriteString(W, passwd); Texts.WriteLn(W); *) Texts.Append(Oberon.Log, W.buf) END; NEW(S); S.res := NetTools.Failed; S.C := NIL; S.S := NIL; IF host[0] = 0X THEN S.reply := "no news-host specified" ELSE (* nntp-host name available *) IF ~NetTools.Connect(S.C, port, host, FALSE) THEN S.reply := "no connection"; S.res := Failed ELSE (* Connection established. *) S.S := NetTools.OpenStream(S.C); ReadResponse(S); IF S.status # 200 THEN (* Server declined to open stream. *) NetTools.Disconnect(S.C); S.C := NIL; S.S := NIL; S.res := Failed ELSE (* Stream opened. *) IF (user[0] = 0X) OR (passwd[0] = 0X) THEN IF trace THEN Texts.WriteString(W, "(user[0] = 0X) OR (passwd[0] = 0X)). Authentication not possible "); 							Texts.WriteString(W, "but server may proceed without authentication."); Texts.WriteLn(W); 							Texts.Append(Oberon.Log, W.buf) 						END 					ELSE(* Try to authenticate. *) 						Mail.SendCmd(S, "CAPABILITIES", ""); 						REPEAT ReadResponse(S) UNTIL S.reply[0] = "."; 						Mail.SendCmd(S, "AUTHINFO USER", user); 						ReadResponse(S); 						IF S.reply[0] = "3" THEN (* user received; passwd now required. *) 							Mail.SendCmd(S, "AUTHINFO PASS", passwd); 							ReadResponse(S); 							IF S.reply[0] = "2" THEN 								IF trace THEN 									Texts.WriteString(W, "Authentication accepted."); Texts.WriteLn(W); 									Texts.Append(Oberon.Log, W.buf); 								END 							ELSIF (S.reply[0] = "4") & (S.reply[2] = "2") THEN 								IF trace THEN 									Texts.WriteString(W, "Authentication failed/rejected."); Texts.WriteLn(W); 									Texts.Append(Oberon.Log, W.buf) 								END 							END 						END 					END; 					S.res := Done 				END 			END 		END 	END Open1; (** Close the connection for session S. *) 	PROCEDURE Close*(S: Session); 	BEGIN 		IF S.C # NIL THEN 			NetTools.Disconnect(S.C); S.C := NIL; S.S := NIL 		END 	END Close; 	PROCEDURE Connect(VAR S: Session): BOOLEAN; 		VAR 			NNTPHost, user, passwd: ARRAY 64 OF CHAR; 			NNTPPort: SIGNED16; 	BEGIN 		NetTools.GetHostPort("NNTP", NNTPHost, NNTPPort, DefPort); IF NNTPHost # "" THEN NetSystem.GetPassword("nntp", NNTPHost, user, passwd); Open1(S, NNTPHost, user, passwd, NNTPPort) ELSE NEW(S); S.C := NIL; S.reply := "NNTP-Host not set"; S.res := Failed END; RETURN S.res = Done END Connect; PROCEDURE RegisterNewsAdr(host, group: ARRAY OF CHAR): SIGNED32; VAR key: SIGNED32; BEGIN COPY("news:", line); Strings.Append(line, group); IF host # "" THEN Strings.AppendCh(line, "@"); Strings.Append(line, host) END; key := HyperDocs.RegisterLink(line); RETURN key END RegisterNewsAdr; PROCEDURE WriteGroup(VAR group: ARRAY OF CHAR); VAR i, key: SIGNED32; link: Objects.Object; BEGIN Texts.SetColor(W, SHORT(HyperDocs.linkC)); i := 0; WHILE (group[i] # 0X) & (group[i] > " ") DO 			Texts.Write(W, group[i]); INC(i) END; group[i] := 0X; key := RegisterNewsAdr("", group); link := HyperDocs.LinkControl(key); Texts.WriteObj(W, link); Texts.SetColor(W, SHORT(Display3.textC)); Texts.WriteLn(W) END WriteGroup; PROCEDURE SubGroups(T: Texts.Text); VAR group: Group; BEGIN group := groups; WHILE group # NIL DO 			IF group.subscribed THEN WriteGroup(group.name) END; group := group.next END; Texts.Append(T, W.buf) END SubGroups; (** Write al list of all available groups to T. *) PROCEDURE AllGroups*(S: Session; VAR T: Texts.Text); BEGIN NetSystem.WriteString(S.C, "LIST"); ReadResponse(S); IF S.status = 215 THEN NEW(T); Texts.Open(T, ""); NetSystem.ReadString(S.C, line); WHILE (line[0] # ".") OR (line[1] # 0X) DO 				Texts.WriteString(W, "news:"); Texts.WriteString(W, line); Texts.WriteLn(W); NetSystem.ReadString(S.C, line) END; Texts.Append(T, W.buf); S.res := Done ELSE T := NIL; S.res := ErrList END END AllGroups; (** List all new groups since the last access. *) PROCEDURE NewGroups*(S: Session; date, time: SIGNED32; VAR T: Texts.Text); BEGIN line := "NEWGROUPS "; ConcatDate(line, date); Strings.AppendCh(line, " "); ConcatTime(line, time); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 231 THEN NEW(T); Texts.Open(T, ""); NetSystem.ReadString(S.C, line); WHILE (line[0] # ".") OR (line[1] # 0X) DO 				Texts.WriteString(W, "news:"); Texts.WriteString(W, line); Texts.WriteLn(W); NetSystem.ReadString(S.C, line) END; Texts.Append(T, W.buf); S.res := Done ELSE T := NIL; S.res := ErrList END END NewGroups; PROCEDURE NewGrp(S: Session; VAR T: Texts.Text); VAR time, date: SIGNED32; BEGIN Oberon.GetClock(time, date); NewGroups(S, newgDate, newgTime, T); IF S.res = Done THEN newgDate := date; newgTime := time END END NewGrp; PROCEDURE HorzRule: Objects.Object; VAR obj: Objects.Object; BEGIN obj := Gadgets.CreateObject("BasicFigures.NewRect3D"); Attributes.SetBool(obj, "Filled", TRUE); Attributes.SetInt(obj, "Color", Display3.textbackC); Gadgets.ModifySize(obj(Display.Frame), Display.Width, 4); RETURN obj END HorzRule; PROCEDURE WriteGrpHead(group: ARRAY OF CHAR); BEGIN Texts.Write(Wr, 22X); Texts.WriteString(Wr, "news:"); Texts.WriteString(Wr, group); Texts.Write(Wr, 22X); Texts.WriteLn(Wr); Texts.WriteObj(Wr, HorzRule); Texts.WriteLn(Wr) END WriteGrpHead; PROCEDURE RegisterNNTPAdr(group: ARRAY OF CHAR; artnr: SIGNED32): SIGNED32; VAR line: ARRAY NetTools.MaxLine OF CHAR; str: ARRAY 12 OF CHAR; key: SIGNED32; BEGIN COPY("nntp:", line); Strings.Append(line, group); Strings.AppendCh(line, "/"); Strings.IntToStr(artnr, str); Strings.Append(line, str); key := HyperDocs.RegisterLink(line); RETURN key END RegisterNNTPAdr; PROCEDURE WriteArticle(nr: SIGNED32; VAR line: ARRAY OF CHAR); VAR link: Objects.Object; i, key: SIGNED32; BEGIN IF nr >= availBeg THEN IF ~ReadArt(curGrp, nr) THEN Texts.SetColor(Wr, SHORT(Display3.red)) ELSE Texts.SetColor(Wr, SHORT(HyperDocs.linkC)) END ELSE Texts.SetColor(Wr, SHORT(Display3.textC)) END; i := 0; WHILE line[i] # 0X DO 			Texts.Write(Wr, line[i]); IF (line[i] = Strings.Tab) & (Wr.col # Display3.textC) THEN key := RegisterNNTPAdr(curGrp.name, nr); link := HyperDocs.LinkControl(key); Texts.WriteObj(Wr, link); Texts.SetColor(Wr, SHORT(Display3.textC)) END; INC(i) END; Texts.WriteLn(Wr); Texts.SetColor(Wr, SHORT(Display3.textC)) END WriteArticle; PROCEDURE ListArts(T: Texts.Text); VAR R: Files.Rider; key, org: SIGNED32; BEGIN Files.Set(R, refs, 0); Files.ReadLInt(R, org); WHILE ~R.eof DO 			Files.ReadLInt(R, key); Files.Set(R, refs, org); Files.ReadString(R, line); WriteArticle(key, line); Texts.Insert(T, 0, Wr.buf); Files.ReadLInt(R, org) END END ListArts; PROCEDURE enumThread(key, org: SIGNED32; VAR cont: BOOLEAN); VAR R: Files.Rider; sorg, app, i, oldThread: SIGNED32; inthread: BOOLEAN; BEGIN inthread := FALSE; Files.Set(R, refs, org); Files.ReadLInt(R, sorg); Files.ReadLInt(R, app); Files.ReadLInt(R, app); WHILE (app >= 0) & ~inthread DO	(* for all references *) inthread := thread = app; Files.ReadLInt(R, app) END; IF inthread & ~marked[key-beg] THEN marked[key-beg] := TRUE; Files.Set(R, refs, sorg); Files.ReadString(R, line); FOR i := 1 TO level DO 				Texts.Write(Wr, Strings.Tab) END; WriteArticle(key, line); oldThread := thread; thread := org; INC(level); BTrees.EnumLInt(indexA, key+1, end, enumThread); thread := oldThread; DEC(level) END END enumThread; PROCEDURE Thread(T: Texts.Text); VAR R: Files.Rider; a, org, sorg, porg: SIGNED32; re: SIGNED16; BEGIN NEW(marked, MaxMessages); FOR a := 0 TO MaxMessages-1 DO 			marked[a] := FALSE END; IF (end - beg) >= MaxMessages THEN beg := end - MaxMessages  + 1 END; NetTools.curLen := end-beg; FOR a := beg TO end DO	(* from oldest to newest *) BTrees.SearchLInt(indexA, a, org, re); IF re = BTrees.Done THEN Files.Set(R, refs, org); Files.ReadLInt(R, sorg); Files.ReadLInt(R, porg); Files.ReadLInt(R, porg); IF porg < 0 THEN	(* article has no references *) Files.Set(R, refs, sorg); Files.ReadString(R, line); WriteArticle(a, line); marked[a-beg] := TRUE; thread := org; level := 1; BTrees.EnumLInt(indexA, a+1, end, enumThread)	(* enum all newer articles *) ELSIF ~marked[a-beg] THEN (* article not yet marked *) Files.Set(R, refs, sorg); Files.ReadString(R, line); WriteArticle(a, line); marked[a-beg] := TRUE END; Texts.Insert(T, 0, Wr.buf) END END; marked := NIL END Thread; (** List all available articles in group in a certain range. 0-0 = all *) PROCEDURE ArticleRange(S: Session; group: ARRAY OF CHAR; VAR T: Texts.Text; thread: BOOLEAN; from, to: SIGNED32); VAR nr: SIGNED32; org, org2, org3, fixup: SIGNED32; str: ARRAY 16 OF CHAR; msgid: ARRAY 128 OF CHAR; dummy: ARRAY 256 OF CHAR; R: Files.Rider; i, j, iRef, bres: SIGNED16; BEGIN line := "GROUP "; Strings.Append(line, group); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 211 THEN NEW(T); Texts.Open(T, ""); i := 0; Strings.StrToIntPos(S.reply, beg, i); Strings.StrToIntPos(S.reply, beg, i); Strings.StrToIntPos(S.reply, beg, i); Strings.StrToIntPos(S.reply, end, i); Texts.WriteString(W, group); Texts.WriteString(W, " available: "); Texts.WriteInt(W, beg, 1); Texts.Write(W, "-");  Texts.WriteInt(W, end, 1); IF (from # 0) & (to = 0) THEN (* get 'from' newest articles *) beg := end - from + 1 ELSIF (from # 0) & (to # 0) THEN (* from-to articles *) beg := from; end := to 			END; (* be careful that your number range is smaller than MaxMessages *) IF (end - beg) >= MaxMessages THEN beg := end - MaxMessages  + 1 END; Texts.WriteString(W, ", get "); Texts.WriteInt(W, beg, 1); Texts.Write(W, "-"); Texts.WriteInt(W, end, 1); IF curGrpNewOnly THEN Texts.WriteString(W, " unread") END; Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); indexM := BTrees.NewStr(Files.New(""), 0, SHORT(2*(end-beg))); BTrees.Flush(indexM); indexA := BTrees.NewLInt(BTrees.Base(indexM), Files.Length(BTrees.Base(indexM)), SHORT(2*(end-beg))); NetTools.curLen := end-beg; availBeg := beg; refs := Files.New(""); Files.Set(R, refs, 0); line := "XOVER "; Strings.IntToStr(beg, str); Strings.Append(line, str); Strings.AppendCh(line, "-"); Strings.IntToStr(end, str); Strings.Append(line, str); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 224 THEN curGrp := GetGroup(group, TRUE); NetSystem.ReadString(S.C, line); WHILE (line[0] # ".") OR (line[1] # 0X) DO	(* parse "message" line *) Strings.StrToInt(line, nr); IF ~curGrpNewOnly OR ~ReadArt(curGrp, nr) THEN i := 0; j := 0; WHILE (line[i] # 0X) & (j < 4) DO 							IF line[i] = Strings.Tab THEN INC(j) END; INC(i) END; line[i-1] := 0X; j := 0; WHILE (line[i] > " ") & (line[i] # ">") DO 							msgid[j] := line[i]; INC(j); INC(i) END; IF line[i] = ">" THEN msgid[j] := line[i]; INC(j); INC(i) END; msgid[j] := 0X; Strings.Upper(msgid, msgid); WHILE (line[i] # 0X) & (line[i] # "<") DO 							INC(i) END; org := Files.Pos(R); BTrees.InsertStr(indexM, msgid, org, bres);	(* add msgid to msgs index *) BTrees.InsertLInt(indexA, nr, org, bres); Files.WriteLInt(R, -1);	(* offset of title line *) Files.WriteLInt(R, nr);	(* the article nr. for article msgid *) iRef := i; fixup := 0; WHILE line[i] = "<" DO 							j := 0; WHILE (line[i] > " ") & (line[i] # ">") DO 								msgid[j] := line[i]; INC(j); INC(i) END; IF line[i] = ">" THEN msgid[j] := line[i]; INC(j); INC(i) END; msgid[j] := 0X; Strings.Upper(msgid, msgid); BTrees.SearchStr(indexM, msgid, org2, bres);	(* lookup the msgid referenced *) IF bres = BTrees.Done THEN Files.WriteLInt(R, org2)	(* add it to the references list *) ELSE	(* referenced article no longer available *) Files.WriteLInt(R, -2); INC(fixup) END; WHILE (line[i] # 0X) & (line[i] # "<") DO 								INC(i) END END; Files.WriteLInt(R, -1);	(* end of reference list *) org2 := Files.Pos(R); Files.Set(R, refs, org);	(* fixup for title line *) Files.WriteLInt(R, org2); Files.Set(R, refs, org2);	(* write the title line *) Files.WriteString(R, line); IF thread & (fixup > 0) THEN Files.Set(R, refs, org); Files.ReadLInt(R, org); Files.ReadLInt(R, org); i := iRef; WHILE line[i] = "<" DO 								j := 0; WHILE (line[i] > " ") & (line[i] # ">") DO 									msgid[j] := line[i]; INC(j); INC(i) END; IF line[i] = ">" THEN msgid[j] := line[i]; INC(j); INC(i) END; msgid[j] := 0X; Strings.Upper(msgid, msgid); Files.ReadLInt(R, org); IF org = -2 THEN org2 := Files.Length(refs); DEC(beg); BTrees.InsertStr(indexM, msgid, org2, bres); BTrees.InsertLInt(indexA, beg, org2, bres); org := Files.Pos(R)-4; Files.Set(R, refs, org2); Files.WriteLInt(R, -1);	(* offset of title line *) Files.WriteLInt(R, beg);	(* the article nr. for article msgid *) Files.WriteLInt(R, -1);	(* end of reference list *) org3 := Files.Pos(R); Strings.IntToStr(beg, dummy); Strings.AppendCh(dummy, Strings.Tab); Strings.Append(dummy, "Was: "); Strings.Append(dummy, msgid); Files.WriteString(R, dummy);	(* write the title line *) Files.Set(R, refs, org2); Files.WriteLInt(R, org3);	(* fixup for title line *) Files.Set(R, refs, org); Files.WriteLInt(R, org2); DEC(fixup) END; WHILE (line[i] # 0X) & (line[i] # "<") DO 									INC(i) END END; org := Files.Length(refs); Files.Set(R, refs, org) END END; NetSystem.ReadString(S.C, line) END; S.res := Done ELSE S.res := ErrXOver END ELSE S.res := ErrGroup END; IF S.res = Done THEN IF thread THEN Thread(T) ELSE ListArts(T) END; Texts.Append(T, Wr.buf); WriteGrpHead(group); Texts.Insert(T, 0, Wr.buf) END; curGrp := NIL; refs := NIL; indexM := NIL; indexA := NIL END ArticleRange; (** List all available articles in group. *) PROCEDURE Articles*(S: Session; group: ARRAY OF CHAR; VAR T: Texts.Text; thread: BOOLEAN); BEGIN ArticleRange(S, group, T, thread, 0, 0) END Articles; PROCEDURE ReadString(VAR R: Texts.Reader; VAR s: ARRAY OF CHAR); VAR l, i: SIZE; ch: CHAR; BEGIN l := LEN(s)-1; i := 0; Texts.Read(R, ch); WHILE ~R.eot & (ch # Strings.CR) & (i < l) DO 			IF R.lib IS Fonts.Font THEN s[i] := ch; INC(i) END; Texts.Read(R, ch) END; s[i] := 0X END ReadString; PROCEDURE ReadArticle(S: Session; VAR T: Texts.Text); VAR h: MIME.Header; cont: MIME.Content; out: Streams.Stream; val: ARRAY 256 OF CHAR; pos: SIGNED32; mT: Texts.Text; i: SIGNED16; BEGIN out := TextStreams.OpenWriter(T); MIME.ReadHeader(S.S, out, h, pos); out.Flush(out); Mail.ParseContent(h, cont); pos := MIME.FindField(h, "Xref"); IF pos > 0 THEN MIME.ExtractValue(h, pos, line); i := 0; pos := 0; WHILE line[pos] # 0X DO 				IF line[pos] <= " " THEN i := 0; INC(pos) ELSIF line[pos] = ":" THEN val[i] := 0X; INC(pos); i := SHORT(pos); Strings.StrToIntPos(line, pos, i); AddArtNr(GetGroup(val, TRUE), pos); pos := i 				ELSE val[i] := line[pos]; INC(i); INC(pos) END END END; Texts.Append(T, W.buf); (*Texts.WriteLn(W);*) cont.len := MAX(SIGNED32); IF cont.typ.typ # "multipart" THEN MIME.ReadText(S.S, W, cont, TRUE) ELSE Texts.Append(T, W.buf); MIME.ReadMultipartText(S.S, mT, cont, TRUE); Texts.Save(mT, 0, mT.len, W.buf) END; Texts.Append(T, W.buf); IF (cont.typ.typ = "application") & (cont.encoding IN {MIME.EncAsciiCoder, MIME.EncAsciiCoderC, MIME.EncAsciiCoderCPlain}) THEN Mail.DecodeMessage(T, h, cont, -1); ELSIF NetTools.QueryString("NewsFont", val) & (Fonts.This(val) # NIL) THEN newsFont := Fonts.This(val); Texts.ChangeLooks(T, 0, T.len, {0}, newsFont, 0, 0) END END ReadArticle; (** Retrieve article with number artnr in group. *) PROCEDURE ArticleByNr*(S: Session; group: ARRAY OF CHAR; artnr: SIGNED32; VAR T: Texts.Text); VAR str: ARRAY 12 OF CHAR; BEGIN line := "GROUP "; Strings.Append(line, group); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 211 THEN NEW(T); Texts.Open(T, ""); line := "STAT "; Strings.IntToStr(artnr, str); Strings.Append(line, str); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 223 THEN line := "ARTICLE"; NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 220 THEN AddArtNr(GetGroup(group, TRUE), artnr); ReadArticle(S, T); S.res := Done ELSE S.res := ErrArticle END ELSE S.res := ErrStat END ELSE S.res := ErrGroup END END ArticleByNr; (** Retrieve the article with the message-id msgid. *) PROCEDURE ArticleByMsgId*(S: Session; msgid: ARRAY OF CHAR; VAR T: Texts.Text); BEGIN line := "ARTICLE <"; Strings.Append(line, msgid); Strings.AppendCh(line, ">"); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 220 THEN NEW(T); Texts.Open(T, ""); ReadArticle(S, T); S.res := Done ELSE S.res := ErrArticle END END ArticleByMsgId; PROCEDURE ReadGroupName(VAR name: ARRAY OF CHAR); VAR R: Texts.Reader; beg, end, time: SIGNED32; text: Texts.Text; ch: CHAR; BEGIN COPY("", name); Texts.OpenReader(R, Oberon.Par.text, Oberon.Par.pos); Texts.Read(R, ch); WHILE ~R.eot & (ch <= " ") DO 			Texts.Read(R, ch) END; IF ~R.eot & (ch = "^") THEN time := -1; text := NIL; Oberon.GetSelection(text, beg, end, time); IF (text # NIL) & (time >= 0) THEN Texts.OpenReader(R, text, beg); Texts.Read(R, ch); WHILE ~R.eot & (ch <= " ") DO 					Texts.Read(R, ch) END ELSE RETURN END END; IF ch = 22X THEN Texts.Read(R, ch) END; beg := 0; WHILE ~R.eot & (ch > " ") & (ch # 22X) DO 			name[beg] := ch; INC(beg); IF ch = ":" THEN beg := 0 END; Texts.Read(R, ch) END; name[beg] := 0X END ReadGroupName; (** News.SubGroup ^ 		Subscribe a group (selection). *) PROCEDURE SubGroup*; VAR name: ARRAY 128 OF CHAR; group: Group; BEGIN ReadGroupName(name); IF name # "" THEN group := GetGroup(name, TRUE); group.subscribed := TRUE; Texts.WriteString(W, name); Texts.WriteString(W, " subcribed"); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END END SubGroup; (** News.UnsubGroup ^ 		Unsubscribe a group (selection). *) PROCEDURE UnsubGroup*; VAR name: ARRAY 128 OF CHAR; group: Group; BEGIN ReadGroupName(name); IF name # "" THEN Texts.WriteString(W, name); group := GetGroup(name, FALSE); IF group # NIL THEN group.subscribed := FALSE; Texts.WriteString(W, " unsubcribed") ELSE Texts.WriteString(W, " not found") END; Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END END UnsubGroup; PROCEDURE catchUp(S: Session; group: Group); VAR end: SIGNED32; art: ArtNrs; i: SIGNED16; BEGIN line := "GROUP "; Strings.Append(line, group.name); NetSystem.WriteString(S.C, line); ReadResponse(S); IF S.status = 211 THEN i := 0; Strings.StrToIntPos(S.reply, end, i); Strings.StrToIntPos(S.reply, end, i); Strings.StrToIntPos(S.reply, end, i); Strings.StrToIntPos(S.reply, end, i) 		ELSE Texts.WriteString(W, S.reply);Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); art := group.readArtNrs; WHILE art # NIL DO 				IF art.end > end THEN end := art.end END; art := art.next END END; NEW(art); art.beg := 0; art.end := end; art.next := NIL; group.readArtNrs := art END catchUp; (** News.CatchUp ^ 		Mark all articles in a group (selection) as read. *) PROCEDURE CatchUp*; VAR name: ARRAY 128 OF CHAR; group: Group; S: Session; BEGIN ReadGroupName(name); IF name # "" THEN group := GetGroup(name, TRUE); IF Connect(S) THEN catchUp(S, group) END; IF (S # NIL) & (S.res # Done) THEN Texts.WriteString(W, S.reply); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END; Close(S) END END CatchUp; (** News.CatchUpAll 		Mark all articles in all subscribed groups. *) PROCEDURE CatchUpAll*; VAR group: Group; S: Session; BEGIN IF Connect(S) THEN group := groups; WHILE group # NIL DO 				IF group.subscribed THEN catchUp(S, group) END; group := group.next END END; IF (S # NIL) & (S.res # Done) THEN Texts.WriteString(W, S.reply); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END; Close(S) END CatchUpAll; PROCEDURE SplitNewsAdr(VAR url, host, groupart: ARRAY OF CHAR): SIGNED32; VAR key: SIGNED32; i, j, l: SIZE; iskey: BOOLEAN; PROCEDURE Blanks; BEGIN WHILE (url[i] # 0X) & (url[i] <= " ") DO 				INC(i) END END Blanks; BEGIN HyperDocs.UnESC(url); i := 0; Blanks; (* skip news *) WHILE (url[i] # 0X) & (url[i] # ":") DO 			INC(i) END; (* skip : *) WHILE (url[i] # 0X) & (url[i] = ":") DO 			INC(i) END; Blanks; (* get groupart *) iskey := TRUE; l := LEN(groupart); j := 0; WHILE (url[i] # 0X) & (url[i] # "@") DO 			IF (url[i] > " ") & ~Strings.IsDigit(url[i]) THEN iskey := FALSE END; IF j < l THEN groupart[j] := url[i]; INC(j) END; INC(i) END; groupart[j] := 0X; DEC(j); WHILE (j >= 0) & (groupart[j] <= " ") DO 			groupart[j] := 0X; DEC(j) END; IF (url[i] = 0X) & iskey THEN IF groupart # "" THEN Strings.StrToInt(groupart, key); HyperDocs.RetrieveLink(key, line); key := SplitNewsAdr(line, host, groupart); RETURN key ELSE RETURN HyperDocs.UndefKey END ELSIF url[i] = "@" THEN INC(i); l := LEN(host); j := 0; WHILE url[i] # 0X DO 				IF j < l THEN host[j] := url[i]; INC(j) END; INC(i) END; host[j] := 0X; DEC(j); WHILE (j >= 0) & (host[j] <= " ") DO 				host[j] := 0X; DEC(j) END ELSE COPY("", host) END; key := RegisterNewsAdr(host, groupart); RETURN key END SplitNewsAdr; PROCEDURE SplitNNTPAdr(VAR url, group: ARRAY OF CHAR; VAR artnr: SIGNED32): SIGNED32; VAR i, j, l: SIZE; key: SIGNED32; iskey: BOOLEAN; str: ARRAY 12 OF CHAR; PROCEDURE Blanks; BEGIN WHILE (url[i] # 0X) & (url[i] <= " ") DO 				INC(i) END END Blanks; BEGIN HyperDocs.UnESC(url); i := 0; Blanks; (* skip nntp *) WHILE (url[i] # 0X) & (url[i] # ":") DO 			INC(i) END; (* skip : *) WHILE (url[i] # 0X) & (url[i] = ":") DO 			INC(i) END; Blanks; (* get group *) iskey := TRUE; l := LEN(group); j := 0; WHILE (url[i] # 0X) & (url[i] # "/") DO 			IF (url[i] > " ") & ~Strings.IsDigit(url[i]) THEN iskey := FALSE END; IF j < l THEN group[j] := url[i]; INC(j) END; INC(i) END; group[j] := 0X; DEC(j); WHILE (j >= 0) & (group[j] <= " ") DO 			group[j] := 0X; DEC(j) END; IF (url[i] = 0X) & iskey THEN IF group # "" THEN Strings.StrToInt(group, key); HyperDocs.RetrieveLink(key, line); key := SplitNNTPAdr(line, group, artnr); RETURN key ELSE RETURN -1 END ELSIF url[i] = "/" THEN INC(i); l := 12; j := 0; WHILE url[i] # 0X DO 				IF j < l THEN str[j] := url[i]; INC(j) END; INC(i) END; str[j] := 0X; Strings.StrToInt(str, artnr) ELSE artnr := 0 END; key := RegisterNNTPAdr(group, artnr); RETURN key END SplitNNTPAdr; PROCEDURE DocHandler(D: Objects.Object; VAR M: Objects.ObjMsg); BEGIN WITH D: Documents.Document DO 			TextDocs.DocHandler(D, M) 		END END DocHandler; (* Find the line containing pos. *) PROCEDURE FindBeg(T: Texts.Text; VAR pos: SIGNED32); VAR R: Texts.Reader; ch: CHAR; BEGIN Texts.OpenReader(R, T, pos); Texts.Read(R, ch); WHILE (pos > 0) & ((ch # Strings.CR) OR ~(R.lib IS Fonts.Font)) DO 			DEC(pos); Texts.OpenReader(R, T, pos); Texts.Read(R, ch) END; IF ch = Strings.CR THEN INC(pos) END END FindBeg; PROCEDURE LoadDoc(D: Documents.Document); VAR host: ARRAY NetTools.ServerStrLen OF CHAR; group, msgid: ARRAY NetTools.PathStrLen OF CHAR; T: Texts.Text; pos, artnr, artnr1: SIGNED32; date, time: SIGNED32; S: Session; obj, t: Objects.Object; F: Texts.Finder; article: BOOLEAN; sPos: SIGNED16; BEGIN S := NIL; article := FALSE; D.dsc := NIL; IF (D.name = "") OR (D.name = "subgroups") THEN TextDocs.InitDoc(D); NEW(T); Texts.Open(T, ""); SubGroups(T); IF T.len = 0 THEN Texts.WriteString(W, "No subscribed groups"); Texts.WriteLn(W); Texts.Append(T, W.buf) END; COPY("Subscribed Groups", D.name) ELSIF D.name = "newgroups" THEN IF Connect(S) THEN date := newgDate; time := newgTime; TextDocs.InitDoc(D); NEW(T); Texts.Open(T, ""); NewGrp(S, T); IF T # NIL THEN IF T.len = 0 THEN Texts.WriteString(W, "No new groups since ") ELSE Texts.WriteString(W, "New groups since ") END; Texts.WriteDate(W, time, date); Texts.WriteLn(W); Texts.WriteLn(W); Texts.Insert(T, 0, W.buf) END; COPY("New Groups", D.name); Close(S) END ELSIF D.name = "news:" THEN IF Connect(S) THEN TextDocs.InitDoc(D); COPY("All Groups", D.name); AllGroups(S, T); Close(S) END ELSIF Strings.CAPPrefix("news:", D.name) THEN IF SplitNewsAdr(D.name, host, group) # HyperDocs.UndefKey THEN IF Connect(S) THEN TextDocs.InitDoc(D); curGrpNewOnly := FALSE; IF group = "" THEN COPY("All Groups", D.name); AllGroups(S, T) 					ELSIF host = "" THEN COPY(group, D.name); Articles(S, group, T, NetTools.QueryBool("NewsThreading")) ELSE (* news:<group>@<number[-<number>][\n] *) sPos := 0; Strings.StrToIntPos(host, artnr, sPos); IF artnr # 0 THEN (* a number was found *) IF host[sPos] = "-" THEN (* a range *) INC(sPos); Strings.StrToIntPos(host, artnr1, sPos) (* get articles #artnr to #artnr1 *) ELSE artnr1 := 0 (* get the artnr newest articles *) END; curGrpNewOnly := (host[sPos] = "\" ) & (host[sPos+1] = "n" );  (* look for option \n *) ArticleRange(S, group, T, NetTools.QueryBool("NewsThreading"), artnr, artnr1) ELSE (* a real host *) COPY(group, msgid); Strings.AppendCh(msgid, "@"); Strings.Append(msgid, host); COPY(msgid, D.name); ArticleByMsgId(S, msgid, T); article := TRUE END END; Close(S) END END ELSIF Strings.CAPPrefix("nntp:", D.name) THEN IF SplitNNTPAdr(D.name, group, artnr) # HyperDocs.UndefKey THEN IF Connect(S) THEN TextDocs.InitDoc(D); ArticleByNr(S, group, artnr, T); COPY(group, D.name); Strings.AppendCh(D.name, "."); Strings.IntToStr(artnr, msgid); Strings.Append(D.name, msgid); article := TRUE; IF (S.res = Done) & (Gadgets.executorObj # NIL) & (Gadgets.executorObj IS TextGadgets.Control) THEN Links.GetLink(Gadgets.context, "Model", t); IF (t # NIL) & (t IS Texts.Text) THEN Texts.OpenFinder(F, t(Texts.Text), 0); pos := F.pos; Texts.FindObj(F, obj); WHILE ~F.eot DO 								IF obj = Gadgets.executorObj THEN artnr := pos; FindBeg(t(Texts.Text), artnr); Texts.ChangeLooks(t(Texts.Text), artnr, pos-1, {1}, NIL, SHORT(HyperDocs.linkC), 0) END; pos := F.pos; Texts.FindObj(F, obj) END END END; Close(S) END END ELSE HALT(99) END; IF (S # NIL) & (S.res # Done) THEN D.dsc := NIL; Texts.WriteString(W, S.reply); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) ELSE Links.SetLink(D.dsc, "Model", T); D.W := HyperDocs.docW; D.H := HyperDocs.docH; IF ~article THEN D.handle := DocHandler END END; IF HyperDocs.context # NIL THEN HyperDocs.context.replace := FALSE; HyperDocs.context.history := FALSE END END LoadDoc; PROCEDURE NewDoc*; VAR D: Documents.Document; BEGIN NEW(D); D.Load := LoadDoc; D.Store := NIL; D.handle := NIL; Objects.NewObj := D 	END NewDoc; (** News.ShowAllGroups 		Show all newsgroups. *) PROCEDURE ShowAllGroups*; VAR doc: Documents.Document; BEGIN NewDoc; doc := Objects.NewObj(Documents.Document); doc.name := "news:"; doc.Load(doc); IF (doc # NIL) & (doc.dsc # NIL) THEN Desktops.ShowDoc(doc) END END ShowAllGroups; (** News.ShowNewGroups 		Show new groups since last access. *) PROCEDURE ShowNewGroups*; VAR doc: Documents.Document; BEGIN NewDoc; doc := Objects.NewObj(Documents.Document); doc.name := "newgroups"; doc.Load(doc); IF (doc # NIL) & (doc.dsc # NIL) THEN Desktops.ShowDoc(doc) END END ShowNewGroups; (** News.SubscribedGroups 		List subscribed groups. *) PROCEDURE SubscribedGroups*; VAR doc: Documents.Document; BEGIN NewDoc; doc := Objects.NewObj(Documents.Document); doc.name := "subgroups"; doc.Load(doc); IF (doc # NIL) & (doc.dsc # NIL) THEN Desktops.ShowDoc(doc) END END SubscribedGroups; PROCEDURE NewsSchemeHandler(L: Objects.Object; VAR M: Objects.ObjMsg); VAR host: ARRAY NetTools.ServerStrLen OF CHAR; group: ARRAY NetTools.PathStrLen OF CHAR; BEGIN WITH L: HyperDocs.LinkScheme DO 			IF M IS HyperDocs.RegisterLinkMsg THEN WITH M: HyperDocs.RegisterLinkMsg DO 					M.key := SplitNewsAdr(M.link, host, group); IF M.key # HyperDocs.UndefKey THEN M.res := 0 END END ELSIF M IS Objects.AttrMsg THEN WITH M: Objects.AttrMsg DO 					IF (M.id = Objects.get) & (M.name = "Gen") THEN M.class := Objects.String; M.s := "News.NewNewsLinkScheme"; M.res := 0 ELSE HyperDocs.LinkSchemeHandler(L, M) 					END END ELSE HyperDocs.LinkSchemeHandler(L, M) 			END END END NewsSchemeHandler; PROCEDURE NewNewsLinkScheme*; VAR L: HyperDocs.LinkScheme; BEGIN NEW(L); L.handle := NewsSchemeHandler; L.usePath := FALSE; Objects.NewObj := L 	END NewNewsLinkScheme; PROCEDURE NNTPSchemeHandler(L: Objects.Object; VAR M: Objects.ObjMsg); VAR group: ARRAY NetTools.PathStrLen OF CHAR; artnr: SIGNED32; BEGIN WITH L: HyperDocs.LinkScheme DO 			IF M IS HyperDocs.RegisterLinkMsg THEN WITH M: HyperDocs.RegisterLinkMsg DO 					M.key := SplitNNTPAdr(M.link, group, artnr); IF M.key # HyperDocs.UndefKey THEN M.res := 0 END END ELSIF M IS Objects.AttrMsg THEN WITH M: Objects.AttrMsg DO 					IF (M.id = Objects.get) & (M.name = "Gen") THEN M.class := Objects.String; M.s := "News.NewNNTPLinkScheme"; M.res := 0 ELSE HyperDocs.LinkSchemeHandler(L, M) 					END END ELSE HyperDocs.LinkSchemeHandler(L, M) 			END END END NNTPSchemeHandler; PROCEDURE NewNNTPLinkScheme*; VAR L: HyperDocs.LinkScheme; BEGIN NEW(L); L.handle := NNTPSchemeHandler; L.usePath := FALSE; Objects.NewObj := L 	END NewNNTPLinkScheme; PROCEDURE SendArticle*(S: Session; T: Texts.Text; cont: MIME.Content); VAR s: Streams.Stream; h: MIME.Header; head: Texts.Text; R: Texts.Reader; end: SIGNED32; ch: CHAR; BEGIN NetSystem.WriteString(S.C, "POST"); ReadResponse(S); IF S.status = 340 THEN s := TextStreams.OpenReader(T, 0); MIME.ReadHeader(s, NIL, h, end); NEW(head); Texts.Open(head, ""); Texts.OpenReader(R, T, end); Texts.Read(R, ch); IF (ch = Strings.CR) OR (ch = Strings.LF) THEN WHILE (end > 0) & ((ch = Strings.CR) OR (ch = Strings.LF)) DO 					DEC(end); Texts.OpenReader(R, T, end); Texts.Read(R, ch) END; INC(end); IF end > T.len THEN end := T.len END END; Texts.Save(T, 0, end, W.buf); Texts.Append(head, W.buf); Texts.OpenReader(R, T, end); Texts.Read(R, ch); WHILE (ch = Strings.CR) OR (ch = Strings.LF) DO 				Texts.Read(R, ch); INC(end) END; Mail.GetSetting("EMail", S.from, FALSE); Mail.SendText(S, head, T, end-1, T.len, cont); ReadResponse(S); IF S.status = 240 THEN S.res := Done; Mail.SendReplyLine(S, cont) ELSE S.res := ErrPost END ELSE S.res := ErrPost END END SendArticle; (** News.Send [mime] * 		Send article (the marked text), mime: 			ascii : text/plain, us-ascii 			iso : text/plain, iso 8bit 			oberon : text/plain with application/compressed/oberondoc attachment 			<no mime> : 				- Simple Text without different colors or fonts 					no Umlaut -> ascii 					Umlaut -> iso 				- Text without objects, but with different colors or fonts -> oberon 				- Text with objects -> ooberon *) PROCEDURE Send*; VAR T, sig: Texts.Text; cont: MIME.Content; Sc: Attributes.Scanner; S: Session; val: ARRAY 64 OF CHAR; BEGIN T := Oberon.MarkedText; IF T # NIL THEN NEW(cont); cont.typ := MIME.GetContentType("text/plain"); Attributes.OpenScanner(Sc, Oberon.Par.text, Oberon.Par.pos); Sc.s := ""; Attributes.Scan(Sc); IF CAP(Sc.s[0]) = "O" THEN cont.typ := MIME.GetContentType(MIME.OberonMime); cont.encoding := MIME.EncAsciiCoderC ELSIF CAP(Sc.s[0]) = "A" THEN cont.encoding := MIME.EncBin ELSIF CAP(Sc.s[0]) = "I" THEN cont.encoding := MIME.Enc8Bit ELSE Mail.QueryContType(T, 0, cont) END; Mail.GetSetting("NewsSignature", val, FALSE); IF val # "" THEN NEW(sig); Texts.Open(sig, val); IF sig.len > 0 THEN Texts.Save(T, 0, T.len, W.buf); NEW(T); Texts.Open(T, ""); Texts.WriteLn(W); Texts.Append(T, W.buf); Texts.Save(sig, 0, sig.len, W.buf); Texts.Append(T, W.buf) END END; Texts.WriteString(W, "sending "); Texts.Append(Oberon.Log, W.buf); IF Connect(S) THEN SendArticle(S, T, cont) END; Texts.WriteString(W, S.reply); Close(S); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END END Send; (** News.Reply (selection) 	Compose a minimal followup article for the selected article. *) PROCEDURE Reply*; VAR T, text: Texts.Text; S: Attributes.Scanner; time, beg, end: SIGNED32; par, msgid, from: ARRAY 256 OF CHAR; R: Texts.Reader; lib: Objects.Library; grp, sub, frm: BOOLEAN; BEGIN lib := W.lib; Texts.SetFont(W, newsFont); grp := FALSE; sub := FALSE; frm := FALSE; Mail.GetSetting("EMail", EMail, FALSE); Attributes.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); IF (S.class = Texts.Char) & (S.c = "^") THEN text := NIL; time := -1; Oberon.GetSelection(text, beg, end, time); IF time < 0 THEN text := NIL END ELSE text := Oberon.MarkedText; beg := 0 END; from := "nobody"; msgid := "<>"; IF text # NIL THEN Texts.OpenReader(R, text, beg); ReadString(R, line); WHILE ~R.eot & (line # "") DO 				IF Strings.CAPPrefix("Message-ID:", line) THEN Strings.GetPar(line, msgid); Texts.WriteString(W, "References: "); Texts.WriteString(W, msgid); Texts.WriteLn(W) ELSIF Strings.CAPPrefix("Subject:", line) THEN sub := TRUE; Strings.GetPar(line, par); Texts.WriteString(W, "Subject: "); Mail.Re(W, par); Texts.WriteLn(W) ELSIF Strings.CAPPrefix("Newsgroups:", line) THEN grp := TRUE; frm := TRUE; Texts.WriteString(W, line); Texts.WriteLn(W); Strings.GetPar(line, par); Texts.WriteString(W, "Followup-To: "); Texts.WriteString(W, par); Texts.WriteLn(W) ELSIF Strings.CAPPrefix("From:", line) THEN Strings.GetPar(line, from) END; ReadString(R, line) END END; NEW(T); Texts.Open(T, ""); Texts.Append(T, W.buf); IF ~grp THEN Texts.WriteString(W, "Newsgroups: "); Texts.WriteLn(W); Texts.Insert(T, 0, W.buf) END; IF ~frm THEN Texts.WriteString(W, "From: "); Texts.WriteString(W, EMail); Texts.WriteLn(W) END; IF ~sub THEN Texts.WriteString(W, "Subject: "); Texts.WriteLn(W) END; Texts.WriteLn(W); Texts.WriteString(W, "In article "); Texts.WriteString(W, msgid); Texts.WriteString(W, ", "); Texts.WriteString(W, from); Texts.WriteString(W, " wrote: "); Texts.WriteLn(W); IF text # NIL THEN Texts.WriteLn(W); Mail.CiteText(W, text, Texts.Pos(R), text.len) END; Texts.WriteLn(W); Texts.Append(T, W.buf); Texts.SetFont(W, lib); TextDocs.ShowText("Article.Text", T, HyperDocs.docW, HyperDocs.docH) END Reply; BEGIN trace := NetTools.QueryBool("TraceNews"); Texts.OpenWriter(W); Texts.OpenWriter(Wr); LoadInitText; Modules.InstallTermHandler(storeInitText) END News. News.Read.Text News.StoreInitText System.Free News ~

title: Oberon/A2/Oberon.News.Mod


text:
User:EP426/sandbox

"Everything has been figured out, except how to live." ~ Jean-Paul Sartre

"Fear makes liars of us all." ~ Carmen Maria Machado, In the Dream House

Introduction
Humans in the modern world have grown to become smarter, a mindset that is constantly adapting to modern technology and new experiences. However, with the change of time, humans have also learned and developed ways on improving social relations and self-image, as the need for public approval and pride have become evident in recent times, such as the use of Instagram and the rising popularity of content creators. Young people, who are still learning what is their “truth”, may find it amusing to strive for that struggle of endless validation, however, what not many realize is the implications it can do on a person’s mental condition and morals. To not only let others validate for you, but also eventually become a slave to the pride that fears what the governing eyes of others may see and reveal.

Self-delusion has, and will always be, an unconscious psychological behavior that people in their daily lives have resorted to. To delude your true self, creating a lie that allows a person to switch their “image,” is an act more common than you think, and it does not mean it’s generally bad. While we are lying to ourselves, it does enable us to protect our vulnerable ego and our conscience from the pain of reality, boosting our ability to perform as self-delusion transforms into confidence. Not only that, but by convincing ourselves of that lie, it becomes easier to convince others of that lie, as now it is seen trustworthy as any other belief.

However, there are cases when self-delusion reveals itself to be self-deception, a lie that was made with the sole intent of improving social status, stemming from the exaggeration of over-confidence and insecurity. Cases where self-delusion becomes toxic towards the authenticity of oneself, distancing and mudding the lines between genuineness and “putting up an act”, aiming towards desire and grandeur. Instances like these are what we can see in the news, such as the case of Elizabeth Holmes. Through her strong self-belief of having the potential to become a successful entrepreneur, she was able to do so, eventually declared the youngest self-made billionaire in 2015. Be that as it may, the public did not realize the fraud she committed just to achieve that until 2018, the lies in her product that was undetected due to the strong persuasion she had in attracting investors sourcing from being self-delusional. She even continued to exhibit this type of behavior during her trial when trying to justify her products, refusing to admit the lie when evidence points out otherwise. To read more about the behavior of self-delusion, visit this BBC article or The Verge article on the studies of self-delusion, or watch this TedTalk by Courtney Warren about the psychology of self-deception.

Texts
In accordance with self-delusion, there are a couple of literary works that display such that which will be discussed:

“Dream House as Choose Your Own Adventure” is a chapter in Carmen Maria Machado’s latest memoir In The Dream House. The analysis made about this chapter is based on an audio version of the story dramatized by Zoë Winters on the podcast This American Life episode 703: Stuck! during Act Two: You Can’t Go Your Own Way.

“No Exit” is a 1944 French play produced by Jean-Paul Sartre, originally titled Huis Clos. This analysis is based on the transcript of the play provided by the Internet Archive and the 1964 cinematic BBC adaptation of the play.

Summaries
In the Dream House is a memoir of Machado's abusive relationship with an ex-girlfriend. Over the course of the memoir, Machado meets her girlfriend and finds herself rapidly infatuated, wooed, love bombed, and then, eventually, the abuse begins. The memoir includes chapters that are iterations of the abusive recount in different forms of storytelling. One of which is titled “Dream House as Choose Your Own Adventure”, where the story is told from the perspective of the main character, Machado, with the reader determining the choices taken in the Dream House, thus affecting the “outcome” of the story. However, as any toxic relationship goes, it proves to be a fruitless endeavor as the abuse repeats itself day after day. The reader either ends up restarting the day or meets an ending accompanied by harsh commentary by Machado herself about the course of actions taken.

“No Exit” is an existentialist play centered around three damned souls sent to a “hellish space”, condemned to be stuck together for the rest of eternity. They are Garcin, a revolutionary who betrayed his own cause and wants to be reassured that he is not a coward; Estelle, an egomaniac who killed her illegitimate child and craves the objectivity of attention; and Inez, a sadistic lesbian that takes joy in torturing others. Each of the characters requires another person for self-definition and their means of salvation, yet each is most attracted to the person most likely to refuse and torment them. Their inability to escape from each other guarantees their eternal torture, thus having “no exit” from their never-ending need for self-definition and rejection of the past.

Key Terms
Before diving deep into analyzing both texts, there are a few terms that need to be emphasized and further analyzed to fully understand the stories:

The Dream House
From my perspective, a house can be two things. One is as a safe haven, the embodiment of our own secure, personal space from everything else, basically "the comfort of our own home". On the other hand, two, as a prison of our own making that becomes more torturous the longer we stay holed up in there. During the pandemic, for instance, when people were forced to stay at home for quite a while, people started out strong and happy to stay in the comfort of their homes. However, people became increasingly tired of always being at home and were actually relieved to finally be free after the pandemic ended.

Of course, a Dream House would mean that it's someplace not real, or intangible. Or, it could also mean a literal “dream house”, a home where you would dream of having all your favorite things and making happy memories there. But after listening to the transcript, I would say that she’s metaphorizing this Dream House as a construct in her mind, conjuring the abuse that polluted the memory of the Dream House. Looking back and questioning the what-ifs while now being able to see it from the bigger picture of how her Dream House slowly shifted from a warm place to cold torture. Really, it’s ironic that she calls it a Dream House, as it now lingers as a hellhole. She could never claim it as her dream home, as it did not provide the love and security she needed.

The Fawn
The narrator compares, or rather contrasts herself to a fawn, reminding herself of the position she’s in in the Dream House after trying to defy the actual course of actions. As we know it, a fawn is a vulnerable and fragile creature, a young deer that usually shies towards people and other foreign beings it might encounter. It understands its capability and weakness, so it’s extremely cautious of any potential predators it might detect and puts an effort into trying to protect itself, usually by fleeing from danger. Machado depicted in the story, however, while being fragile and vulnerable, still decided to stay in the toxic relationship, justifying it as something that can be fixed even though signs that she was hurting were clearly visible (see page 12). The narrator describes the fawn to help Machado realize this, but somehow, it is shown to be as if mocking her past self for being foolish.

The Box, The Clothes, The Dishes
She started off by describing the setting when she awakened, stating despite how messy it was, she felt that warmth of innocence and glow of contentment in the room, up until she realized the existence of her partner there. Thus, voiding the light and warmth that was once in the room and leaving the room left with the disheveled mess it was originally with. It clearly shows how messy their relationship was, with the Dream House being left to a mess and how there were no signs of ever cleaning it up, with the only time she does not acknowledge the presence of her partner being when the gloomy mess “disappears”. This could be referencing to her time during the relationship, how the only time she could enjoy her Dream House was when her partner wasn’t in the picture, when she could be happy and forget the mess they made. Her partner only became a parasite to the Dream House, bringing harm and disorder into the relationship.

Mirrors
It is usually used to see yourself physically or meant as a window to see one’s soul introspectively. Sometimes even used as a tool to reaffirm your own existence and essence, to fix and confirm your appearance on how others view you. Mirrors reveal a person's truth, which is their appearance, but ironically it is sometimes referenced as needed by characters to reflect what they "want" to see or hope for their lie to be the truth. A symbol of pride in self-image and arrogance. And of course, most of the time it does not go accordingly. Say, for instance, think of how the Evil Queen in Snow White asked the mirror "Who's the fairest of them all?” with confidence that she herself is, but instead shows the image of Snow White being the fairest. Then she goes on to mess with Snow White, which we all know did not end well for the Queen. They are restricted from ever having any means of defining themselves and are constantly conscious of that lack of definition, leading up to them resorting to needing each other to be their “mirror.”

A mirror reflects our gaze back at ourselves, giving us reassurance of our existence and our "true" definition, as it is an object that shows the undeniable truth, or at least, the truth that we want to see. Now, what happens if we were to be deprived of mirrors or any tool to reflect on ourselves? Then it would narrow down our options to relying on other people's gazes to affirm our true selves. It would be fine if it were an accumulation of many different people's views, but how about limiting it to two? Now that would simplify the affirmation of your "definition" to something cruder and more untrustworthy. Almost like if you see a paper uses a lot of sources, then you can say it is reliable. But if it just uses two, then its credibility becomes questionable. The problem is, a person's gaze can never be too reliable, as they too are human, something that can show our worth subjectively and objectively. Different from a mirror that can easily be manipulated or repurposed to define us just as what we want it to be, people bring in the judgment and the opinions of defining a person, revealing the "hard truth" or the "fabricated lie" that can easily torment the individual. Just like when Estelle decided to use Inez as her mirror, with Inez lying about Estelle having a pimple on her face, which she easily believed. Each character wants a mirror not only to reassure their existence and reflect their believed "definition", but because they know it will only show what they want to see or their interpretation of their truth, making it a means of escape from the "real truth" that the gaze of each other reveals.

Freedom
The definition of freedom in the text is a bit twisted. For one, they all tried to live in freedom, free from the obligations of their crimes, free from the guilt of their past, and free from the consequences of existence. They were even provided freedom in Hell when the door to their room suddenly opened after Garcin’s whines for escape. However, there is a difference between true freedom and the freedom we are comfortable with. The freedom we know of means to be free from obstacles that restrict our actions, to have the power to do, speak, and act the way we want, at least under the rules of law and order determined by a higher power, or essentially by others. True freedom, however, is a more reckless nature, where you are granted total liberty. To live life with no rules to define consequences, no one to dictate our actions, and no one to judge us except for us. But in return, we ourselves must become the regulator for our actions. Our whole life is our own, and the responsibility and obligation for our actions fall solely on us, with no one else to carry that burden, for with true freedom comes independence. And that is what the characters of “No Exit” want but can never get because of what they would have to sacrifice to obtain that. They would need to leave behind their attachment for validation and acknowledge their past to be able to achieve their desires without consequence. Basically, they would need to get rid of their need for others to dictate their existence and stop trying to reject their past, something that they are evidently not willing to let go of anytime soon as they decide to stay stuck in the room together to continue fighting for each other’s validation.

Huis Clos
As being the original, untranslated title of the play, Huis Clos roughly translates to “with closed doors”, or “behind closed doors.” This could be referencing literally to the overall setting of the story, as their torture is never-ending and their arguing is to be “behind the closed doors” of Hell for eternity, as their room was designed to be “life without a break” from the use of specific bad décor to the lack of use for the items in the room. Or, it could be the closed-off mindset of each character, the secrets and true nature they withheld throughout life. As we know each character (except for Inez) has an issue with their past, they succumb to this constant need for approval just to uphold the “closed doors” that separate their past from their delusions of self. The closed doors could also mean the separation between their self and reality, as they all fear the suffocating reality of freedom and the consequences of true independence when they were given the chance to escape. The closed doors are their only way to maintain their integrity and chance for salvation, nevertheless, it eventually proves to be their punishment. Which side of reality really is behind closed doors, the choice of true freedom or their choice of eternal confinement?

Machado Between the “I’s” and “You’s”
In the chapter, Machado already starts it off by saying “you” in the second person perspective, immediately emphasizing the distance she has against her “self” in the recount. This also establishes the control over “you” or her younger self that the reader has, as this will be important in its choose-your-own-adventure format. The reader would go on to explore the variety of actions the “you” character can choose and the resulting abuse that their partner would respond with, told with occasional monologues, such as on page 191 during the making love scene that drifts off for a while, as if these were scenarios Machado had known too much and too well. The cycle would then continue, only for it to restart the day and reuse the same choices for the next. However, by breaking the cycle, or in this case, the reader finally chooses to arrive at a page that was never given, we start to realize who is actually in control of the story, as page 186 reveals the inner dialogue of the narrator criticizing towards the “you” of the Dream House. We see this dissonance happening between the present “I” that is introspectively viewing the endless suffering of the past “you” still stuck in the Dream House. With “I” being the narrator and present self of Machado, and “you” being the naïve younger version of Machado who lives in her memory of the Dream House. The same “you” that the reader tries to project its liberty of choice onto, especially in this section by choosing to defy against their partner, only to be scolded by the present Machado as something she would “never do.”

Later on, specifically on pages 190 and 186, we see more of this defiance, where an argument breaks out because of “you” trying to stray from the cycle of pages once more. Still, they, or rather the reader, are reminded by the narrator of how unchanging this memory is, how in reality their choices don’t amount to anything in a story that remains as a lingering regret of a foolish young Machado, saying that “[they] can’t make it not happen, no matter what [they] do.” Escape was only a red herring in this story. As a figment of her imagination, “you” is frequently depicted as a separate entity of Machado’s bound to the events of the Dream House, being the subject of criticism and portrayal of regrets that the present Machado continues to disassociate. Despite being just a different version of herself, Machado still rejects that past self and even displays her present self throughout the chapter as being a higher-power entity than the Machado in the Dream House, isolating the pain only to happen to her depiction of a younger self and never claiming to be the once foolish girl she was.

Prison of Her Own Making
It’s evident throughout the story that Machado imprisons herself in guilt, in the trauma that gives life to the Dream House. It matters that the abuse happens in the house as it sets the boundary of those memories, those feelings that she associates with the abuse that happened in that house, limiting to just her and her partner. No one else is able to interfere with those memories and the decisions she has already made, as the house is a barrier between one's "outside life" and one's "personal life", blocking people from looking in on what's happening inside. It also restricts her freedom of choice in contrast to the choose-your-own-adventure concept. There is essentially no "choosing" in this story, as she's only limited to making decisions that are provided by the house. It's reflected in how in this never-ending game, she was never given the option to leave the house. It only happened when the author made it up, "pretending" that's what they did during that time. The events of the Dream House are already set in stone, unchanging as it had already passed on but persisted.

Since the beginning, we also see the real Machado as a dominating person, being the present that knows the outcome of the story and ostracizes her younger self for being naïve. Her self-deluding has made her the officer as well as the prisoner. Instead of being the once foolish girl that was abused, she has taken on the mantle of abuse even if it meant for the peace of her current mental well-being after the relationship. As the weakest of her self tries to navigate towards a resolution from the abusive relationship, the reader, Machado and the residual memories of her partner are who are keeping her bound, warping the storyline and her choices. For what the young Machado builds, it is eventually to crumble at the inevitable mercy and choice of others.

Delusion of Bad Faith
Similarly, “No Exit” deals with the character’s delusions of disassociating their true self and rejection of their past, specifically that of Garcin and Estelle. As each of the characters had lived a life of selfish desires, they are met the same fate to be tortured together and isolated in a hellish space. As the play proceeds, we start to notice what their “hell” really is about. Both Garcin and Estelle are victims of bad faith, meaning that they require the views of others to dictate their existence and deceive themselves about the weight of responsibilities that they are already committed to, needing others to justify their reasoning for their misdeeds and as a way to disassociate with their past crimes.

The play gradually reveals this, starting with Garcin constantly checking in with his coworkers in the real world to see what they thought of him and if they ever saw him as the coward he was. But because of his constant need to justify his past of cowardice, he later becomes increasingly desperate to defend his "pacifist" life as brave, when only Inez sees him for the coward he is, leaving him stuck in a loop for approval.

Estelle, however, is somewhat a worse case than Garcin, as she wants to exist solely free from the obligations of being a subject, using bad faith to give up her freedom and become an object in the eyes of others. She begins by needing a mirror to see herself exist as the object she wants others to see her as, only to eventually crave the constant gaze and sexual attraction of others to grant that objectification of hers, specifically Garcin as he is the only man she “wants” to affirm her existence as an object of love. Because of this blind pursuit of objectification and being free from the obligations of true freedom, she also slowly reveals her delusional nature and the sins she had done to maintain her previous life of leisure, as far as murdering her own illegitimate child just because she didn’t want them. Being heartless, she didn’t even care when the father of the child committed suicide, only claiming that he “killed himself on [her] account.” Through and through, she doesn’t care about her past actions, disassociating them as if they meant nothing to her and justifying them as for her own gains.

Inez’s Consequence of Authenticity
On the other hand, in Inez’s case, while she lived as a sadist, she still accepts her situation in hell, even acknowledging her misdeeds, saying that she’s "always conscious of [herself] – in [her] mind. Painfully conscious", in contrast to the other two that struggle to flee from the reality of their crimes. So really, Inez is the only individual that is truly “authentic” in this situation, but is still damned as a person tormented of their past existence and requires others to fuel that reason of deserving damnation, a consequence of embracing their past nature. How could you acknowledge being a sadist if you have no one to torture for it? It’s shown as Inez seeks Estelle’s “love,” but in actuality she just wants to toy and torture her. We see this instance happening when Estelle asks Inez to be her mirror, only for her to tell lies that twist Estelle’s image and toy with her bad faith. At the end of the day, they are all endlessly competing for their own definition of authenticity, struggling for peace of mind, and preoccupied with rejecting the consequences of their freedom, even when given escape. Garcin and Estelle have become a slave to desire and condemned to ever gaining closure to the past crimes they try to disassociate from, with Inez being an anchor for their bad faith. Thus, looping the cycle, making them bound to be isolated together for eternity. There is no escape.

Cycle of Constant Rejection & Disassociation
Disassociation of the past has led each character into a spiral of looping torment, each stuck in a cycle of not owning up to their own mistakes and trauma. Machado, while already free from the abusive relationship, is still not free from the trauma it caused, still gripping onto that memory of the Dream House that she fears of even setting foot in. In turn, it creates this distance between her naïve younger self that is forced to relive the events of the Dream House, and the present self that tries to criticize every mistake they do, refusing to admit ever being that naive self as shown through her use of “I’s” and “you’s” and her harsh commentary toward herself. The characters of “No Exit” as well disassociate from the crimes of their past, claiming that it was for the better, or in reality, for their own selfish pursuit of desires. As a result of this rejection of their life's obligations and consequences, it has led them to Hell, condemned to struggle to fulfill their desires for eternity, shackled by the one thing they once primarily desired in life. What’s more, both stories portray how each character would resort to deception to deceive themselves, which in turn has led them to spiral even deeper into further painful lies and desperation, only making the truth a little harder to swallow. Machado tries to deceive herself and tweak the actions she’d taken during her past relationship, along with Garcin and Estelle trying to deceive their way toward peace of mind.

Can I Ask You A Question?
To analyze the concept of self-delusion in these texts thus far, here are a few questions to reflect upon:

 * Who do you think is Machado’s past self trying to deceive?
 * In what role does the reader play in Machado’s story? As the embodiment of her self-delusions, a passive bystander, or as the narrator that forces the torment of choice on her past self? Or, is there any other role not listed that you might agree with?
 * Why do you think Machado hasn’t given up on the nightmare? Is it guilt, is it self-justification, is it a responsibility?

 * Why is Inez the only one who hadn’t succumbed to self-delusion and is always self-aware? Why does she ultimately “win” in this ordeal?
 * Compared to the other two, Estelle died in a natural matter of pneumonia, while Garcin and Inez died in certain situations due to rejecting the consequences of reality. What made Estelle’s self-delusion and rejection of the past different than the other two?
 * Was Garcin’s punishment for cowardice deserving, or is his reason of self-delusion justifiable? Try being in his position and explain why.

Image Imagine
Here’s an interesting group activity – together, try to pick out a few key words or element from each of the stories. Then, using an AI image generator, conjure up each your own depictions of these key elements, and present these images together. Have each group member discuss what prompt they used in the AI search description for their own images and discuss which image from the group closely resembles to their combined depiction of the key element.

For sources of a free, AI image generator, here are a few links:

 * Bing Creator
 * Stable Diffusion
 * Dall-E (requires account)
 * Midjourney (requires account and joined as a member of the Discord server)

* Example Prompt: Joseph Garcin as a tall, mid-30’s, in a suit and tie, balding, with mustache, realistic art.

Storyteller
Interested in Machado's storytelling concept of utilizing a choose-your-own-adventure format? Luckily, there is a free, online service in creating those type of stories! Inklewriter will enable you to write complex stories, branching decision-making, and overall an in-depth story of your own making, which you can even share to others to experience for themselves!

Here's an example of my own short interactive story using Inklewriter.

External Sources

 * 1) Chen, Angela. “A Psychologist Explains Why We’re Probably All Delusional and How to Fix It.” The Verge, 21 May 2017, www.theverge.com/2017/5/21/15660894/insight-self-awareness-psychology-tasha-eurich-interview.
 * 2) Glass, Ira. “Stuck! | Act Two: You Can’t Go Your Own Way.” This American Life, performance by Zoe Winters, season 1, episode 703, 8 May 2022, https://www.thisamericanlife.org/703/stuck/act-two-10.
 * 3) Iglesias, Gabino. “‘in the Dream House’ Invents a New Form of Memoir to Convey a Haunting Nightmare.” NPR, 5 Nov. 2019, www.npr.org/2019/11/05/776316011/in-the-dream-house-invents-a-new-form-of-memoir-to-convey-a-haunting-nightmare.
 * 4) “Jean-Paul Sartre’s ‘No Exit’: A BBC Adaptation Starring Harold Pinter (1964).” YouTube, 17 Jan. 2017, www.youtube.com/watch?v=0v96qw83tw4.
 * 5) “No Exit by Jean-Paul Sartre.” Internet Archive, ia800700.us.archive.org/11/items/NoExit/NoExit.pdf. Accessed 11 June 2023.
 * 6) “No Exit Study Guide.” Shmoop, 11 Nov. 2008, www.shmoop.com/study-guides/literature/no-exit.
 * 7) Robson, David. “How Self-Deception Allows People to Lie.” BBC Worklife, 31 May 2022, www.bbc.com/worklife/article/20220525-how-self-deception-allows-people-to-lie.

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: User:EP426/sandbox


text:
Cookbook:Naan (Yeasted)

Ingredients

 * 1 tsp dried active yeast
 * 1 tsp white granulated sugar
 * 200 g (7 oz) white bread flour
 * 1 pinch black onion (nigella) seeds
 * ¼ tsp salt
 * ½ tsp baking powder
 * 1 tbsp vegetable oil
 * 2 tbsp natural (plain) yoghurt
 * 2 tbsp milk

Procedure

 * 1) Preheat the oven to 140°C/275°F/Gas 1.
 * 2) In a small bowl, mix the yeast with 1 tablespoon of warm water. Stir in the sugar and leave it in a warm place for 5 minutes until the yeast is covered with froth. This will show that the yeast is ready to use.
 * 3) Mix together the flour, onion seeds, salt and baking powder. Stir in the oil, yoghurt and milk, then stir in the activated yeast mixture.
 * 4) To knead the dough, clench your hand into a fist, wet your knuckles with a little water, then press them repeatedly into the dough. Continue pressing and kneading until you have a soft, pliable dough. It should take about 10 minutes. Leave to rest for 10 minutes and then knead again for another 5 minutes.
 * 5) Place the dough in a mixing bowl, cover it with cling film and leave it in a warm place to rise for 20–30 minutes.
 * 6) Divide the dough into four balls and place on a floured surface or board. Roll each into a long oval shape about 0.5 cm (¼ inch) thick.
 * 7) Place them on a greased baking tray and put them in the centre of the oven for 10–15 minutes. They are ready when they have puffed up a little. Serve fresh from the oven.

Notes, tips, and variations

 * To add an extra crispy finish, pop the baked naans under a preheated grill for 30 seconds before brushing with butter and serving.
 * To add extra flavour, consider adding finely chopped garlic and coriander to the butter you brush over your cooked naan breads. Then return them to the oven (or place under a grill) for a short time to cook the garlic.

title: Cookbook:Naan (Yeasted)


text:
User talk:Marth996

Welcome, Marth996!

If you have any questions, you can ask in the assistance reading room or possibly contact me personally.

--Xania   talk 01:13, 16 June 2023 (UTC)

title: User talk:Marth996


text:
360 Assembly/Privileged Instructions

Privileged Instructions are programming instructions that need to be restrited to the operating system in order to protect system resources, system integrity, or system security. These include, but are not limited to:
 * I/O instructions. To make sure two programs do not try to write to a printer, or edit a database record, or other errors that could corrupt files, a program issues I/O requests to the operating system, and it handles these operations.
 * Load PSW. The PSW (program status word) con tains the status about the computer and the currently executing job. Without protecting the PSW, programs could
 * Grant themselves privileges
 * Allow themselves to reset their storage key, allowing them to change any memory
 * Rewrite, contaminate or destroy page tables, losing or corrupting other jobs
 * Change the system date and time
 * Halt the machine
 * Insert storage key, set storage key. Change or read any memory.
 * Page table functions. Contaminate other jobs, lose pages swapped out to disc, corrupt memory and/or other jobs.
 * Diagnose. Used by operating systems to issue requests to the hypervisor.

It's probably best to restrict privileged functions to the operating system than allow just anyone to use them willy-nilly.

title: 360 Assembly/Privileged Instructions


text:
Yoruba/Adjectives

Yoruba Adjectives are words that describe or modify another person or thing in the sentence. Here are some examples:

title: Yoruba/Adjectives


text:
User:Germany Poul Ah/sandbox

Volumen

Stellt man diese 3 an einer Ecke zusammentreffende Kanten als Vektoren $$\vec a, \vec b, \vec c$$ dar, so ergibt sich das Volumen des Parallelepipeds aus dem Betrag des Spatproduktes (gemischtes Skalarprodukt und Kreuzprodukt). Das Volumen $$V$$ ist das Produkt der Grundfläche $$G$$ (Parallelogramm) und der Höhe $$h$$ des Parallelepipeds. Mit $$G = |\vec a| \cdot |\vec b| \cdot \sin(\gamma) = |\vec a \times \vec b|$$, wobei $$\gamma$$ der Winkel zwischen $$\vec a$$ und $$\vec b$$ ist, und der Höhe $$h = |\vec c| \cdot |\cos(\theta)|$$, wobei $$\theta$$ der Winkel zwischen $$\vec c$$ und dem Normalenvektor auf der Grundfläche ist, ergibt sich
 * $$\begin{align}

V &= G \cdot h = (|\vec a| \cdot |\vec b| \cdot \sin(\gamma)) \cdot |\vec c| \cdot |\cos(\theta)| = |\vec a \times \vec b| \cdot |\vec c| \cdot |\cos(\theta)| \\ &= |(\vec{a} \times \vec{b}) \cdot \vec{c}| \end{align}$$

Das gemischte Produkt nennt man Spatprodukt. Es kann als Determinante geschrieben werden. Für $$\vec a = (a_1,a_2,a_3)^T, \quad \vec b = (b_1,b_2,b_3)^T, \quad \vec c = (c_1,c_2,c_3)^T $$ ist das Volumen dann:
 * $$V = \left| \det \begin{pmatrix}

a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3 \end{pmatrix}\; \right| $$

Eine nur von den geometrischen Eigenschaften (Kantenlängen, Winkel zwischen benachbarten Kanten) abhängige Formel für das Volumen ist:
 * $$V = a \cdot b \cdot c \cdot \sqrt{1 + 2 \cdot \cos(\alpha) \cdot \cos(\beta) \cdot \cos(\gamma) - \cos^2(\alpha) - \cos^2(\beta) - \cos^2(\gamma)}$$

Dabei sind $$\alpha = \angle(\vec b, \vec c), \quad \beta = \angle(\vec a, \vec c), \quad \gamma = \angle(\vec a, \vec b) $$ die Winkel zwischen den Kanten und $$a,b,c $$ die Kantenlängen.

Der Nachweis dieser Formel lässt sich mit den Eigenschaften einer Determinante und der geometrischen Deutung des Skalarprodukts führen. Es sei $$M$$ die 3x3-Matrix, deren Spaltenvektoren die Vektoren $$\vec a, \vec b,\vec c$$ sind. Dann gilt
 * $$ \begin{align}

V^2 &= (\det(M))^2 = \det(M) \cdot \det(M) = \det(M^T) \cdot \det(M) =\det (M^T \cdot M) \\ &= \det \begin{pmatrix} \vec a\cdot \vec a & \vec a\cdot \vec b & \vec a\cdot \vec c \\ \vec b\cdot \vec a & \vec b\cdot \vec b & \vec b\cdot \vec c \\ \vec c\cdot \vec a & \vec c\cdot \vec b & \vec c\cdot \vec c \end{pmatrix} = a^2 \cdot b^2 \cdot c^2 \cdot (1 + 2 \cdot \cos(\alpha) \cdot \cos(\beta) \cdot \cos(\gamma) - \cos^2(\alpha) - \cos^2(\beta) - \cos^2(\gamma)) \end{align}$$ Im letzten Schritt wurden die Gleichungen $$\vec a \cdot \vec a = a^2, \quad \vec b \cdot \vec b = b^2, \quad \vec c \cdot \vec c = c^2, \quad \vec a\cdot \vec b = a \cdot b \cdot \cos(\gamma), \quad \vec a \cdot \vec c = a \cdot c \cdot \cos(\beta), \quad \vec b \cdot \vec c = b \cdot c \cdot \cos(\alpha) $$ benutzt.

Oberfläche

Der Flächeninhalt der Oberfläche ergibt sich aus der Summe der Flächeninhalte der einzelnen Seitenflächen, den 6 Parallelogrammen:
 * $$\begin{align}

A &= 2 \cdot \left(|\vec a \times \vec b| + |\vec a \times \vec c| + |\vec b \times \vec c|\right) \\ &= 2 \cdot a \cdot b \cdot \sin(\gamma) + 2 \cdot a \cdot c \cdot \sin(\beta) + 2 \cdot b \cdot c \cdot \sin(\alpha) \end{align} $$.

Flächenwinkel
In der Ecke, in der die Vektoren $$\vec a, \vec b, \vec c$$ zusammentreffen, liegen die Innenwinkel $$\alpha = \angle(\vec b, \vec c), \quad \beta = \angle(\vec a, \vec c), \quad \gamma = \angle(\vec a, \vec b) $$. Diese Ecke bildet zusammen mit den 3 benachbarten Ecken ein Tetraeder. Betrachtet man die Umkugel dieses Tetraeders, dann gilt nach dem Kosinussatz für Kugeldreiecke die Gleichung
 * $$\cos(\alpha) = \cos(\beta) \cdot \cos(\gamma) + \sin(\beta) \cdot \sin(\gamma) \cdot \cos(\beta_a)$$

Dabei ist $$\beta_a$$ der Flächenwinkel zwischen den beiden Seitenflächen, die am Vektor $$\vec a$$ liegen.

Daraus folgt
 * $$ \beta_a = \arccos \left(\frac{\cos(\alpha) - \cos(\beta) \cdot \cos(\gamma)}{\sin(\beta) \cdot \sin(\gamma)}\right) $$

Die Flächenwinkel $$\beta_b$$ und $$\beta_c$$ ergeben sich entsprechend.

Raumwinkel
Der Raumwinkel in der Ecke eines Polyeders kann mit dem Satz von L'Huilier berechnet werden.

Für den Raumwinkel, der in der Ecke mit den Innenwinkeln $$\alpha = \angle(\vec b, \vec c), \quad \beta = \angle(\vec a, \vec c), \quad \gamma = \angle(\vec a, \vec b) $$ liegt, gilt
 * $$\begin{align}

\Omega_1 &= 4 \cdot \arctan\left(\sqrt{\tan\left(\frac{\theta_s}{2}\right) \cdot \tan\left(\frac{\theta_s - \theta_a}{2}\right) \cdot \tan\left( \frac{\theta_s - \theta_b}{2}\right) \cdot \tan\left(\frac{\theta_s - \theta_c}{2}\right)}\right) \\ &= 4 \cdot \arctan\left(\sqrt{\tan\left(\frac{\alpha + \beta + \gamma}{4}\right) \cdot \tan\left(\frac{-\alpha + \beta + \gamma}{4}\right) \cdot \tan\left(\frac{\alpha - \beta + \gamma}{4}\right) \cdot \tan\left(\frac{\alpha + \beta - \gamma}{4}\right)}\right) \end{align}$$ wobei $$\theta_s = \frac{\alpha + \beta + \gamma}{2}$$, $$\theta_a = \alpha$$, $$\theta_b = \beta$$ und $$\theta_c = \gamma$$ ist.

Zwei diagonal gegenüber liegende Raumwinkel in Ecken des Parallelepipeds sind jeweils gleich, weil die 3 anliegenden Innenwinkel gleich sind. Die anderen drei Raumwinkel ergeben sich für
 * $$\theta_a = \alpha, \quad \theta_b = 180^\circ - \beta, \quad \theta_c = 180^\circ - \gamma$$
 * $$\theta_a = 180^\circ - \alpha, \quad \theta_b = \beta, \quad \theta_c = 180^\circ - \gamma$$
 * $$\theta_a = 180^\circ - \alpha, \quad \theta_b = 180^\circ - \beta, \quad \theta_c = \gamma$$

title: User:Germany Poul Ah/sandbox


text:
User:DeyviAlvaradoLopez/sandbox

“We turn not older with years, but newer every day.”

Emily Dickinson, Letter to Frances and Louise Norcross, late 1872.

Biography
Emily Elizabeth Dickinson was born on December 10, 1830, in Amherst, Massachusetts, into a prominent family. Dickinson was an American lyric poet who lived in seclusion and is considered one of the leading 19th-century American poets known for her bold original verse, which stands out for its epigrammatic compression, haunting personal voice, and enigmatic brilliance. Dickinson spent virtually all her life, increasingly reclusive, in her family's home in Amherst, where she was considered eccentric by locals due to her penchant for white clothing, her disinterest in leaving her room, and her reluctance to greet guests. Emily Dickinson was a prolific writer as she wrote over 1,800 poems; however, only ten are known to be published during her lifetime. Even though Dickinson's passion for writing was not a secret, it was not until after her death that her work became public, most of her poems being significantly edited and purposely censored to follow the conventional poetic rules of the time. Dickinson never married and was suspected of having a romantic relationship with her sister-in-law "Susan," which is believed to be the inspiration for some of her poems. On May 15, 1886, at the age of 55, Emily Dickinson died of heart failure.

Introduction
We have progressed as a civilization so that now most people can be able to be themselves, express their ideas and points of view, and do any job imaginable. However, it is incredible to think that humanity took an exceptionally long time to get here. If we had a time machine and went back only 200 years, we could see how society was constructed uniquely with different rules. Men and women (especially women) had specific roles, behaviors, and tasks that were expected, but even though there were rules, there was also rebellion. Emily Dickinson, the 19th-century poet, was ahead of her time, constantly going against what was expected from her. She found a way of being free of these rules and did it not in a common approach. As Dickinson decided to do poetry, we can look through her poems and acknowledge the frustration she felt against the society of the time. In the poem “They Shut Me Up in Prose,” Emily Dickinson writes about the freedom she achieves from societal restrictions by secluding herself.

“The Shut Me Up in Prose” (1862)

They shut me up in Prose –

As when a little Girl

They put me in the Closet –

Because they liked me “still”  –

Still! Could themself have peeped –

And seen my Brain – go round –

They might as wise have lodged a Bird

For Treason – in the Pound –

Himself has but to will

And easy as a Star

Look down opon Captivity –

And laugh – No more have I –

Poem Analysis
When Dickinson started poetry, she found her voice and distinctive way of expressing her feelings about everything around her; however, the society of the time did not support female poets as the role expected of women was far from what Dickinson’s wanted it to be. At the time, women were expected only to occupy domestic affairs and be dependable on a husband without a legal or emotional existence of their own (Medhkour 9). According to the The Lady’s Token: or Gift of Friendship, published in 1848, “only with domestic affairs-wait till your husband confides to you those of a high importance-and do not give your advice until he asks for it.” In the first stanza of “They Shut Me Up in Prose,” we can acknowledge how the society of the 19th century is trying to control Dickinson’s will as she might be the speaker of the poem: They shut me up in Prose –

As when a little Girl

They put me in the Closet –

Because they liked me “still”   – In the first line of the first stanza, the speaker makes an emphasis how “They” are trying to lock her in prose, the prose being a boring, dull, and conventional ruling she is against, quite different from poetry, which in this poem is trying to be represented as a celebration of originality, freedom, and individuality. The second line starts with the speaker getting an epiphany from when she was “a little girl” and compares to her current situation. The third and fourth lines express how “They,” which is the authority, locks the speaker in the closet as a cruel punishment because she would not be “still.” This punishment explains how “They” are trying to confine her energy and freedom for not being well-behaved, alluding to Dickinson’s circumstances with society as she was not allowed to be a poet. Then, in the second and third stanza, the poem takes an interesting shift: Still! Could themself have peeped –

And seen my Brain – go round –

They might as wise have lodged a Bird

For Treason – in the Pound –

Himself has but to will

And easy as a Star

Look down opon Captivity –

And laugh – No more have I – The second stanza’s first line starts strong with “Still!” where the sarcasm can be immediately sensed. The speaker continues to explain how pointless trying to restrict her is, though she is being confined physically; her mind is always free and cannot be contained by walls (Walker 57). In the third and fourth lines of the second stanza, the speaker implies to how ludicrous “They” are; a bird obviously cannot be locked up for treason. “What makes it even more bizarre is the fact that birds sing melodious tunes. The metaphor for poet suggests that shutting up beautiful language makes just as much sense as imprisoning a bird for committing a crime against a king” (Medhkour 10). Finally, in the last stanza, the speaker continues with the bird example, expressing how easy it is to escape imprisonment. From the view the bird gets from above, it looks down at its would to be captors and laughs at them. The distinct perspective of the speaker, which is higher than “Theirs,” are the wings that are keeping her above and setting her free from the confinement being put on her. However, like the bird she had escaped it already.

The poem explores the themes of restriction and seclusion against an individual who does not believe or share the same beliefs as the surrounding community. Individuality is the ideology of being self-reliant and unique, making us different from one another as we will have different needs, rights, goals, and morals. Unfortunately, when individuality is taken away because of culture, religion, or in this case, society's expectations of all women behaving and acting in the same way, the sense of self is lost as the group (women) must act like one. As a result, different ideas or perspectives that go against the ideal beliefs of the community will be labeled as outrageous, atrocious, or even insane, and the person challenging the ideals will be separated from the group and labeled as demented. Emily Dickinson embraced the seclusion she was getting from society for being a woman trying to publish poetry and began to disappear from social life. This was the time in her life she was fully dedicated to her writing to the point Dickinson would only speak with visitors through a door instead of face-to-face. According to the essay Redefining Domesticity: Emily Dickinson and the Wife Persona, published in 2015:  "“At first glance, the way Dickinson shut herself up in her bedroom seemingly contradicts this poem’s message. She chose four walls over the usual concept of freedom. Nonetheless, this poem exemplifies Dickinson’s choice. The prison was outside of her room—her walls kept things out, not her in. Her room was where her mind could “go round” and be free of captivity, because that is where she wrote poetry. It is the place where “I” finds precedence over “They.” She chose to not publish traditionally because “They” would “shut [her] up in Prose” or force her to write poetry that was an “acceptable” subject for women or more regular in syntax, stanza, and rhyme as was the style of the time” (Medhkour 10)."In brief, the poem “They Shut Me Up in Prose” honors the liberty Emily Dickinson achieved from society. Even though Dickinson was lacking in contact, she was her true self; she explored her individuality and did what she liked the most, write poems. Society could not stop her from writing, as she wrote over 1,800 poems in her lifetime. Her mind and ideas were always free, not obeying the restrictive social conventions because it is laughably powerless compared to the power of one’s mind (Little, 2021). Emily Dickinson is the perfect example of a feminist poet revolutionary in a patriarchal society.

Glossary
Bird, n.
 * 1) Mortal being; transitory creature; [fig.] angel; spirit; essence of a dead loved one.
 * 2) Fowl; winged creature; warm-blooded vertebrate with feathers; member of the class Aves.
 * 3) Quick-moving creature; [fig.] feeling; emotion; sentiment; affection.
 * 4) Nestling; hatchling; chick; baby fowl; [fig.] child; offspring.
 * 5) Whistler; [fig.] informer; reporter; gossiper; messenger; secret-bearer; tattle-tale.
 * 6) Nesting creature; [metonymy] melody; song; tune; [fig.] happiness; hope; joy; good tidings.
 * 7) Far-flying creature; [fig.] explorer; navigator; sailor; mariner.
 * 8) Creature used in sacrifices and offerings; [fig.] Savior; Christ; (see Leviticus 12:8).
 * 9) Communicative creature; [fig.] thought; idea; intelligence.
 * 10) Singing creature; [metaphor] poet; minstrel; author of lyric verse.
 * 11) Phrase. “Patriarch's bird”: Noah's dove; the dove that Noah sent forth from the Ark to look for land after the flood (see Genesis 8:8-12).
 * 12) Phrase. “Blue Bird”
 * 13) Phrase. “Humming Bird”

Brain, n.

 * 1) Imagination; cognition; sensory perception; cognition; center of emotion.
 * 2) Cerebrum and cerebellum; master organ of the body; terminus of the central nervous system; soft viscus mass within the skull; center that enables various human functions, abilities, capacities, connections, and sensations.
 * 3) Memory; mind; remembrance; recollection; mental awareness.
 * 4) Intelligence; understanding; consciousness; center of thought; seat of the soul.
 * 5) Intellect; reason; logical capacity.
 * 6) Nucleus; core; kernel.

Captivity, n.

 * 1) Bondage; slavery; thralldom; imprisonment; servitude; subjection; state of being controlled; [fig.] embodiment; incarnation; mortality; (see Ephesians 4:8).

Closet, n.

 * 1) Chamber; cupboard; wine cabinet.
 * 2) Small room; storage place; [fig.] body; mind.
 * 3) Compartment; [fig.] area of the brain.

Laugh, v.

 * 1) Bubble; gurgle; chuckle; chortle; chirp; guffaw; giggle; make mirthful noises.
 * 2) Express joy; project gaiety; be cheerful, pleasant, or lively.
 * 3) Phrase. “laugh at”: mock; scorn; deride; ridicule; treat with some degree of contempt.

Lodge, v.

 * 1) Enclose; confine; detain; imprison; incarcerate.
 * 2) Place; plant; set to grow.
 * 3) House; host; board.
 * 4) Stay; rest; abide; find a place in.

Might, n.

Upon (opon), prep.
 * 1) Bodily strength; physical power.
 * 2) Strong force.
 * 3) Ability.
 * 4) Strength in mind and body.
 * 5) Supernatural power.
 * 6) Strength of affection.

 * 1) On; using; standing upward with.
 * 2) On; in contact with; at the point of.
 * 3) Affecting; opposing; up against; grating on.
 * 4) During.

Peep, v.

 * 1) Arise; awake; begin to appear; emerge from concealment.
 * 2) Watch carefully; observe secretly; look through a small opening.

Pound, n.

 * 1) Prison; jail; detention facility; holding place for impounded animals; enclosure for confinement of stray creatures.

Prose, n.

 * 1) Ordinary language; uninspired expression; unimaginative discourse; dull, commonplace words.

Star, n.

 * 1) Heavenly body; shining points of light in the night sky; [plural] Milky Way; stellar display.
 * 2) Celebrity; genius; great one; special person; selected individual.
 * 3) A general term for a point of light in a constellation.
 * 4) Wish; miracle; special phenomenon; beautiful thing; signal of hope; dream to come true.
 * 5) Small meteorite; shooting star.
 * 6) Lesser light; smaller celestial being; less prominent but nevertheless worthy of heaven.
 * 7) Sparkling entity; glittering orb.
 * 8) Reflection; glimmer.
 * 9) Lofty goal; unreachable object.
 * 10) Director; guide; heavenly map; divine guidance.
 * 11) Polar center; central point in the heavens around which other heavenly bodies move.
 * 12) The United States flag; the red, white, and blue emblem of the independent government in North America.
 * 13) Six-pointed symbol [*]; pointed punctuation mark in a text; [fig.] heavenly being; splendid multi-faceted person who has left mortality but leaves a hint of eternal life.
 * 14) Saint; righteous person; being of great renown.
 * 15) Bright orb; glowing point of light; distant object in the night sky.
 * 16) Phrase. “border star”: evening planet on faintly visible on the horizon at sunset; [metaphor] frontier newspaper in Missouri in the mid-1800's.
 * 17) Phrase. “Morning Stars”: pre-mortal choir; female singers who rejoiced when the Lord laid the earth's foundations; daughters of God who sang for joy when the world was created (see Job 38:4-7).
 * 18) Phrase. “the Morning Star”: Venus; the second planet from the sun in Earth's solar system; the star-like planet that appears in the east just before dawn; [fig.] the Lord; the resurrection of the dead (see Revelation 2:28, 22:16).
 * 19) Phrase. “Star of Bethleem/Bethlehem”: astrological phenomenon; extremely bright body of light that appeared in the sky at the birth of Jesus (see Matthew 2:1-10).
 * 20) Phrase. “the northern star”: polar center; Arctic view of the sky; compass point in the heavens around which other heavenly bodies move.

Still, v.

 * 1) Appease; assuage; placate; satiate; silence.
 * 2) Occupy; engage; busy; captivate; engross.
 * 3) Suspend; efface; disperse; dissolve; evanesce; cause to disappear; make to vanish.

Treason, n.

 * 1) Perfidy; act of betraying; attempt to overthrow the authority; subversion against one to whom allegiance is owed.
 * 2) Disloyalty; infidelity.
 * 3) Disclosure; revelation that betrays identity.
 * 4) Treachery; deception.

Wise, n.

 * 1) Seer; most intelligent person; one who usually possesses great discernment.

Activities
Let's write a poem! Just take a piece of paper and a pencil and start writing about a moment in your life, any! Just think about how you feel, where you were, what smelt like. It does not have to be perfect! After you have your first draft, let's shorten it and try to think of different words to express the same or deeper feelings. Instead of "love," you can use colors like "red," and instead of "passion," you can use objects like "fire." You can also use metaphors and compare emotions like "Love is like a rollercoaster" or "This passion is like a burning sun."

You can also go to Poem Generator and generate your own poem with your own specifications.

Further readings

 * “I’m nobody! Who are you?”
 * “I dwell in possibility”
 * “I heard a Fly buzz – when I died”
 * ““Hope” is the thing with feathers”

 * “I felt a funeral, in my Brain”
 * “The Soul selects her own Society”
 * “The Heart Asks Pleasure First”
 * “I died for Beauty – but was scarce”

title: User:DeyviAlvaradoLopez/sandbox


text:
User talk:TenWhile6

__NOINDEX__

helping to books Islam and math
Hello,@TenWhile6 I am the author of the book "Religion of Islam".

I need a partner to write my books so that we can work together to complete books such as supplementary mathematics, nuclear energy, Relegion of Islam and History of world. Can You cooperate with me and help me in some books?! Germany Poul Ah (discuss • contribs) 10:00, 16 June 2023 (UTC)

 * @Germany Poul Ah sorry, I am not a “real” Wikibooks-Contributor. I am only here to fight vandalism and maybe review minor typo corrections in the future. TenWhile6 (discuss • contribs) 10:03, 16 June 2023 (UTC)
 * Hi, no problem, I'm still looking for a contributing user. If my book is edited maliciously by anonymous users, can you reverse that edit? Germany Poul Ah (discuss • contribs) 10:10, 16 June 2023 (UTC)
 * @Germany Poul Ah Yes, that’s what I do here :) Reverting, Reverting, Reverting. TenWhile6 (discuss • contribs) 10:59, 16 June 2023 (UTC)
 * Well, thank you very much, I count on you for your work Germany Poul Ah (discuss • contribs) 11:37, 16 June 2023 (UTC)

title: User talk:TenWhile6