diff --git a/Locale/en.json b/Locale/en.json
index a88f14e..8b8c9b9 100644
--- a/Locale/en.json
+++ b/Locale/en.json
@@ -4,5 +4,7 @@
"Categories": "Categories",
"ReadFullPost": "Read the full post",
"Comments": "Comments",
- "OpenInNewTab": "Open in a new tab"
+ "OpenInNewTab": "Open in a new tab",
+ "ClickHere": "Click here",
+ "IfNotRedirected": "if you aren't automatically redirected"
}
diff --git a/Locale/it.json b/Locale/it.json
index 6f71dd7..ef21767 100644
--- a/Locale/it.json
+++ b/Locale/it.json
@@ -4,5 +4,7 @@
"Categories": "Categorie",
"ReadFullPost": "Leggi il post intero",
"Comments": "Commenti",
- "OpenInNewTab": "Apri in una nuova scheda"
+ "OpenInNewTab": "Apri in una nuova scheda",
+ "ClickHere": "Clicca qui",
+ "IfNotRedirected": "se non subisci il reindirizzamento automatico"
}
diff --git a/Source/Build.py b/Source/Build.py
index 27b6afa..6e6b500 100755
--- a/Source/Build.py
+++ b/Source/Build.py
@@ -104,10 +104,12 @@ def GetModifiedFiles(OutDir):
return Mod
def Main(Args, FeedEntries):
- Flags, Snippets = {}, {}
+ Flags, Snippets, FinalPaths = {}, {}, []
HavePages, HavePosts = False, False
SiteConf = LoadConfFile('Site.ini')
+ ConfigLogging(OptionChoose(None, Args.Logging, ReadConf(SiteConf, 'Main', 'Logging')))
+
#if Args.InputDir:
# os.chdir(Args.InputDir)
# print(f"[I] Current directory: {Args.InputDir}")
@@ -228,13 +230,29 @@ def Main(Args, FeedEntries):
Post = ''
for p in MastodonPosts:
if p['Link'] == SiteDomain + '/' + File[len(f"{OutDir}/"):]:
- Post = '
{StrComments}
{StrOpen} ↗️'.format(
+ Post = HTMLCommentsBlock.format(
StrComments=Locale['Comments'],
StrOpen=Locale['OpenInNewTab'],
URL=p['Post'])
break
Content = ReplWithEsc(Content, '[staticoso:Comments]', Post)
+ Content = ReplWithEsc(Content, '', Post)
WriteFile(File, Content)
+ FinalPaths += [File]
+
+ logging.info("Creating Redirects")
+ for File, Content, Titles, Meta, ContentHTML, SlimHTML, Description, Image in Pages:
+ for URL in Meta['URLs']:
+ DestFile = f"{OutDir}/{URL}"
+ if DestFile not in FinalPaths:
+ DestURL = f"{GetPathLevels(URL)}{StripExt(File)}.html"
+ WriteFile(
+ DestFile,
+ RedirectPageTemplate.format(
+ DestURL=DestURL,
+ TitlePrefix=f"{SiteName} - " if SiteName else '',
+ StrClick=Locale["ClickHere"],
+ StrRedirect=Locale["IfNotRedirected"]))
if Flags['GemtextOutput']:
logging.info("Generating Gemtext")
@@ -302,4 +320,4 @@ if __name__ == '__main__':
Main(
Args=Args,
FeedEntries=FeedEntries)
- logging.info(f"✅ Done! ({round(time.time()-StartTime,3)}s)")
+ logging.info(f"✅ Done! ({round(time.time()-StartTime, 3)}s)")
diff --git a/Source/Modules/Elements.py b/Source/Modules/Elements.py
index 0f2539a..71c8bf7 100644
--- a/Source/Modules/Elements.py
+++ b/Source/Modules/Elements.py
@@ -19,8 +19,21 @@ CategoryPageTemplate = """\
# {Name}
-[staticoso:Category:{Name}]
+
"""
+RedirectPageTemplate = """\
+
+
+
+{TitlePrefix}Redirect
+
+
+
+{StrClick} {StrRedirect}.
+
+
+"""
+HTMLCommentsBlock = '
{StrComments}
{StrOpen} ↗️'
def DashifyTitle(Title, Done=[]):
return UndupeStr(DashifyStr(Title.lstrip(' ').rstrip(' ')), Done, '-')
diff --git a/Source/Modules/Site.py b/Source/Modules/Site.py
index aa1a072..6783ace 100644
--- a/Source/Modules/Site.py
+++ b/Source/Modules/Site.py
@@ -107,7 +107,9 @@ def PagePreprocessor(Path, TempPath, Type, SiteTemplate, SiteRoot, GlobalMacros,
'Image': '',
'Macros': {},
'Categories': [],
+ 'URLs': [],
'CreatedOn': '',
+ 'UpdatedOn': '',
'EditedOn': '',
'Order': None}
# Find all positions of '', add them in a list=[[pos0,pos1,line0,line1],...]
@@ -182,13 +184,21 @@ def PagePreprocessor(Path, TempPath, Type, SiteTemplate, SiteRoot, GlobalMacros,
Meta = dict(ReadConf(LoadConfStr('[Meta]\n' + Meta), 'Meta'))
for i in MetaDefault:
if i in Meta:
+ # TODO: Handle strings with spaces but wrapped in quotes
if i == 'Categories':
Categories = Meta['Categories'].split(' ')
Meta['Categories'] = []
for j in Categories:
Meta['Categories'] += [j]
+ elif i == 'URLs':
+ URLs = Meta['URLs'].split(' ')
+ Meta['URLs'] = []
+ for j in URLs:
+ Meta['URLs'] += [j]
else:
Meta.update({i:MetaDefault[i]})
+ if Meta['UpdatedOn']:
+ Meta['EditedOn'] = Meta['UpdatedOn']
if Meta['Index'] in ('Default', 'Unspecified', 'Categories'):
if not Meta['Categories']:
Meta['Categories'] = [CategoryUncategorized]
@@ -199,7 +209,6 @@ def PagePreprocessor(Path, TempPath, Type, SiteTemplate, SiteRoot, GlobalMacros,
if GlobalMacros:
Meta['Macros'].update(GlobalMacros)
Meta['Macros'].update(ReadConf(LoadConfStr('[Macros]\n' + Macros), 'Macros'))
- #PrintPercentDots(ProcPercent)
return [TempPath, Content, Titles, Meta]
def PagePostprocessor(FileType, Text, Meta):
@@ -434,15 +443,16 @@ def HandlePage(Flags, Page, Pages, Categories, LimitFiles, Snippets, ConfMenu, L
if not LightRun:
WriteFile(PagePath, HTML)
- #PrintPercentDots(ProcPercent)
return [File, Content, Titles, Meta, ContentHTML, SlimHTML, Description, Image]
-def MultiprocHandlePage(d):
- return HandlePage(d['Flags'], d['Page'], d['Pages'], d['Categories'], d['LimitFiles'], d['Snippets'], d['ConfMenu'], d['Locale'])
-
def MultiprocPagePreprocessor(d):
+ PrintProcPercentDots(d['Process'], 2)
return PagePreprocessor(d['Path'], d['TempPath'], d['Type'], d['Template'], d['SiteRoot'], d['GlobalMacros'], d['CategoryUncategorized'], d['LightRun'])
+def MultiprocHandlePage(d):
+ PrintProcPercentDots(d['Process'])
+ return HandlePage(d['Flags'], d['Page'], d['Pages'], d['Categories'], d['LimitFiles'], d['Snippets'], d['ConfMenu'], d['Locale'])
+
def MakeSite(Flags, LimitFiles, Snippets, ConfMenu, GlobalMacros, Locale, Threads):
PagesPaths, PostsPaths, Pages, MadePages, Categories = [], [], [], [], {}
PoolSize = cpu_count() if Threads <= 0 else Threads
@@ -476,13 +486,15 @@ def MakeSite(Flags, LimitFiles, Snippets, ConfMenu, GlobalMacros, Locale, Thread
elif Type == 'Post':
Files = PostsPaths
PathPrefix = 'Posts/'
- for File in Files:
+ for i,File in enumerate(Files):
TempPath = f"{PathPrefix}{File}"
LightRun = False if LimitFiles == False or TempPath in LimitFiles else True
- MultiprocPages += [{'Path':f"{Type}s/{File}", 'TempPath':TempPath, 'Type':Type, 'Template':SiteTemplate, 'SiteRoot':SiteRoot, 'GlobalMacros':GlobalMacros, 'CategoryUncategorized':CategoryUncategorized, 'LightRun':LightRun}]
+ MultiprocPages += [{'Process':{'Num':i, 'Count':len(Files)}, 'Path':f"{Type}s/{File}", 'TempPath':TempPath, 'Type':Type, 'Template':SiteTemplate, 'SiteRoot':SiteRoot, 'GlobalMacros':GlobalMacros, 'CategoryUncategorized':CategoryUncategorized, 'LightRun':LightRun}]
+ os.system('printf "["')
with Pool(PoolSize) as MultiprocPool:
Pages = MultiprocPool.map(MultiprocPagePreprocessor, MultiprocPages)
- #print() # Make newline after percentage dots
+ os.system('printf "]\n"') #print("]") # Make newline after percentage dots
+
for File, Content, Titles, Meta in Pages:
for Cat in Meta['Categories']:
Categories.update({Cat:''})
@@ -513,8 +525,8 @@ def MakeSite(Flags, LimitFiles, Snippets, ConfMenu, GlobalMacros, Locale, Thread
if not Exists:
File = f"Categories/{Cat}.md"
FilePath = f"{OutDir}/{File}"
- WriteFile(FilePath, CategoryPageTemplate.format(Title=Cat))
- Content, Titles, Meta = PagePreprocessor(FilePath, 'Page', SiteTemplate, SiteRoot, GlobalMacros, CategoryUncategorized, LightRun=LightRun)
+ WriteFile(FilePath, CategoryPageTemplate.format(Name=Cat))
+ _, Content, Titles, Meta = PagePreprocessor(FilePath, FilePath, Type, SiteTemplate, SiteRoot, GlobalMacros, CategoryUncategorized, LightRun=LightRun)
Pages += [[File, Content, Titles, Meta]]
for i,e in enumerate(ConfMenu):
@@ -525,10 +537,11 @@ def MakeSite(Flags, LimitFiles, Snippets, ConfMenu, GlobalMacros, Locale, Thread
logging.info("Writing Pages")
MultiprocPages = []
- for Page in Pages:
- MultiprocPages += [{'Flags':Flags, 'Page':Page, 'Pages':Pages, 'Categories':Categories, 'LimitFiles':LimitFiles, 'Snippets':Snippets, 'ConfMenu':ConfMenu, 'Locale':Locale}]
+ for i,Page in enumerate(Pages):
+ MultiprocPages += [{'Process':{'Num':i, 'Count':len(Pages)}, 'Flags':Flags, 'Page':Page, 'Pages':Pages, 'Categories':Categories, 'LimitFiles':LimitFiles, 'Snippets':Snippets, 'ConfMenu':ConfMenu, 'Locale':Locale}]
+ os.system('printf "["')
with Pool(PoolSize) as MultiprocPool:
MadePages = MultiprocPool.map(MultiprocHandlePage, MultiprocPages)
- #print() # Make newline after percentage dots
+ os.system('printf "]\n"') #print("]") # Make newline after percentage dots
return MadePages
diff --git a/Source/Modules/Utils.py b/Source/Modules/Utils.py
index 21acf3c..b169d9a 100644
--- a/Source/Modules/Utils.py
+++ b/Source/Modules/Utils.py
@@ -158,10 +158,8 @@ def LoadLocale(Lang):
def IsLightRun(File, LimitFiles):
return False if LimitFiles == False or File in LimitFiles else True
-def PrintPercentDots(Percent):
- Cur, Tot = Percent
- CalcCur = int((Cur/Tot)*100)
- if CalcCur % 10 == 0:
- CalcPrev = int((Cur-1/Tot)*100)
- if CalcPrev % 10 != 0:
- print('.', end='')
\ No newline at end of file
+def PrintProcPercentDots(Proc, DivMult=1):
+ Div = 5 * DivMult # 100/5 = 20 chars
+ Num, Count = Proc['Num'], Proc['Count']
+ if int(((Num/Count)*100)/Div) != int((((Num+1)/Count)*100)/Div):
+ os.system('printf "="') # For some reason print() without newline breaks here (doesn't print everytime)