Commit 468a0bd2 authored by Carsten Eie Frigaard's avatar Carsten Eie Frigaard
Browse files

update

parent 18b449a8
PYCOURSE=mk_course.py PYCOURSE=mk_course.py
all: sync: build
cd .. && scp -r Html/*.html si:ITMAL_E21/Html
ssh si "cd ITMAL_E21 && git pull"
build:
$(PYCOURSE) -v -o ../Html/ $(PYCOURSE) -v -o ../Html/
edit: edit:
joe $(PYCOURSE) joe $(PYCOURSE)
sync:
cd .. && scp -r Html si:ITMAL_E21/
ssh si "cd ITMAL_E21 && git pull"
clean: clean:
@ rm -f out.html L??.html @ rm -f out.html ../Html/L??.html
#JSFILES = $(wildcard JS/*.js) #JSFILES = $(wildcard JS/*.js)
#PYFILE = $(wildcard Py/*.py) $(wildcard Py/Utils/*.py) #PYFILE = $(wildcard Py/*.py) $(wildcard Py/Utils/*.py)
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
from Utils.dbg import DiagStdErr, PrettyPrintTracebackDiagnostics from Utils.dbg import DiagStdErr, PrettyPrintTracebackDiagnostics
from sys import stdout, stderr from sys import stdout, stderr
def isStr(t, checknonempty=False): def isStr(t, checknonempty=True):
assert isinstance(t, str), f"exected string but got type='{type(t)}'" assert isinstance(t, str), f"exected string but got type='{type(t)}'"
#assert (not checknonempty) or (len(t)>0) assert (not checknonempty) or (len(t)>0), f"string is empty, and this was unexpected"
return t return t
def isBool(t): def isBool(t):
...@@ -36,7 +36,7 @@ def Check(expr, msg): ...@@ -36,7 +36,7 @@ def Check(expr, msg):
Err("EXPRESSION NOT FULLFILLED: " + msg) Err("EXPRESSION NOT FULLFILLED: " + msg)
def Trim(s): def Trim(s):
s = isStr(s).replace("\t"," ") s = isStr(s, False).replace("\t"," ")
s = s.strip() s = s.strip()
return s return s
......
COURSE COURSE
REFS
[HOMEHTML] https://itundervisning.ase.au.dk/ITMAL_E21/Html
[HOME] https://itundervisning.ase.au.dk/ITMAL_E21
[HOML] <span style='font-family: courier new, courier;'>[HOML]</span>
[GITMAL] <span style='font-family: courier new, courier;'>[GITMAL]</span>
[GITHOML] <span style='font-family: courier new, courier;'>[GITHOML]</span>
[JPYNB] <span style='font-family: courier new, courier;'>[JPYNB]</span>
[OPTIONAL] (OPTIONEL)
[KURSUSINFORMATION] <a href='https://brightspace.au.dk/d2l/le/lessons/27524/units/244588'>kursusinformation</a>
[KURSUSFORKORTELSER] <a href='https://brightspace.au.dk/d2l/le/lessons/27524/topics/254943' rel='noopener' target='_blank'>kursusinformation | kursusforkortelser</a>
[KURSUSINFOGPU] <a href='https://brightspace.au.dk/d2l/le/lessons/27524/topics/244596' rel='noopener' target='_blank'>kursusinformation | GPU Cluster</a>
[BR] <br>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
LESSON L00 LESSON L00
\h4{Forberedelse inden kursusstart} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\h5{Formål} \header{Forberedelse inden kursusstart}
\p{Gruppe tilmelding: tilmeld dig til en ITMAL gruppe (se Blackboard link \sub{Formål}
ovenfor).}
\p{Installation: de obligatoriske værktøjer til ITMAL inden kursusstart (dvs. \p{\i{Gruppe tilmelding:} tilmeld dig til en ITMAL gruppe (find link i Brightspace!).}
\p{\i{Installation}: de obligatoriske værktøjer til ITMAL inden kursusstart (dvs.
L01).} L01).}
\p{Forberedelse til L01: Hent GIT repositories til litteraturen [GITHOML], prøv at \p{\i{Forberedelse til L01:} Hent GIT repositories til litteraturen [GITHOML], prøv at
kører et par Jupyter Notebooks [JPYNB], og læs mere om pythons NumPy kører et par Jupyter Notebooks [JPYNB], og læs mere om pythons NumPy
bibliotek.} bibliotek.}
\p{Ekstra materiale til forberedelse: optionelle python opgaver, hvis du vil sætte \p{\i{Ekstra materiale til forberedelse:} optionelle python opgaver, hvis du vil sætte
dig mere ind i sproget.} dig mere ind i sproget.}
\h5{Installation} \sub{Installation}
\ul{ \ul{
\li{Installer Anaconda på din PC:} \li{Installer Anaconda på din PC:}
\ul{ \ul{
\li{\link{www.anaconda.com/products/individual,https://www.anaconda.com/products/individual}} \li{\linkex{www.anaconda.com/products/individual, https://www.anaconda.com/products/individual}}
\li{vælg 'Download' (downloader direkte for Windows),} \li{vælg 'Download' (downloader direkte for Windows),}
\li{eller vælg Linux eller Mac, 32 eller 64 bit (dit valg),} \li{eller vælg Linux eller Mac, 32 eller 64 bit (dit valg),}
\li{nværende nyeste Anaconda3 version er \bf{2021.05}} \li{nværende nyeste Anaconda3 version er \b{2021.05}}
} }
\ul{ \ul{
\li{ALTERNATIV 1:} \li{ALTERNATIV 1:}
\ul{ \ul{
\li{brug vores ASE GPU Cluster som jupyter hub server,} \li{brug vores ASE GPU Cluster som jupyter hub server,}
\li{se info in Kursusinfo | GPU Cluster.} \li{se info in [KURSUSINFOGPU].}
} }
\li{ALTERNATIV 2:} \li{ALTERNATIV 2:}
\ul{ \ul{
\li{Lav en konto på Google's Colaboratory,} \li{Lav en konto på Google's Colaboratory,}
\li{\link{colab.research.google.co, https://colab.research.google.com}} \li{\linkex{,https://colab.research.google.com}}
} }
} }
\li{Test at du kan køre jupyter notebooks [JYPYNB] fra [GITHOML], prøv f.eks.:} \li{Test at du kan køre jupyter notebooks [JYPYNB] fra [GITHOML], prøv f.eks. \ipynb{index.ipynb}}
\ul{
\li{index.ipynb}
}
} }
\h5{Forberedelse til Lektion 01} \sub{Forberedelse til Lektion 01}
\ul{ \ul{
\li{Læs kursusinfo via Blackboard-linket ovenfor. \li{Læs materiale i [KURSUSINFORMATION],}
\li{Få fat i litteratur til kurset. \li{få fat i litteratur til kurset,}
\li{Clone [GITHOML] til din egen PC, se how-to under kursusinfo | kursusforkortelser. \li{clone [GITHOML] til din egen PC, se how-to under [KURSUSFORKORTELSER].}
\li{Skim disse tutorials igennem:} \li{skim denne tutorial igennem:}
\ul{ \displaystyle{\em{§ Scientific Python tutorials:} NumPy, \ipynb{tools_numpy.ipynb}, [GITHOML]
\li{§ Scientific Python tutorials: NumPy}
\li{tools_numpy.ipynb [GITHOML]} [BR][BR]
Læs blot, hvad du finder relevant så som 'iteration', men spring blot over
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
'QR decomposition'.
}
} }
\p{Læs blot, hvad du finder relevant så som 'iteration', men spring blot over \sub{Note vdr. kildekritik og 'informations-overload'}
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
'QR decomposition'. Note vdr. kildekritik og 'informations-overload'}
\p{Vi vil i dette kurset tit kunne blive overvældet af for meget ekstern \p{Vi vil i dette kurset tit kunne blive overvældet af for meget ekstern
information (informations-overload), så du skal danne dig en metode til at information (informations-overload), så du skal danne dig en metode til at
...@@ -68,41 +89,49 @@ kunne selektere og navigere i materialet.} ...@@ -68,41 +89,49 @@ kunne selektere og navigere i materialet.}
\p{Vi vil primært holde os til [HOML], [GITHOML] og Scikit-learn, med en note \p{Vi vil primært holde os til [HOML], [GITHOML] og Scikit-learn, med en note
om, at nettet flyder over med ekstra (til tider ubrugelig/ufiltreret) om, at nettet flyder over med ekstra (til tider ubrugelig/ufiltreret)
information: en kildekritiks holdning er vigtig! Ekstra materiale til information: en kildekritiks holdning er vigtig!}
forberedelse}
\sub{Ekstra materiale til forberedelse}
Hvis du har brug for at opfriske dit lineær algebra matematik eller er helt ny \p{Hvis du har brug for at opfriske dit lineær algebra matematik eller er helt ny
til python, så kan du f.eks. læse/skimme følgende notebooks, i prioriteret til python, så kan du f.eks. læse/skimme følgende notebooks, i prioriteret
rækkefølge: rækkefølge:}
[OPTIONAL] Python og vectors/matrices math: math_linear_algebra.ipynb [GITHOML] \ol{
[OPTIONAL] Python og grafisk plotting: tools_matplotlib.ipynb [GITHOML] \li{[OPTIONAL] python og vectors/matrices math: [BR] \indent{\ipynb{math_linear_algebra.ipynb} [GITHOML],}}
[OPTIONAL] Ekstra, Python og dataværktøjet 'Pandas' : tools_pandas.ipynb [GITHOML] \li{[OPTIONAL] python og grafisk plotting: [BR] \indent{\ipynb{tools_matplotlib.ipynb} [GITHOML],}}
[OPTIONAL] Ekstra, mest for de matematik intereserede: math_differential_calculus.ipynb [GITHOML] \li{[OPTIONAL] ekstra, Python og dataværktøjet 'Pandas': [BR] \indent{\ipynb{tools_pandas.ipynb} [GITHOML],}}
\li{[OPTIONAL] ekstra, mest for de matematik intereserede: [BR] \indent{\ipynb{math_differential_calculus.ipynb} [GITHOML].}}
}
\p{Pandas er et meget populært databehandlingsværktøj, men vi kommer ikke til at \p{Pandas er et meget populært databehandlingsværktøj, men vi kommer ikke til at
bruge Pandas i dette kursus.} bruge Pandas i dette kursus.}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
LESSON L01 LESSON L01
\h1{Introduktion} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\header{Introduktion}
\h2{Formål} \sub{Formål}
Denne lektion har til formål at give indledende information om kurset. Dvs. Denne lektion har til formål at give indledende information om kurset. Dvs.
at vi præsentere de formelle rammer vdr. at vi præsentere de formelle rammer vdr.
\ul{ \ul{
\li{ITMAL gruppetilmelding,} \li{ITMAL gruppetilmelding,}
\li{opgavesæt og journalafleveringer,} \li{opgavesæt og journalafleveringer,}
\li{eksamensform,} \li{eksamensform,}
\li{Blackboard opbygning og fildeling.} \li{Blackboard opbygning og fildeling.}
} }
\p{Herefter vil vi præsentere machine learning [ML] som koncept overordnet, og \p{Herefter vil vi præsentere machine learning [ML] som koncept overordnet, og
kort ridse lektionsplanen for kurset op.} kort ridse lektionsplanen for kurset op.}
\p{Software til brug for kurset introduceres og skal installeres på jeres PC'er, \p{Software til brug for kurset introduceres og skal installeres på jeres PC'er,
se 'L00: Forberedelse' for en installationsguide. Vi anvender python se 'L00: Forberedelse' for en installationsguide. Vi anvender python
distributionen anaconda og i henter og installere den sidste nye version. På distributionen anaconda og i henter og installere den sidste nye version. På
...@@ -117,59 +146,60 @@ samt forsøge os med et par små programmer i python.} ...@@ -117,59 +146,60 @@ samt forsøge os med et par små programmer i python.}
klassebegreber (modules, classes), så vi kan genbruge kode i senere klassebegreber (modules, classes), så vi kan genbruge kode i senere
lektioner..} lektioner..}
\h2{Indhold} \sub{Indhold}
\ul{ \ul{
\li{Formelle rammer vdr. kurset.} \li{Formelle rammer vdr. kurset.}
\li{Eksamensform, godkendelsesfag via:} \li{Eksamensform, godkendelsesfag via:}
\ul{ \ul{
\li{et sæt obligatoriske skriftlige gruppe-journaler med afleveringsdeadlines,} \li{et sæt obligatoriske skriftlige gruppe-journaler med afleveringsdeadlines,}
\li{en poster-session, med aflevering af poster og mundtlig præsentation af poster,} \li{en poster-session, med aflevering af poster og mundtlig præsentation af poster,}
\li{en mundtlig gennemgang af den sidste journal med alle medlemmer i ITMAL gruppen, samt evaluering af hver gruppemedlems bidrag.} \li{en mundtlig gennemgang af den sidste journal med alle medlemmer i ITMAL gruppen, samt evaluering af hver gruppemedlems
\li{=> Endelig godkendelse af kurset sker på en samlet vurdering af de tre punkter ovenfor.} bidrag.}
\displaystyle{\b{\style{color: #ff3333, => Endelig godkendelse af kurset sker på en samlet vurdering af de tre punkter ovenfor.}}}
} }
\li{Læringsmål.} \li{Læringsmål.}
\li{Litteratur.} \li{Litteratur.}
\li{Intro til software, der bruges i ITMAL:} \li{Intro til software, der bruges i ITMAL:}
\ul{ \ul{
\li{python generelt (link til mini python intro: demo.ipynb Click for more options)} \li{python generelt (link til mini python intro: \link{,[HOME]/L01/demo.ipynb},}
\li{anaconda python distribution:} \li{anaconda python distribution:}
\ul{ \ul{
\li{jupyter notebooks,} \li{jupyter notebooks,}
\li{spyder developer environment.} \li{spyder developer environment.}
} }
\li{Scikit-learn,} \li{Scikit-learn,}
\li{opgave med python modul og klasser.} \li{opgave med python modul og klasser.}
} }
\li{Intro til machine learning:} \li{Intro til machine learning:}
\ul{ \ul{
\li{Supervised learning (regression): 'life-satisfactory' [HOML].} \li{Supervised learning (regression): 'life-satisfactory' [HOML].}
} }
} }
\h2{Litteratur} \sub{Litteratur}
\px{§ Preface, p. xv [HOML] (eksklusiv fra Using Code Examples...og resten af intro kapitlet)}
\px{§ 1 The machine Learning Landscape [HOML]} \displaystyle{§ Preface, p. xv [HOML] (eksklusiv fra Using Code Examples...og resten af intro kapitlet)}
\displaystyle{§ 1 The machine Learning Landscape [HOML]}
\px{§ 2 End-to-End Machine Learning Project [HOML]} \displaystyle{§ 2 End-to-End Machine Learning Project [HOML]}
\p{Dette kapitel indeholder mange nye koncepter og en del kode. Vi vender \p{Dette kapitel indeholder mange nye koncepter og en del kode. Vi vender
senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overblik senere tilbage til kapitlet senere, så læs det og prøv at danne dig et overblik
(dvs. nærlæs ikke).} (dvs. nærlæs ikke).}
\p{Når du har installeret anaconda (se L00):} \p{Når du har installeret anaconda (se L00):}
\px{§ Scientific Python tutorials: NumPy} \displaystyle{§ Scientific Python tutorials: NumPy}
\px{tools_numpy.ipynb [GITHOML]} \displaystyle{tools_numpy.ipynb [GITHOML]}
\p{Læs blot, hvad du finder relevant så som 'iteration', men spring blot over \p{Læs blot, hvad du finder relevant så som 'iteration', men spring blot over
emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
'QR decomposition'.} 'QR decomposition'.}
\h2{Opgaver} \sub{Opgaver}
\p{Forberedelse inden lektionen} \p{Forberedelse inden lektionen}
...@@ -179,75 +209,24 @@ emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og ...@@ -179,75 +209,24 @@ emner, der er for komplekse eller for 'pythoniske', så som 'Stacking arrays' og
\li{Læs pensum.} \li{Læs pensum.}
} }
\h5{På klassen} \sub{På klassen}
\ul{ \ul{
\li{Diskussion om ML (indlejret i forelæsningen).} \li{Diskussion om ML (indlejret i forelæsningen).}
\li{Opgave: intro.ipynb} \li{Opgave: intro.ipynb}
\li{HUSK DATA til intro'en (download og udpak så "dataset" dir ligger sammen med intro.ipynb): datasets.zip Click for more options} \li{HUSK DATA til intro'en (download og udpak så "dataset" dir ligger sammen med intro.ipynb): \link{,[HOME]/L01/datasets.zip}}
\li{Opgave: modules_and_classes.ipynb} \li{Opgave: modules_and_classes.ipynb}
} }
\h5{Optionelle opgaver} \sub{Optionelle opgaver}
\p{Se 'Ekstra materiale til forberedelse' i lektion 'nul', specielt hvis du har brug for en python og lineær algebra \p{Se 'Ekstra materiale til forberedelse' i lektion 'nul', specielt hvis du har
kick-start.} brug for en python og lineær algebra kick-start.}
\h5{Slides} \sub{Slides}
\px{ \displaystyle{
\link{,[GITMAL]/L01/lesson01.pdf} \link{,[HOME]/L01/lesson01.pdf}
} }
REFS
[ITU] https://itundervisning.ase.au.dk/ITMAL_E21/Html
[GITMAL] https://itundervisning.ase.au.dk/ITMAL_E21
END END
<!DOCTYPE html>
<html>
<head>
</head>
<body style="font-family: Lato;font-size: 12pt;color: #494c4e;">
<h5>Form&aring;l</h5>
<p>Opsamlingslektion: vi tager et genblik p&aring; <em>&sect; 2 <em>"End-to-End Machine Learning Project",</em></em> og samler op p&aring; dette brede kapitel.</p>
<p>Vi g&aring;r f&oslash;rst igang med at gennemg&aring; <em><strong>K-fold Cross-validation</strong></em> (eller K-fold CV), for derefter at bruge "The Map" til at komme igennem alle grundliggende koncepter i <em>&sect; 2. </em><em><br /></em></p>
<p>Da alle kerne-koncepter i supervised ML nu kendes, kan det hele konkret sammens&aelig;ttes i en samlet processerings-<em><strong>pipeline</strong>.</em> Programmerings-teknisk ser vi derfor til sidst p&aring; Scikit-learns Pipelines.</p>
<ul>
<li><a rel="noopener" href="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10655397_1/xid-10655397_1" target="_blank" title="ml_supervised_map.pdf">Oversigtskortet for Supervised learning</a>:</li>
</ul>
<p style="margin-left: 60px;"><a rel="noopener" href="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10655397_1/xid-10655397_1" target="_blank" title="ml_supervised_map.pdf"><img src="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10655394_1/xid-10655394_1" alt="ml_supervised_map.pdf" title="ml_supervised_map.pdf" width="512" height="499" /></a></p>
<h5>Indhold</h5>
<ul>
<li>Generel genl&aelig;sning og repetition af <em>&sect; 2</em></li>
<li>K-fold Cross-validation</li>
<li>Pipelines<em></em></li>
</ul>
<h5>Litteratur</h5>
<p style="margin-left: 30px;"><em>Genl&aelig;s: &sect; 2 <em>"End-to-End Machine Learning Project" </em></em>[HOML]</p>
<p style="margin-left: 60px;">(eksklusiv <em>"Create the Workspace" </em>og <em>"Download the Data")</em></p>
<p style="margin-left: 30px;"><span style="color: #800000;"><span style="font-family: courier new, courier; color: #000000;"><a rel="noopener" href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html?highlight=k%20fold#sklearn.model_selection.KFold" target="_blank"><span style="color: #000000;">Scikit's dokumentations-side vdr. k-fold CV</span></a></span><em> </em></span></p>
<h6>Forberedelse inden lektionen</h6>
<ul>
<li>L&aelig;s litteraturen.<em><br /></em></li>
</ul>
<h6>P&aring; klassen</h6>
<ol>
<li><span style="text-decoration: line-through;">'</span>Sp&oslash;rge-minutter'</li>
<li>Almindelig forel&aelig;sning
<ul>
<li>ekstra materiale: <span style="font-family: courier new, courier;"><a rel="noopener" href="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10655399_1/xid-10655399_1" target="_blank">k-fold_demo.ipynb</a></span></li>
</ul>
</li>
<li>Exercise: <span style="font-family: courier new, courier;"><a rel="noopener" href="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10655389_1/xid-10655389_1" target="_blank">pipelines.ipynb</a> <br /></span>
<ul>
<li><span style="color: #800000;"><span style="color: #000000;">Data til pipelines opgaven (b&oslash;r lige i L07/Data/</span>)</span>: <span style="font-family: courier new, courier;"><a rel="noopener" href="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10656401_1/xid-10656401_1" class="event_clickFileName" target="_blank">itmal_l01_data.pkl</a> </span></li>
<li>(Du har allerede denne data-fil, hvis du pull'er fra GITMAL)</li>
</ul>
</li>
</ol>
<h5>Slides</h5>
<p style="margin-left: 30px;"><span style="font-family: courier new, courier;"><a rel="noopener" href="https://blackboard.au.dk/bbcswebdav/pid-2931054-dt-content-rid-10655390_1/xid-10655390_1" target="_blank">lesson03.pdf</a></span></p>
</body>
</html>
\ No newline at end of file
...@@ -6,10 +6,13 @@ from Utils.mkutils import * ...@@ -6,10 +6,13 @@ from Utils.mkutils import *
from sys import argv from sys import argv
from argparse import ArgumentParser from argparse import ArgumentParser
from html import escape from html import escape, unescape
if __name__ == '__main__': if __name__ == '__main__':
_currline = -1
_currcolumn = -1
class Cmd: class Cmd:
__cmdstate = 0 # 0: txt, 1: cmd, 2: args __cmdstate = 0 # 0: txt, 1: cmd, 2: args
__st = "" __st = ""
...@@ -38,9 +41,9 @@ if __name__ == '__main__': ...@@ -38,9 +41,9 @@ if __name__ == '__main__':
assert Cmd.isCmd(self) assert Cmd.isCmd(self)
assert isInt(self.__cmdstate)>=0 and self.__cmdstate<=2 assert isInt(self.__cmdstate)>=0 and self.__cmdstate<=2
isStr(self.__st) isStr(self.__st, False)
isStr(self.__cmd) isStr(self.__cmd, False)
isStr(self.__args) isStr(self.__args, False)
#if self.__cmdstate==0: #if self.__cmdstate==0:
# assert self.__args=="" # assert self.__args==""
...@@ -52,12 +55,51 @@ if __name__ == '__main__': ...@@ -52,12 +55,51 @@ if __name__ == '__main__':
# assert self.__cmd!="" # assert self.__cmd!=""
return True return True
@staticmethod @staticmethod
def isHtmlCmd(c): def __MkLink(a, exlink, left, right):
return isStr(c) in ["em", "bf", "it", "p", "h1", "h2", "h3", "h4", "h5", "ul", "li"]
args = isStr(a).split(",")
assert len(args)==2
arg0 = isStr(args[0], False)
arg1 = isStr(args[1]).strip()
if len(arg1)==0:
ERR("need second link argument, currently empty")
if len(arg0)==0:
n = arg1.rfind('/')
if n<=0:
ERR(f"if first argument to link is empty, second arg='{arg1}' must contain at least one slash '/'")
arg0 = arg1[n+1:]
if len(arg0)==0:
ERR("second arg still empty, this was not expected")
extra = " rel='noopener' target='_blank'" if isBool(exlink) else ""
return f"{isStr(left)}span style='font-family: courier new, courier;'{isStr(right)}{left}a href='{arg1}'{extra}{right}{arg0}{left}/a{right}{left}/span{right}"
@staticmethod
def __MkStyle(a, left, right):
args = isStr(a).split(",")
assert len(args)==2
arg0 = isStr(args[0]).strip()
arg1 = isStr(args[1]).strip()
if arg0.find('"')>=0 or arg0.find("'")>=0:
ERR(f"do not use pligs (') or quotes (\") in style command, style='{arg0}'")
return f"{isStr(left)}span style='{arg0}'{isStr(right)}{arg1}{left}/span{right}"
@staticmethod
def __isHtmlCmd(c):
return isStr(c) in ["b", "i", "p", "ul", "ol", "li", "header", "sub", "em", "indent", "code", "ipynb", "displaystyle"]
def __MkCmd(self): def __MkCmd(self):
assert self.Ok() assert self.Ok()
c = self.__cmd c = self.__cmd
...@@ -73,35 +115,35 @@ if __name__ == '__main__': ...@@ -73,35 +115,35 @@ if __name__ == '__main__':
Dbg(verbose, f"FOUND COMMAND={t}..", 2) Dbg(verbose, f"FOUND COMMAND={t}..", 2)
v = "" v = ""
if Cmd.isHtmlCmd(c): # fun(arg)..
v = f"{left}{c}{right}{a}{left}/{c}{right}" if Cmd.__isHtmlCmd(c):
elif c=="link":
args = a.split(",")
assert len(args)==2
arg0 = isStr(args[0])
arg1 = isStr(args[1])
if len(arg1)==0: style = ""
ERR("need second link argument, currently empty") if c=="header":
c = "h3"
if len(arg0)==0: elif c=="sub":
n = arg1.rfind('/') c = "h4"
if n<=0: elif c=="em":
ERR(f"if first argument to link is empty, second arg='{arg1}' must contain at least one slash '/'") c = "i"
elif c=="displaystyle":
c = "p"
style = " style='margin-left: 30px'"
elif c=="indent":
c = "span"
style = " style='margin-left: 30px'"
elif c=="code" or c=="ipynb":
c = "span"
style=" style='font-family: courier new, courier;'"
arg0 = arg1[n+1:] v = f"{left}{c}{style}{right}{a}{left}/{c}{right}"
if len(arg0)==0:
ERR("second arg still empty, this was not expected") # fun(arg0, arg1)..