Working towards differential building

This commit is contained in:
octospacc 2022-08-27 16:50:50 +02:00
parent 9cf3bc3e27
commit 506f251a7b
6 changed files with 82 additions and 42 deletions

View File

@ -19,7 +19,7 @@ try:
from Modules.ActivityPub import *
ActivityPub = True
except:
print("[E] Can't load the ActivityPub module. Its use is disabled. Make sure the 'requests' library is installed.")
print("[W] ⚠️ Can't load the ActivityPub module. Its use is disabled. Make sure the 'requests' library is installed.")
ActivityPub = False
from Modules.Config import *
@ -29,18 +29,18 @@ from Modules.Site import *
from Modules.Sitemap import *
from Modules.Utils import *
def ResetPublic(OutputDir):
for i in (OutputDir, f"{OutputDir}.gmi"):
def ResetOutputDir(OutDir):
for e in (OutDir, f"{OutDir}.gmi"):
try:
shutil.rmtree(i)
shutil.rmtree(e)
except FileNotFoundError:
pass
def DelTmp(OutputDir):
def DelTmp(OutDir):
for Ext in FileExtensions['Tmp']:
for File in Path(OutputDir).rglob(f"*.{Ext}"):
for File in Path(OutDir).rglob(f"*.{Ext}"):
os.remove(File)
for Dir in (OutputDir, f"{OutputDir}.gmi"):
for Dir in (OutDir, f"{OutDir}.gmi"):
for File in Path(Dir).rglob('*.tmp'):
os.remove(File)
@ -73,16 +73,48 @@ def CheckSafeOutputDir(OutDir):
OutDir = os.path.realpath(OutDir)
OutFolder = OutDir.split('/')[-1]
if InDir == OutDir:
print(f"[E] Output and Input directories ({OutDir}) can't be the same. Exiting.")
print(f"[E] Output and Input directories ({OutDir}) can't be the same. Exiting.")
exit(1)
elif OutFolder in ReservedPaths and f"{InDir}/{OutFolder}" == OutDir:
print(f"[E] Output directory {OutDir} can't be a reserved subdirectory of the Input. Exiting.")
print(f"[E] Output directory {OutDir} can't be a reserved subdirectory of the Input. Exiting.")
exit(1)
def GetModifiedFiles(OutDir):
All, Mod = [], []
for Path in ('Pages', 'Posts'):
for Root, Dirs, Files in os.walk(Path):
for File in Files:
Src = os.path.join(Root,File)
SrcTime = int(os.path.getmtime(Src))
if Path == 'Pages':
Tmp = '/'.join(Src.split('/')[1:])
elif Path == 'Posts':
Tmp = Src
Obj = f"{OutDir}/{StripExt(Tmp)}.html"
try:
ObjTime = int(os.path.getmtime(Obj))
except FileNotFoundError:
ObjTime = 0
All += [{'Tmp':Tmp, 'SrcTime':SrcTime, 'ObjTime':ObjTime}]
for File in All:
if File['SrcTime'] > File['ObjTime']:
Mod += [File['Tmp']]
#Latest = 0
#for File in Sources:
# if File['t'] > Latest:
# Latest = File['t']
#Meta = ReadFile('staticoso.meta')
return Mod
def Main(Args, FeedEntries):
HavePages, HavePosts = False, False
SiteConf = LoadConfFile('Site.ini')
#if Args.InputDir:
# os.chdir(Args.InputDir)
# print(f"[I] Current directory: {Args.InputDir}")
CleanBuild = Args.CleanBuild
OutputDir = Args.OutputDir if Args.OutputDir else ReadConf(SiteConf, 'Site', 'OutputDir') if ReadConf(SiteConf, 'Site', 'OutputDir') else 'public'
OutputDir = OutputDir.removesuffix('/')
CheckSafeOutputDir(OutputDir)
@ -120,18 +152,23 @@ def Main(Args, FeedEntries):
else:
ConfMenu = []
ResetPublic(OutputDir)
if CleanBuild:
print("[I] Building Clean")
ResetOutputDir(OutputDir)
else:
print("[I] Building Differentially")
LimitFiles = GetModifiedFiles(OutputDir)
if os.path.isdir('Pages'):
HavePages = True
shutil.copytree('Pages', OutputDir)
shutil.copytree('Pages', OutputDir, dirs_exist_ok=True)
if GemtextOut:
shutil.copytree('Pages', f"{OutputDir}.gmi", ignore=IgnoreFiles)
shutil.copytree('Pages', f"{OutputDir}.gmi", ignore=IgnoreFiles, dirs_exist_ok=True)
if os.path.isdir('Posts'):
HavePosts = True
shutil.copytree('Posts', f"{OutputDir}/Posts")
shutil.copytree('Posts', f"{OutputDir}/Posts", dirs_exist_ok=True)
if GemtextOut:
shutil.copytree('Posts', f"{OutputDir}.gmi/Posts", ignore=IgnoreFiles)
shutil.copytree('Posts', f"{OutputDir}.gmi/Posts", ignore=IgnoreFiles, dirs_exist_ok=True)
if not (HavePages or HavePosts):
print("[E] No Pages or posts found. Nothing to do, exiting!")
@ -140,6 +177,7 @@ def Main(Args, FeedEntries):
print("[I] Generating HTML")
Pages = MakeSite(
OutputDir=OutputDir,
LimitFiles=LimitFiles,
TemplatesText=LoadFromDir('Templates', ['*.htm', '*.html']),
StaticPartsText=LoadFromDir('StaticParts', ['*.htm', '*.html']),
DynamicParts=DynamicParts,
@ -220,11 +258,14 @@ def Main(Args, FeedEntries):
print("[I] Copying Assets")
os.system(f"cp -R Assets/* {OutputDir}/")
print("[I] Done!")
print("[I] Done!")
if __name__ == '__main__':
Parser = argparse.ArgumentParser()
Parser.add_argument('--CleanBuild', action='store_true')
Parser.add_argument('--OutputDir', type=str)
#Parser.add_argument('--InputDir', type=str)
#Parser.add_argument('--InputFiles', type=str, nargs='+')
Parser.add_argument('--Sorting', type=str)
Parser.add_argument('--SiteLang', type=str)
Parser.add_argument('--SiteRoot', type=str)
@ -257,7 +298,7 @@ if __name__ == '__main__':
from Modules.Feed import *
FeedEntries = Args.FeedEntries if Args.FeedEntries else 'Default'
except:
print("[W] Can't load the XML libraries. XML Feeds Generation is Disabled. Make sure the 'lxml' library is installed.")
print("[W] ⚠️ Can't load the XML libraries. XML Feeds Generation is Disabled. Make sure the 'lxml' library is installed.")
FeedEntries = 0
Main(

View File

@ -7,7 +7,6 @@
| Copyright (C) 2022, OctoSpacc |
| ================================= """
import io
import configparser
from ast import literal_eval

View File

@ -12,11 +12,11 @@
import os
from Modules.Utils import *
def PugCompileList(OutputDir, Pages):
def PugCompileList(OutputDir, Pages, LimitFiles):
# Pug-cli seems to shit itself with folder paths as input, so we pass ALL the files as arguments
Paths = ''
for File, Content, Titles, Meta in Pages:
if File.lower().endswith('.pug'):
if File.lower().endswith('.pug') and File in LimitFiles:
Path = f'{OutputDir}/{File}'
WriteFile(Path, Content)
Paths += f'"{Path}" '

View File

@ -373,7 +373,7 @@ def DoMinifyHTML(HTML):
convert_charrefs=True,
keep_pre=True)
def MakeSite(OutputDir, TemplatesText, StaticPartsText, DynamicParts, DynamicPartsText, ConfMenu, GlobalMacros, SiteName, BlogName, SiteTagline, SiteTemplate, SiteDomain, SiteRoot, FolderRoots, SiteLang, Locale, Minify, NoScripts, ImgAltToTitle, ImgTitleToAlt, Sorting, MarkdownExts, AutoCategories):
def MakeSite(OutputDir, LimitFiles, TemplatesText, StaticPartsText, DynamicParts, DynamicPartsText, ConfMenu, GlobalMacros, SiteName, BlogName, SiteTagline, SiteTemplate, SiteDomain, SiteRoot, FolderRoots, SiteLang, Locale, Minify, NoScripts, ImgAltToTitle, ImgTitleToAlt, Sorting, MarkdownExts, AutoCategories):
PagesPaths, PostsPaths, Pages, MadePages, Categories = [], [], [], [], {}
for Ext in FileExtensions['Pages']:
for File in Path('Pages').rglob(f"*.{Ext}"):
@ -381,14 +381,12 @@ def MakeSite(OutputDir, TemplatesText, StaticPartsText, DynamicParts, DynamicPar
for File in Path('Posts').rglob(f"*.{Ext}"):
PostsPaths += [FileToStr(File, 'Posts/')]
if PagesPaths:
PagesPaths = FileNameDateSort(PagesPaths)
if Sorting['Pages'] == 'Inverse':
PagesPaths.reverse()
if PostsPaths:
PostsPaths = FileNameDateSort(PostsPaths)
if Sorting['Posts'] == 'Inverse':
PostsPaths.reverse()
PagesPaths = FileNameDateSort(PagesPaths)
if Sorting['Pages'] == 'Inverse':
PagesPaths.reverse()
PostsPaths = FileNameDateSort(PostsPaths)
if Sorting['Posts'] == 'Inverse':
PostsPaths.reverse()
print("[I] Preprocessing Source Pages")
for Type in ['Page', 'Post']:
@ -403,7 +401,7 @@ def MakeSite(OutputDir, TemplatesText, StaticPartsText, DynamicParts, DynamicPar
Pages += [[File, Content, Titles, Meta]]
for Cat in Meta['Categories']:
Categories.update({Cat:''})
PugCompileList(OutputDir, Pages)
PugCompileList(OutputDir, Pages, LimitFiles)
if Categories:
print("[I] Generating Category Lists")

View File

@ -116,19 +116,20 @@ def RevSort(List):
def FileNameDateSort(Old): # TODO: Test this for files not starting with date, and dated folders
New = []
Old.sort()
New.insert(0, Old[0])
for i,e in enumerate(Old):
if i == 0:
continue
Done = False
for j,f in enumerate(New):
if NumsFromFileName(e) != e and NumsFromFileName(f) != f and NumsFromFileName(e) < NumsFromFileName(f):
New.insert(j, e)
Done = True
break
if not Done:
New += [e]
if Old:
Old.sort()
New.insert(0, Old[0])
for i,e in enumerate(Old):
if i == 0:
continue
Done = False
for j,f in enumerate(New):
if NumsFromFileName(e) != e and NumsFromFileName(f) != f and NumsFromFileName(e) < NumsFromFileName(f):
New.insert(j, e)
Done = True
break
if not Done:
New += [e]
return New
def FirstRealItem(List):

1
TODO
View File

@ -1,3 +1,4 @@
- Check if external tools are installed
- Specify input folder(s) and files (idea is Makefile compatibility too)
- Show page size/words/time in meta line
- Add feed support for diary-like pages