{{ info.name }}
+{{ info.description }}
+Version: {{ info.version }}
+{{ 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"