From 04f85aadcdcb6b7b99b331c92a5ab56dcf8946c4 Mon Sep 17 00:00:00 2001 From: javalikescript Date: Sun, 12 Jan 2025 10:46:42 +0100 Subject: [PATCH] Add extension info --- extensions/web-base/www/app.html | 19 ++++++++++++++ extensions/web-base/www/app/extensions.js | 20 +++++++++++++++ lha/Extension.lua | 4 +++ lha/restEngine.lua | 30 +++++++++++++++++++++++ lha/schema-extension.json | 4 +++ 5 files changed, 77 insertions(+) diff --git a/extensions/web-base/www/app.html b/extensions/web-base/www/app.html index 159dd1d..cd56360 100644 --- a/extensions/web-base/www/app.html +++ b/extensions/web-base/www/app.html @@ -205,6 +205,7 @@ +
@@ -217,6 +218,21 @@
+ + + +
+

{{ info.name }}

+

{{ info.description }}

+

Version: {{ info.version }}

+
+
+
+
+
+
@@ -231,6 +247,9 @@
+

{{ extension.info.name }}

diff --git a/extensions/web-base/www/app/extensions.js b/extensions/web-base/www/app/extensions.js index 68e2def..f5caa46 100644 --- a/extensions/web-base/www/app/extensions.js +++ b/extensions/web-base/www/app/extensions.js @@ -118,6 +118,26 @@ new Vue({ } }); +new Vue({ + el: '#extension-info', + data: { + info: {}, + readme: '' + }, + methods: { + onShow: function(extensionId) { + this.readme = ''; + this.info = {}; + fetch('/engine/extensions/' + extensionId + '/info').then(assertIsOk).then(getJson).then(function(info) { + this.info = info; + return fetch('/engine/extensions/' + extensionId + '/readme'); + }.bind(this)).then(rejectIfNotOk).then(getResponseText).then(function(content) { + this.readme = content; + }.bind(this)); + } + } +}); + new Vue({ el: '#addExtensions', data: { diff --git a/lha/Extension.lua b/lha/Extension.lua index 14058a7..fa32a76 100644 --- a/lha/Extension.lua +++ b/lha/Extension.lua @@ -121,6 +121,10 @@ return require('jls.lang.class').create(require('jls.util.EventPublisher'), func return self.manifest.version or '1.0' end + function extension:readme() + return self.manifest.readme or 'readme.md' + end + function extension:isActive() return self.loaded and self.configuration.active end diff --git a/lha/restEngine.lua b/lha/restEngine.lua index f09f46a..e02adaf 100644 --- a/lha/restEngine.lua +++ b/lha/restEngine.lua @@ -3,6 +3,7 @@ local Logger = rootLogger:getClass() local logger = rootLogger:get(...) local system = require('jls.lang.system') local event = require('jls.lang.event') +local loader = require('jls.lang.loader') local File = require('jls.io.File') local HTTP_CONST = require('jls.net.http.HttpMessage').CONST local RestHttpHandler = require('jls.net.http.handler.RestHttpHandler') @@ -13,6 +14,8 @@ local Map = require('jls.util.Map') local ZipFile = require('jls.util.zip.ZipFile') local Promise = require('jls.lang.Promise') +local md = loader.tryRequire('md') + local utils = require('lha.utils') local engineSchema = utils.requireJson('lha.schema').properties.config.properties.engine @@ -124,6 +127,33 @@ local REST_EXTENSIONS = { manifest = function(exchange) return exchange.attributes.extension:getManifest() end, + ['readme(extension)'] = function(exchange, extension) + local readme = File:new(extension:getDir(), extension:readme()) + if not readme:isFile() then + HttpExchange.notFound(exchange) + return false + end + local readmeExt = string.lower(readme:getExtension()) + local content = readme:readAll() + if readmeExt == 'md' then + if md then + content = md.render(content) + else + content = '
'..content..'
' + end + elseif readmeExt == 'txt' then + content = '
'..content..'
' + elseif not (readmeExt == 'html' or readmeExt == 'htm') then + HttpExchange.notFound(exchange) + return false + end + local response = exchange:getResponse() + response:setStatusCode(HTTP_CONST.HTTP_OK, 'OK') + response:setContentType('text/html') + response:setContentLength(#content) + response:setBody(content) + return false + end, ['poll(extension)?method=POST'] = function(exchange, extension) if extension:isActive() then extension:publishEvent('poll') diff --git a/lha/schema-extension.json b/lha/schema-extension.json index 51049f1..6997a64 100644 --- a/lha/schema-extension.json +++ b/lha/schema-extension.json @@ -16,6 +16,10 @@ "title": "The description of the extension", "type": "string" }, + "readme": { + "title": "The file documenting the extension", + "type": "string" + }, "name": { "title": "The name of the extension", "type": "string"