penguin/AstroJS

Javascript framework for my blog

commit 16f112485a40085a7ca7559f6b0f23265bcb904a

author斟酌 鵬兄 <tgckpg@gmail.com>
date2022-04-05T09:13:40Z
subjectReduced some image 301 round trips
commit 16f112485a40085a7ca7559f6b0f23265bcb904a
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2022-04-05T09:13:40Z

    Reduced some image 301 round trips
---
 Dockerfile                                         |  5 ++---
 botanjs/config.py                                  | 12 +++++++++--
 botanjs/service/jclassresv.py                      |  3 ++-
 .../src/Astro/Blog/AstroEdit/Visualizer/_this.css  |  2 +-
 botanjs/src/Astro/Blog/Components/Album.css        |  6 +++---
 botanjs/src/Astro/Blog/Components/Album.js         |  6 ++----
 botanjs/src/Astro/Blog/Components/Entry/Blog.css   |  2 +-
 botanjs/src/Astro/Blog/Components/SiteFile.js      | 24 ++++++++++++++++------
 botanjs/src/Astro/Bootstrap.css                    |  2 +-
 botanjs/src/Astro/Build/Components/BuildList.css   |  2 +-
 botanjs/src/Astro/Build/Components/BuildReport.css |  2 +-
 botanjs/src/Astro/Build/Page/Index.css             |  4 ++--
 botanjs/src/Astro/Penguin/Layout/MainFrame.css     |  4 ++--
 botanjs/src/Astro/Penguin/Page/Docs.css            |  2 +-
 botanjs/src/Astro/Starfall/Layout/MainFrame.css    |  2 +-
 botanjs/src/Components/Console.css                 |  4 ++--
 botanjs/src/_this.css                              |  8 ++++++++
 botanjs/src/externs/_AstJson_.SiteFile.js          |  8 ++++++++
 k8s/deployments.yaml                               |  4 ++--
 settings.ini                                       |  5 ++++-
 windows/app/Dockerfile                             |  8 +++++---
 windows/base-compose.yml                           |  9 ++++++++
 windows/docker-compose.yml                         | 16 ++++++---------
 23 files changed, 92 insertions(+), 48 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index f99286c..3743b31 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -10,16 +10,15 @@ RUN chown www-data:www-data . -R
 
 RUN pip3 install Flask redis compressinja Celery
 
