diff --git a/Source/Build.py b/Source/Build.py
index f3aec92..191116f 100755
--- a/Source/Build.py
+++ b/Source/Build.py
@@ -103,7 +103,7 @@ def GetModifiedFiles(OutDir):
return Mod
def Main(Args, FeedEntries):
- Flags = {}
+ Flags, Snippets = {}, {}
HavePages, HavePosts = False, False
SiteConf = LoadConfFile('Site.ini')
@@ -120,8 +120,6 @@ def Main(Args, FeedEntries):
CheckSafeOutDir(OutDir)
print(f"[I] Outputting to: {OutDir}/")
- DiffBuild = Args.DiffBuild
-
BlogName = Flags['BlogName'] = OptionChoose('', Args.BlogName, ReadConf(SiteConf, 'Site', 'BlogName'))
SiteTagline = Flags['SiteTagline'] = OptionChoose('', Args.SiteTagline, ReadConf(SiteConf, 'Site', 'Tagline'))
SiteTemplate = Flags['SiteTemplate'] = OptionChoose('Default.html', Args.SiteTemplate, ReadConf(SiteConf, 'Site', 'Template'))
@@ -130,8 +128,11 @@ def Main(Args, FeedEntries):
SiteLang = Flags['SiteLang'] = OptionChoose('en', Args.SiteLang, ReadConf(SiteConf, 'Site', 'Lang'))
Sorting = Flags['Sorting'] = literal_eval(OptionChoose('{}', Args.Sorting, ReadConf(SiteConf, 'Site', 'Sorting')))
- DynamicParts = Flags['DynamicParts'] = literal_eval(OptionChoose('{}', Args.DynamicParts, ReadConf(SiteConf, 'Site', 'DynamicParts')))
+ Sorting = Flags['Sorting'] = SetSorting(Sorting)
+
NoScripts = Flags['NoScripts'] = StringBoolChoose(False, Args.NoScripts, ReadConf(SiteConf, 'Site', 'NoScripts'))
+ FolderRoots = Flags['FolderRoots'] = literal_eval(Args.FolderRoots) if Args.FolderRoots else {}
+ DiffBuild = Args.DiffBuild
ActivityPubTypeFilter = Flags['ActivityPubTypeFilter'] = OptionChoose('Post', Args.ActivityPubTypeFilter, ReadConf(SiteConf, 'ActivityPub', 'TypeFilter'))
ActivityPubHoursLimit = Flags['ActivityPubHoursLimit'] = OptionChoose(168, Args.ActivityPubHoursLimit, ReadConf(SiteConf, 'ActivityPub', 'HoursLimit'))
@@ -157,6 +158,11 @@ def Main(Args, FeedEntries):
FeedCategoryFilter = Flags['FeedCategoryFilter'] = OptionChoose('Blog', Args.FeedCategoryFilter, ReadConf(SiteConf, 'Feed', 'CategoryFilter'))
FeedEntries = Flags['FeedEntries'] = int(FeedEntries) if (FeedEntries or FeedEntries == 0) and FeedEntries != 'Default' else int(ReadConf(SiteConf, 'Feed', 'Entries')) if ReadConf(SiteConf, 'Feed', 'Entries') else 10
+ DynamicParts = Flags['DynamicParts'] = literal_eval(OptionChoose('{}', Args.DynamicParts, ReadConf(SiteConf, 'Site', 'DynamicParts')))
+ DynamicPartsText = Snippets['DynamicParts'] = LoadFromDir('DynamicParts', ['*.htm', '*.html'])
+ StaticPartsText = Snippets['StaticParts'] = LoadFromDir('StaticParts', ['*.htm', '*.html'])
+ TemplatesText = Snippets['Templates'] = LoadFromDir('Templates', ['*.htm', '*.html'])
+
MenuEntries = ReadConf(SiteConf, 'Menu')
if MenuEntries:
ConfMenu = GetConfMenu(MenuEntries, MarkdownExts)
@@ -192,25 +198,11 @@ def Main(Args, FeedEntries):
print("[I] Generating HTML")
Pages = MakeSite(
Flags=Flags,
- OutputDir=OutDir,
LimitFiles=LimitFiles,
- TemplatesText=LoadFromDir('Templates', ['*.htm', '*.html']),
- StaticPartsText=LoadFromDir('StaticParts', ['*.htm', '*.html']),
- DynamicParts=DynamicParts,
- DynamicPartsText=LoadFromDir('DynamicParts', ['*.htm', '*.html']),
+ Snippets=Snippets,
ConfMenu=ConfMenu,
GlobalMacros=ReadConf(SiteConf, 'Macros'),
- SiteName=SiteName,
- BlogName=BlogName,
- SiteTagline=SiteTagline,
- SiteTemplate=SiteTemplate,
- SiteDomain=SiteDomain,
- SiteRoot=SiteRoot,
- FolderRoots=literal_eval(Args.FolderRoots) if Args.FolderRoots else {},
- SiteLang=SiteLang,
- Locale=Locale,
- Sorting=SetSorting(Sorting),
- MarkdownExts=MarkdownExts)
+ Locale=Locale)
if FeedEntries != 0:
print("[I] Generating Feeds")
diff --git a/Source/Modules/Elements.py b/Source/Modules/Elements.py
new file mode 100644
index 0000000..0f2539a
--- /dev/null
+++ b/Source/Modules/Elements.py
@@ -0,0 +1,103 @@
+""" ================================= |
+| This file is part of |
+| staticoso |
+| Just a simple Static Site Generator |
+| |
+| Licensed under the AGPLv3 license |
+| Copyright (C) 2022, OctoSpacc |
+| ================================= """
+
+from Modules.HTML import *
+from Modules.Utils import *
+
+HTMLSectionTitleLine = '
{Header}
' + +def MakeCategoryLine(File, Meta): + Categories = '' + if Meta['Categories']: + for Cat in Meta['Categories']: + Categories += f' {html.escape(Cat)} ' + return Categories + +def MakeListTitle(File, Meta, Titles, Prefer, SiteRoot, BlogName, PathPrefix=''): + Title = GetTitle(File.split('/')[-1], Meta, Titles, Prefer, BlogName) + Link = False if Meta['Index'] == 'Unlinked' else True + if Link: + Title = '[{}]({})'.format( + Title, + '{}{}.html'.format(PathPrefix, StripExt(File))) + if Meta['Type'] == 'Post': + CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?' + Title = f"[{CreatedOn}] {Title}" + return Title + +def FormatTitles(Titles, Flatten=False): + # TODO: Somehow titles written in Pug can end up here and don't work, they should be handled + HTMLTitles, DashyTitles = '', [] + for t in Titles: + n = 0 if Flatten else t.split(' ')[0].count('#') + Title = MkSoup(t.lstrip('#')).get_text() + DashyTitle = DashifyTitle(Title, DashyTitles) + DashyTitles += [DashyTitle] + Start = '{Header}
' - -def MakeCategoryLine(File, Meta): - Categories = '' - if Meta['Categories']: - for Cat in Meta['Categories']: - Categories += f' {html.escape(Cat)} ' - return Categories - def GetHTMLPagesList(Pages, BlogName, SiteRoot, PathPrefix, Unite=[], Type='Page', Category=None, For='Menu', MarkdownExts=(), MenuStyle='Default'): ShowPaths, Flatten, SingleLine = True, False, False if MenuStyle == 'Flat': @@ -252,31 +186,6 @@ def PagePostprocessor(FileType, Text, Meta): Text = ReplWithEsc(Text, f"[: {e} :]", f"[:{e}:]") return Text -def MakeListTitle(File, Meta, Titles, Prefer, SiteRoot, BlogName, PathPrefix=''): - Title = GetTitle(File.split('/')[-1], Meta, Titles, Prefer, BlogName) - Link = False if Meta['Index'] == 'Unlinked' else True - if Link: - Title = '[{}]({})'.format( - Title, - '{}{}.html'.format(PathPrefix, StripExt(File))) - if Meta['Type'] == 'Post': - CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?' - Title = f"[{CreatedOn}] {Title}" - return Title - -def FormatTitles(Titles, Flatten=False): - # TODO: Somehow titles written in Pug can end up here and don't work, they should be handled - HTMLTitles, DashyTitles = '', [] - for t in Titles: - n = 0 if Flatten else t.split(' ')[0].count('#') - Title = MkSoup(t.lstrip('#')).get_text() - DashyTitle = DashifyTitle(Title, DashyTitles) - DashyTitles += [DashyTitle] - Start = '' + html.escape(Content) + '' + elif FileLower.endswith(FileExtensions['HTML']): + Content = ReadFile(PagePath) + + if LightRun: + HTMLPagesList = None + else: + TemplateMeta = TemplatePreprocessor(TemplatesText[Meta['Template']]) + HTMLPagesList = GetHTMLPagesList( + Pages=Pages, + BlogName=BlogName, + SiteRoot=SiteRoot, + PathPrefix=GetPathLevels(File), + Unite=ConfMenu, + Type='Page', + For='Menu', + MarkdownExts=MarkdownExts, + MenuStyle=TemplateMeta['MenuStyle']) + + HTML, ContentHTML, Description, Image = PatchHTML( + File=File, + HTML=TemplatesText[Meta['Template']], + StaticPartsText=StaticPartsText, + DynamicParts=DynamicParts, + DynamicPartsText=DynamicPartsText, + HTMLPagesList=HTMLPagesList, + PagePath=PagePath[len(f"{OutDir}/"):], + Content=Content, + Titles=Titles, + Meta=Meta, + SiteRoot=SiteRoot, + SiteName=SiteName, + BlogName=BlogName, + FolderRoots=FolderRoots, + Categories=Categories, + SiteLang=SiteLang, + Locale=Locale, + LightRun=LightRun) + + if Flags['Minify']: + if not LightRun: + HTML = DoMinifyHTML(HTML, MinifyKeepComments) + ContentHTML = DoMinifyHTML(ContentHTML, MinifyKeepComments) + if Flags['NoScripts']: + if not LightRun: + HTML = StripTags(HTML, ['script']) + ContentHTML = StripTags(ContentHTML, ['script']) + if ImgAltToTitle or ImgTitleToAlt: + if not LightRun: + HTML = WriteImgAltAndTitle(HTML, ImgAltToTitle, ImgTitleToAlt) + ContentHTML = WriteImgAltAndTitle(ContentHTML, ImgAltToTitle, ImgTitleToAlt) + + if LightRun: + SlimHTML = None + else: + SlimHTML = HTMLPagesList + ContentHTML + if not LightRun: + WriteFile(PagePath, HTML) + + return [File, Content, Titles, Meta, ContentHTML, SlimHTML, Description, Image] + +#def MultiprocHandlePage(Data): +# pass + +def MakeSite(Flags, LimitFiles, Snippets, ConfMenu, GlobalMacros, Locale): + PagesPaths, PostsPaths, Pages, MadePages, MultiprocPages, Categories = [], [], [], [], [], {} + OutDir, MarkdownExts, Sorting, MinifyKeepComments = Flags['OutDir'], Flags['MarkdownExts'], Flags['Sorting'], Flags['MinifyKeepComments'] + SiteName, BlogName, SiteTagline = Flags['SiteName'], Flags['BlogName'], Flags['SiteTagline'] + SiteTemplate, SiteLang = Flags['SiteTemplate'], Flags['SiteLang'] + SiteDomain, SiteRoot, FolderRoots = Flags['SiteDomain'], Flags['SiteRoot'], Flags['FolderRoots'] + AutoCategories, CategoryUncategorized = Flags['CategoriesAutomatic'], Flags['CategoriesUncategorized'] + ImgAltToTitle, ImgTitleToAlt = Flags['ImgAltToTitle'], Flags['ImgTitleToAlt'] + DynamicParts, DynamicPartsText, StaticPartsText, TemplatesText = Flags['DynamicParts'], Snippets['DynamicParts'], Snippets['StaticParts'], Snippets['Templates'] for Ext in FileExtensions['Pages']: for File in Path('Pages').rglob(f"*.{Ext}"): @@ -424,7 +420,7 @@ def MakeSite(Flags, OutputDir, LimitFiles, TemplatesText, StaticPartsText, Dynam Pages += [[TempPath, Content, Titles, Meta]] for Cat in Meta['Categories']: Categories.update({Cat:''}) - PugCompileList(OutputDir, Pages, LimitFiles) + PugCompileList(OutDir, Pages, LimitFiles) if Categories: print("[I] Generating Category Lists") @@ -442,7 +438,7 @@ def MakeSite(Flags, OutputDir, LimitFiles, TemplatesText, StaticPartsText, Dynam MenuStyle='Flat') if AutoCategories: - Dir = f"{OutputDir}/Categories" + Dir = f"{OutDir}/Categories" for Cat in Categories: Exists = False for File in Path(Dir).rglob(str(Cat)+'.*'): @@ -450,7 +446,7 @@ def MakeSite(Flags, OutputDir, LimitFiles, TemplatesText, StaticPartsText, Dynam break if not Exists: File = f"Categories/{Cat}.md" - FilePath = f"{OutputDir}/{File}" + FilePath = f"{OutDir}/{File}" WriteFile(FilePath, CategoryPageTemplate.format(Title=Cat)) Content, Titles, Meta = PagePreprocessor(FilePath, 'Page', SiteTemplate, SiteRoot, GlobalMacros, CategoryUncategorized, LightRun=LightRun) Pages += [[File, Content, Titles, Meta]] @@ -462,75 +458,11 @@ def MakeSite(Flags, OutputDir, LimitFiles, TemplatesText, StaticPartsText, Dynam ConfMenu[i] = None print("[I] Writing Pages") - for File, Content, Titles, Meta in Pages: + for Page in Pages: #print(f'-> {File}') - LightRun = False if LimitFiles == False or File in LimitFiles else True - PagePath = f"{OutputDir}/{StripExt(File)}.html" - - if File.lower().endswith(FileExtensions['Markdown']): - Content = markdown(PagePostprocessor('md', Content, Meta), extensions=MarkdownExts) - elif File.lower().endswith(('.pug')): - Content = PagePostprocessor('pug', ReadFile(PagePath), Meta) - elif File.lower().endswith(('.txt')): - Content = '
' + html.escape(Content) + '' - elif File.lower().endswith(FileExtensions['HTML']): - Content = ReadFile(PagePath) - - if LightRun: - HTMLPagesList = None - else: - TemplateMeta = TemplatePreprocessor(TemplatesText[Meta['Template']]) - HTMLPagesList = GetHTMLPagesList( - Pages=Pages, - BlogName=BlogName, - SiteRoot=SiteRoot, - PathPrefix=GetPathLevels(File), - Unite=ConfMenu, - Type='Page', - For='Menu', - MarkdownExts=MarkdownExts, - MenuStyle=TemplateMeta['MenuStyle']) - - HTML, ContentHTML, Description, Image = PatchHTML( - File=File, - HTML=TemplatesText[Meta['Template']], - StaticPartsText=StaticPartsText, - DynamicParts=DynamicParts, - DynamicPartsText=DynamicPartsText, - HTMLPagesList=HTMLPagesList, - PagePath=PagePath[len(f"{OutputDir}/"):], - Content=Content, - Titles=Titles, - Meta=Meta, - SiteRoot=SiteRoot, - SiteName=SiteName, - BlogName=BlogName, - FolderRoots=FolderRoots, - Categories=Categories, - SiteLang=SiteLang, - Locale=Locale, - LightRun=LightRun) - - if Flags['Minify']: - if not LightRun: - HTML = DoMinifyHTML(HTML, MinifyKeepComments) - ContentHTML = DoMinifyHTML(ContentHTML, MinifyKeepComments) - if Flags['NoScripts']: - if not LightRun: - HTML = StripTags(HTML, ['script']) - ContentHTML = StripTags(ContentHTML, ['script']) - if ImgAltToTitle or ImgTitleToAlt: - if not LightRun: - HTML = WriteImgAltAndTitle(HTML, ImgAltToTitle, ImgTitleToAlt) - ContentHTML = WriteImgAltAndTitle(ContentHTML, ImgAltToTitle, ImgTitleToAlt) - - if LightRun: - SlimHTML = None - else: - SlimHTML = HTMLPagesList + ContentHTML - if not LightRun: - WriteFile(PagePath, HTML) - - MadePages += [[File, Content, Titles, Meta, ContentHTML, SlimHTML, Description, Image]] + MadePages += [HandlePage(Flags, Page, Pages, Categories, LimitFiles, Snippets, ConfMenu, Locale)] + #MultiprocPages += [{'Flags':Flags, 'Page':Page, 'Pages':Pages, 'Categories':Categories, 'LimitFiles':LimitFiles, 'Snippets':Snippets, 'ConfMenu':ConfMenu, 'Locale':Locale}] + #with Pool(cpu_count()) as MultiprocPool: + #MadePages = MultiprocPool.map(HandlePage, MultiprocPages) return MadePages