@kui-shell/plugin-client-common
Version:
Kui plugin that offers stylesheets
234 lines (233 loc) • 8.15 kB
JavaScript
/*
* Copyright 2020 The Kubernetes Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { basename } from 'path';
import fetchMarkdownFile, { join } from './fetch';
/**
* commentary command usage
*/
/* const usage: UsageModel = {
command: 'commentary',
strict: 'commentary',
example: 'commentary -f [<markdown file path>]',
docs: 'Commentary',
optional: [
{
name: '--title',
alias: '-t',
docs: 'Title for the commentary'
},
{
name: '--base-url',
alias: '-b',
docs: 'Base URL for images'
},
{
name: '--edit',
docs: 'Open the UI in edit mode'
},
{
name: '--header',
docs: 'Show header text [Default: true]'
},
{
name: '--preview',
docs: 'Show a preview while editing [Default: true]'
},
{
name: '--readonly',
docs: 'Set the enclosing tab to be readonly'
},
{
name: '--send',
docs: 'Send edits to this channel (implies --no-header and --no-preview)'
},
{
name: '--receive',
docs: 'Consume edits from this channel (implies --no-header and --no-edit)'
},
{
name: '--replace',
docs: 'Replace all existing content in this tab'
},
{
name: '--file',
alias: '-f',
docs: 'File that contains the texts'
}
]
} */
function formatBaseUrl(filepath) {
return __awaiter(this, void 0, void 0, function* () {
if (/^http:/.test(filepath)) {
const { format } = yield import('url');
const url = new URL(filepath);
url.pathname = url.pathname.replace(basename(url.pathname), '{filename}');
return format(url);
}
else {
return filepath.replace(basename(filepath), '{filename}');
}
});
}
/** TODO: move to core Tab api? */
export function setTabReadonly({ tab }) {
return __awaiter(this, void 0, void 0, function* () {
const [{ eventBus }, { getPrimaryTabId }] = yield Promise.all([
import('@kui-shell/core/mdist/api/Events'),
import('@kui-shell/core/mdist/api/Tab')
]);
eventBus.emitWithTabId('/kui/tab/edit/unset', getPrimaryTabId(tab));
});
}
function addComment(args) {
return __awaiter(this, void 0, void 0, function* () {
const { edit: _edit, header: _header, preview: _preview, 'snippet-base-path': snippetBasePath, receive, send, title, readonly, replace, simple } = args.parsedOptions;
const filepath = args.parsedOptions.file || args.parsedOptions.f;
const edit = receive !== undefined ? false : send !== undefined ? true : _edit;
const header = receive !== undefined || send !== undefined ? false : _header;
const preview = send !== undefined ? false : receive !== undefined ? true : _preview;
// the markdown data either comes from a file, or directly from the
// command line
const { data = '#', codeBlockResponses } = filepath
? yield fetchMarkdownFile(filepath, args) // from file
: {
data: args.command // directly from command line
.trim()
.slice(args.command.indexOf(' ') + 1)
.trim()
.replace(/\\n/g, '\n')
.replace(/\\t/g, '\t')
.replace(/--(no-)?(header|edit|preview|readonly|replace)\s*/g, '')
.replace(/(-t|--title|--send|--receive)\s+\S+\s*/g, '')
.replace(/^\\#/, '#') // escaped initial comment -> h1
// this isn't perfect; e.g. it doesn't handle `commentary "hello" "world`; but it's a start
.replace(/^"/, '')
.replace(/"$/, ''),
codeBlockResponses: undefined
};
if (filepath && readonly) {
setTabReadonly(args);
}
const baseUrl = args.parsedOptions['base-url']
? join(args.parsedOptions['base-url'], '{filename}')
: filepath
? yield formatBaseUrl(filepath)
: undefined;
if (data !== undefined) {
if (data === '#' || args.command === 'commentary') {
return {
apiVersion: 'kui-shell/v1',
kind: 'CommentaryResponse',
props: {
edit,
header,
preview,
replace,
receive,
send,
simple,
snippetBasePath,
title,
children: '',
baseUrl
}
};
}
else {
return {
apiVersion: 'kui-shell/v1',
kind: 'CommentaryResponse',
props: {
edit,
header,
preview,
replace,
receive,
send,
simple,
snippetBasePath,
title,
filepath,
children: data,
codeBlockResponses,
baseUrl
}
};
}
}
else {
throw new Error('Insufficient arguments: must specify either --file or -f, or provide a comment on the command line');
}
});
}
/**
* This delegate is helpful to wrap the rendering of a given markdown
* `filepath` in a maximized view that is injected as a replacement
* for the current view.
*/
function delegate(args) {
const delegate = args.argvNoOptions[2];
const filepath = args.argvNoOptions[3];
if (!delegate || !filepath) {
throw new Error('Usage: commentary delegate <filepath>');
}
const children = `
---
layout:
1:
position: default
maximized: true
---
\`\`\`shell
---
execute: now
outputOnly: true
maximize: true
---
${delegate} ${args.REPL.encodeComponent(filepath)}
\`\`\`
`;
return {
apiVersion: 'kui-shell/v1',
kind: 'CommentaryResponse',
props: {
replace: true,
children
}
};
}
/**
* This plugin introduces the commentary command
*
*/
export default function registerCommentaryController(commandTree) {
const flags = {
boolean: ['edit', 'header', 'preview', 'readonly', 'replace', 'simple']
};
commandTree.listen('/commentary', addComment, { outputOnly: true, flags });
commandTree.listen('/#', addComment, { outputOnly: true, noCoreRedirect: true, flags });
commandTree.listen('/commentary/delegate', delegate, { outputOnly: true, needsUI: true });
}
//# sourceMappingURL=commentary.js.map