-COPY . /app/
-
 ADD [ "https://github.com/tgckpg/BotanJS/releases/download/compressors/closure.jar" \
     , "https://github.com/tgckpg/BotanJS/releases/download/compressors/yuicompressor.jar" \
     , "/opt/utils/" ]
 
 RUN chmod 644 /opt/utils/*.jar
 
+COPY . /app/
+
 USER www-data
 
 EXPOSE 5000
 ENTRYPOINT ["setup/docker.start"]
-
diff --git a/botanjs/config.py b/botanjs/config.py
index 2117351..6daa295 100644
--- a/botanjs/config.py
+++ b/botanjs/config.py
@@ -1,7 +1,15 @@
 #!/usr/bin/env python3
-import configparser
+import configparser, os
 
 Config = configparser.ConfigParser( interpolation = configparser.ExtendedInterpolation() )
 Config.read( "settings.ini" )
 
-DEBUG = Config[ "Env" ][ "Debug" ]
+DEBUG = os.getenv( "DEBUG" )
+if DEBUG is None:
+	DEBUG = Config[ "Env" ][ "Debug" ]
+else:
+	Config[ "Env" ][ "Debug" ] = DEBUG
+
+REDIS_CONN = os.getenv( "REDIS_CONN" )
+if not REDIS_CONN is None:
+	Config[ "Redis" ][ "ConnStr" ] = REDIS_CONN
diff --git a/botanjs/service/jclassresv.py b/botanjs/service/jclassresv.py
index 6989a41..0bca229 100644
--- a/botanjs/service/jclassresv.py
+++ b/botanjs/service/jclassresv.py
@@ -285,7 +285,8 @@ class BotanClassResolver:
 		if cacheFile != None:
 			return cacheFile;
 
-		outputCss = ""
+		# The root file
+		outputCss = self.BotanFile( "_this.css" )
 
 		for f in self.cleanList( cList ):
 			outputCss += self.BotanFile( f )
diff --git a/botanjs/src/Astro/Blog/AstroEdit/Visualizer/_this.css b/botanjs/src/Astro/Blog/AstroEdit/Visualizer/_this.css
index e4c92df..5ede39e 100644
--- a/botanjs/src/Astro/Blog/AstroEdit/Visualizer/_this.css
+++ b/botanjs/src/Astro/Blog/AstroEdit/Visualizer/_this.css
@@ -49,7 +49,7 @@
 }
 
 textarea.v_snippet_input {
-	font-family: monospace;
+	font-family: site-mono;
 	font-size: 1em;
 }
 
diff --git a/botanjs/src/Astro/Blog/Components/Album.css b/botanjs/src/Astro/Blog/Components/Album.css
index 1e026c1..5157e65 100644
--- a/botanjs/src/Astro/Blog/Components/Album.css
+++ b/botanjs/src/Astro/Blog/Components/Album.css
@@ -1,14 +1,14 @@
-.site_file[data-type="album"] {
+.site-file[data-type="album"] {
 	column-width: 225px;
 	column-gap: 0.75em;
 }
 
-.site_file[data-type="album"] > div {
+.site-file[data-type="album"] > div {
 	display: inline-block;
 	margin-bottom: 0.5em;
 	width: 100%;
 }
 
-.site_file[data-type="album"] > div img {
+.site-file[data-type="album"] > div img {
 	width: 100%;
 }
diff --git a/botanjs/src/Astro/Blog/Components/Album.js b/botanjs/src/Astro/Blog/Components/Album.js
index a37360d..f783950 100644
--- a/botanjs/src/Astro/Blog/Components/Album.js
+++ b/botanjs/src/Astro/Blog/Components/Album.js
@@ -64,11 +64,9 @@
 
 				Cycle.next( function()
 				{
-					new SiteFile( this.id, this.hash );
-				}.bind({ id: uuid, hash: file.hash }) );
+					new SiteFile( this.id, this.info.hash, this.info );
+				}.bind({ id: uuid, info: file }) );
 			}
-
-			console.log( finfo );
 		};
 
 		var loadFailed = function( obj )
diff --git a/botanjs/src/Astro/Blog/Components/Entry/Blog.css b/botanjs/src/Astro/Blog/Components/Entry/Blog.css
index a9d3286..a630339 100644
--- a/botanjs/src/Astro/Blog/Components/Entry/Blog.css
+++ b/botanjs/src/Astro/Blog/Components/Entry/Blog.css
@@ -4,7 +4,7 @@
 }
 
 .inline-code {
-	font-family: monospace;
+	font-family: site-mono;
 	font-size: 1.12em;
 
 	color: black;
diff --git a/botanjs/src/Astro/Blog/Components/SiteFile.js b/botanjs/src/Astro/Blog/Components/SiteFile.js
index 555dd46..12c3c80 100644
--- a/botanjs/src/Astro/Blog/Components/SiteFile.js
+++ b/botanjs/src/Astro/Blog/Components/SiteFile.js
@@ -20,7 +20,7 @@
 	/** @type {_AstConf_.SiteFile} */
 	var config = null;
 
