forked from FINAKON/HelpProject
1. Initial Commit - a boiler plate code and POC to realize the concept of context sensitive help 2. Frontend code written in ReactJS 3. Backend code written in Java, Spring Boot Framework 4. Frontend Start: pre-requisites : node, npm npm run dev ==> to start the frontend vite server 5. Backend Start: pre-requisites : java, mvn mvn spring-boot:run ==> to start the backend server 6. Visit http://localhost:5173/ for basic demo of help, press F1 in textboxes 7. Visit http://localhost:5173/editor and enter "admin123" to add/modify texts. Happy Coding !!! Thank you, Bhargava.
144 lines
3.2 KiB
JavaScript
144 lines
3.2 KiB
JavaScript
/**
|
|
* @import {
|
|
* Extension,
|
|
* Handles,
|
|
* HtmlExtension,
|
|
* NormalizedExtension
|
|
* } from 'micromark-util-types'
|
|
*/
|
|
|
|
import {splice} from 'micromark-util-chunked'
|
|
|
|
const hasOwnProperty = {}.hasOwnProperty
|
|
|
|
/**
|
|
* Combine multiple syntax extensions into one.
|
|
*
|
|
* @param {ReadonlyArray<Extension>} extensions
|
|
* List of syntax extensions.
|
|
* @returns {NormalizedExtension}
|
|
* A single combined extension.
|
|
*/
|
|
export function combineExtensions(extensions) {
|
|
/** @type {NormalizedExtension} */
|
|
const all = {}
|
|
let index = -1
|
|
|
|
while (++index < extensions.length) {
|
|
syntaxExtension(all, extensions[index])
|
|
}
|
|
|
|
return all
|
|
}
|
|
|
|
/**
|
|
* Merge `extension` into `all`.
|
|
*
|
|
* @param {NormalizedExtension} all
|
|
* Extension to merge into.
|
|
* @param {Extension} extension
|
|
* Extension to merge.
|
|
* @returns {undefined}
|
|
* Nothing.
|
|
*/
|
|
function syntaxExtension(all, extension) {
|
|
/** @type {keyof Extension} */
|
|
let hook
|
|
|
|
for (hook in extension) {
|
|
const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined
|
|
/** @type {Record<string, unknown>} */
|
|
const left = maybe || (all[hook] = {})
|
|
/** @type {Record<string, unknown> | undefined} */
|
|
const right = extension[hook]
|
|
/** @type {string} */
|
|
let code
|
|
|
|
if (right) {
|
|
for (code in right) {
|
|
if (!hasOwnProperty.call(left, code)) left[code] = []
|
|
const value = right[code]
|
|
constructs(
|
|
// @ts-expect-error Looks like a list.
|
|
left[code],
|
|
Array.isArray(value) ? value : value ? [value] : []
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Merge `list` into `existing` (both lists of constructs).
|
|
* Mutates `existing`.
|
|
*
|
|
* @param {Array<unknown>} existing
|
|
* List of constructs to merge into.
|
|
* @param {Array<unknown>} list
|
|
* List of constructs to merge.
|
|
* @returns {undefined}
|
|
* Nothing.
|
|
*/
|
|
function constructs(existing, list) {
|
|
let index = -1
|
|
/** @type {Array<unknown>} */
|
|
const before = []
|
|
|
|
while (++index < list.length) {
|
|
// @ts-expect-error Looks like an object.
|
|
;(list[index].add === 'after' ? existing : before).push(list[index])
|
|
}
|
|
|
|
splice(existing, 0, 0, before)
|
|
}
|
|
|
|
/**
|
|
* Combine multiple HTML extensions into one.
|
|
*
|
|
* @param {ReadonlyArray<HtmlExtension>} htmlExtensions
|
|
* List of HTML extensions.
|
|
* @returns {HtmlExtension}
|
|
* Single combined HTML extension.
|
|
*/
|
|
export function combineHtmlExtensions(htmlExtensions) {
|
|
/** @type {HtmlExtension} */
|
|
const handlers = {}
|
|
let index = -1
|
|
|
|
while (++index < htmlExtensions.length) {
|
|
htmlExtension(handlers, htmlExtensions[index])
|
|
}
|
|
|
|
return handlers
|
|
}
|
|
|
|
/**
|
|
* Merge `extension` into `all`.
|
|
*
|
|
* @param {HtmlExtension} all
|
|
* Extension to merge into.
|
|
* @param {HtmlExtension} extension
|
|
* Extension to merge.
|
|
* @returns {undefined}
|
|
* Nothing.
|
|
*/
|
|
function htmlExtension(all, extension) {
|
|
/** @type {keyof HtmlExtension} */
|
|
let hook
|
|
|
|
for (hook in extension) {
|
|
const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined
|
|
const left = maybe || (all[hook] = {})
|
|
const right = extension[hook]
|
|
/** @type {keyof Handles} */
|
|
let type
|
|
|
|
if (right) {
|
|
for (type in right) {
|
|
// @ts-expect-error assume document vs regular handler are managed correctly.
|
|
left[type] = right[type]
|
|
}
|
|
}
|
|
}
|
|
}
|