-	var SiteFile  = function ( id, hash )
+	var SiteFile  = function ( id, hash, nObj )
 	{
 		if( !config ) throw new Error( "config is not defined" );
 		// TODO: Make a trigger for downloading from server
@@ -38,9 +38,14 @@
 		if( stage.getAttribute( "noauto" ) != null ) return this;
 
 		var applyStructure = function( obj )
+		{
+			return _applyStructure( JSON.parse( obj ).file );
+		};
+
+		var _applyStructure = function( obj )
 		{
 			/** @type {_AstJson_.SiteFile} */
-			var finfo = JSON.parse( obj ).file;
+			var finfo = obj;
 
 			switch( finfo.type )
 			{
@@ -50,16 +55,16 @@
 					switch( IDOMElement(stage).getDAttribute('size') )
 					{
 						case "small":
-							node.src = config.path.image.small + hash + '.jpg';
+							node.src = finfo.thumbs.small || ( config.path.image.small + hash + '.jpg' );
 							break;
 						case "medium":
-							node.src = config.path.image.medium + hash + '.jpg';
+							node.src = finfo.thumbs.medium || ( config.path.image.medium + hash + '.jpg' );
 							break;
 						case "original":
 							node.src = config.path.image.original + hash + '.jpg';
 							break;
 						default: // large
-							node.src = config.path.image.large + hash + '.jpg';
+							node.src = finfo.thumbs.large || ( config.path.image.large + hash + '.jpg' );
 					}
 
 					stage.appendChild(Dand.wrapne(
@@ -134,7 +139,14 @@
 			stage.appendChild( Dand.wrapc( "sf_failed", Dand.textNode( "Error: Failed to get resources info" ) ) );
 		};
 
-		this.loadInfo( applyStructure, loadFailed );
+		if( nObj )
+		{
+			_applyStructure( nObj );
+		}
+		else
+		{
+			this.loadInfo( applyStructure, loadFailed );
+		}
 	};
 
 	SiteFile.prototype.loadInfo = function( success, failed )
diff --git a/botanjs/src/Astro/Bootstrap.css b/botanjs/src/Astro/Bootstrap.css
index e0c7d43..2cfacc6 100644
--- a/botanjs/src/Astro/Bootstrap.css
+++ b/botanjs/src/Astro/Bootstrap.css
@@ -40,7 +40,7 @@
 
 /*{{{ Global Element Styles */
 pre {
-	font-family: monospace;
+	font-family: site-mono;
 }
 
 textarea, input, div[contentEditable="true"], select {
diff --git a/botanjs/src/Astro/Build/Components/BuildList.css b/botanjs/src/Astro/Build/Components/BuildList.css
index 1cf9201..ba5d28e 100644
--- a/botanjs/src/Astro/Build/Components/BuildList.css
+++ b/botanjs/src/Astro/Build/Components/BuildList.css
@@ -1,5 +1,5 @@
 .build-list > a {
-	font-family: monospace;
+	font-family: site-mono;
 
 	display: block;
 
diff --git a/botanjs/src/Astro/Build/Components/BuildReport.css b/botanjs/src/Astro/Build/Components/BuildReport.css
index 97984df..1c1afe3 100644
--- a/botanjs/src/Astro/Build/Components/BuildReport.css
+++ b/botanjs/src/Astro/Build/Components/BuildReport.css
@@ -21,7 +21,7 @@
 .build-status > * .failed { color: darkred; }
 
 .build-commit-message {
-    font-family: monospace;
+    font-family: site-mono;
 	padding: 0.2em 0;
 }
 
diff --git a/botanjs/src/Astro/Build/Page/Index.css b/botanjs/src/Astro/Build/Page/Index.css
index 6e7945f..af4dfb7 100644
--- a/botanjs/src/Astro/Build/Page/Index.css
+++ b/botanjs/src/Astro/Build/Page/Index.css
@@ -1,9 +1,9 @@
-.site-news { font-family: monospace; }
+.site-news { font-family: site-mono; }
 .site-news > span { display: block; }
 
 .rbuilds > a {
 	display: block;
-	font-family: monospace;
+	font-family: site-mono;
 }
 .rbuilds > a > span {
     padding: 0 0.5em;
diff --git a/botanjs/src/Astro/Penguin/Layout/MainFrame.css b/botanjs/src/Astro/Penguin/Layout/MainFrame.css
index edafead..8bfb117 100644
--- a/botanjs/src/Astro/Penguin/Layout/MainFrame.css
+++ b/botanjs/src/Astro/Penguin/Layout/MainFrame.css
@@ -7,7 +7,7 @@ body {
     font-family: custom-sans,Helvetica,Arial,STHeiti,"Microsoft JhengHei","微軟正黑體";
 }
 
-pre { font-family: monospace; }
+pre { font-family: site-mono; }
 
 ::selection {
 	color: white;
@@ -32,7 +32,7 @@ a {
 }
 
 textarea {
-	font-family: monospace;
+	font-family: site-mono;
 }
 
 sup { vertical-align: super; }
diff --git a/botanjs/src/Astro/Penguin/Page/Docs.css b/botanjs/src/Astro/Penguin/Page/Docs.css
index b02f702..3f0320a 100644
--- a/botanjs/src/Astro/Penguin/Page/Docs.css
+++ b/botanjs/src/Astro/Penguin/Page/Docs.css
@@ -1,5 +1,5 @@
 h4 { font-family: custom-sans; }
-h5, h6 { font-family: monospace; }
+h5, h6 { font-family: site-mono; }
 h4 { font-size: 1.5em; }
 h5 { font-size: 1.3em; }
 h6 { font-size: 1.1em; }
diff --git a/botanjs/src/Astro/Starfall/Layout/MainFrame.css b/botanjs/src/Astro/Starfall/Layout/MainFrame.css
index 5e1936b..7bd232b 100644
--- a/botanjs/src/Astro/Starfall/Layout/MainFrame.css
+++ b/botanjs/src/Astro/Starfall/Layout/MainFrame.css
@@ -7,7 +7,7 @@ body {
     font-family: custom-sans,Helvetica,Arial,STHeiti,"Microsoft JhengHei","微軟正黑體";
 }
 
-pre { font-family: monospace; }
+pre { font-family: site-mono; }
 
 ::selection {
 	color: white;
diff --git a/botanjs/src/Components/Console.css b/botanjs/src/Components/Console.css
index 625abb9..a50418e 100644
--- a/botanjs/src/Components/Console.css
+++ b/botanjs/src/Components/Console.css
@@ -8,7 +8,7 @@
 
 .dbg_lastMsg {
 	float: left;
-	font-family: monospace;
+	font-family: site-mono;
 	color: #AAA;
 	font-size: 1em;
 
@@ -67,5 +67,5 @@
 	outline: none;
 	border: none;
 
-    font-family: monospace;
+    font-family: site-mono;
 }
diff --git a/botanjs/src/_this.css b/botanjs/src/_this.css
new file mode 100644
index 0000000..38e417e
--- /dev/null
+++ b/botanjs/src/_this.css
@@ -0,0 +1,8 @@
+@font-face{
+    font-family: site-mono;
+    src: local("Consolas"),
+		local("Bitstream Vera Sans Mono"),
+		local("Courier New"),
+		local("Courier"),
+		local("monospace");
+}
diff --git a/botanjs/src/externs/_AstJson_.SiteFile.js b/botanjs/src/externs/_AstJson_.SiteFile.js
index 0cfbb04..19a329e 100644
--- a/botanjs/src/externs/_AstJson_.SiteFile.js
+++ b/botanjs/src/externs/_AstJson_.SiteFile.js
@@ -19,3 +19,11 @@ _AstJson_.SiteFile.file;
 	_AstJson_.SiteFile.file.type;
 	/** @type {String} */
 	_AstJson_.SiteFile.file.src_location;
+	/** @type {Object} */
+	_AstConf_.SiteFile.thumbes;
+		/** @type {String} */
+		_AstConf_.SiteFile.thumbs.small;
+		/** @type {String} */
+		_AstConf_.SiteFile.thumbs.medium;
+		/** @type {String} */
+		_AstConf_.SiteFile.thumbs.large;
diff --git a/k8s/deployments.yaml b/k8s/deployments.yaml
index 19b250f..d98c869 100644
--- a/k8s/deployments.yaml
+++ b/k8s/deployments.yaml
@@ -26,7 +26,7 @@ spec:
             mountPath: "/app/cache"
       containers:
         - name: web
-          image: registry.k8s.astropenguin.net/astrojs:2022.04.05
+          image: registry.k8s.astropenguin.net/astrojs:2022.04.05.03
           securityContext:
             runAsGroup: 1001
             runAsNonRoot: true
@@ -50,7 +50,7 @@ spec:
         - name: redis
           image: redis:6.0.8-alpine
         - name: compiler
-          image: registry.k8s.astropenguin.net/astrojs:2022.04.05
+          image: registry.k8s.astropenguin.net/astrojs:2022.04.05.03
           securityContext:
             runAsGroup: 1001
             runAsNonRoot: true
diff --git a/settings.ini b/settings.ini
index ab9f7d0..ee0ab29 100644
--- a/settings.ini
+++ b/settings.ini
@@ -5,6 +5,9 @@ Port = 5000
 [Env]
 Debug = False
 
+[Redis]
+ConnStr = redis://:@localhost:6379/9
+
 [Paths]
 Runtime = ${SiteRoot}
 Log = ${SiteRoot}/logs
@@ -13,7 +16,7 @@ Cache = ${SiteRoot}/cache
 [BotanJS]
 SrcDir = ${Paths:Runtime}/botanjs/src
 
-CeleryBroker = redis://:@localhost:6379/9
+CeleryBroker = ${Redis:ConnStr}
 
 ClosureCompiler = /opt/utils/closure.jar
 YuiCompressor = /opt/utils/yuicompressor.jar
diff --git a/windows/app/Dockerfile b/windows/app/Dockerfile
index 0fe3578..3ae5cc7 100644
--- a/windows/app/Dockerfile
+++ b/windows/app/Dockerfile
@@ -2,11 +2,13 @@ FROM astrojs/jre-nanoserver-20h2:latest
 
 RUN pip3 install Flask redis compressinja celery
 
-RUN New-Item -ItemType "Directory" -Path /opt/utils; \
-    New-Item -ItemType "Directory" -Path /app; \
+RUN New-Item -ItemType Directory -Path /opt/utils; \
+    New-Item -ItemType Directory -Path /app/cache -Force; \
     [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12; \
     Invoke-WebRequest -UseBasicParsing -Uri 'https://github.com/tgckpg/BotanJS/releases/download/compressors/closure.jar' -OutFile '/opt/utils/closure.jar' ; \
     Invoke-WebRequest -UseBasicParsing -Uri 'https://github.com/tgckpg/BotanJS/releases/download/compressors/yuicompressor.jar' -OutFile '/opt/utils/yuicompressor.jar' ;
 
-EXPOSE 5000
+COPY . /app
 WORKDIR /app
+
+EXPOSE 5000
diff --git a/windows/base-compose.yml b/windows/base-compose.yml
new file mode 100644
index 0000000..cb2fa41
--- /dev/null
+++ b/windows/base-compose.yml
@@ -0,0 +1,9 @@
+version: '3.9'
+
+services:
+  python:
+    build: pyrt
+    image: astrojs/pyrt-nanoserver-20h2
+  jre:
+    build: jre 
+    image: astrojs/jre-nanoserver-20h2
diff --git a/windows/docker-compose.yml b/windows/docker-compose.yml
index 7149d26..2426b8e 100644
--- a/windows/docker-compose.yml
+++ b/windows/docker-compose.yml
@@ -1,12 +1,6 @@
 version: '3.9'
 
 services:
-  python:
-    build: pyrt
-    image: astrojs/pyrt-nanoserver-20h2
-  jre:
-    build: jre 
-    image: astrojs/jre-nanoserver-20h2
   redis:
     container_name: astrojsdev_redis
     build: redis
@@ -17,23 +11,25 @@ services:
     build:
       context: ../
       dockerfile: windows/app/Dockerfile
+    environment:
+      REDIS_CONN: redis://:@redis:6379/9
     command: [ "python", "main.py" ] # [ "ping", "127.0.0.1", "-n", "9999" ]
     depends_on:
       - redis
     ports:
       - 5000:5000
     volumes:
-      - ../:C:/app
+      - cache:C:/app/cache
   tasks:
     container_name: astrojsdev_compiler
     image: astrojs/app
+    environment:
+      REDIS_CONN: redis://:@redis:6379/9
     command: [ "celery", "-A", "botanjs.service.jwork", "worker", "-l", "info", "--pool=solo" ]
     depends_on:
       - redis
       - web
     volumes:
-      - ../:C:/app
-
+      - cache:C:/app/cache
 volumes:
   cache:
-  temp: