plugin-build-guide-block 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node_modules/sanitize-html/LICENSE +7 -0
- package/dist/node_modules/sanitize-html/index.js +7 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/index.browser.cjs +34 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/index.browser.js +34 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/index.cjs +35 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/index.d.ts +56 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/index.js +35 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/index.native.js +26 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/async/package.json +12 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/bin/nanoid.cjs +55 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/index.browser.cjs +34 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/index.browser.js +34 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/index.cjs +45 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/index.d.cts +91 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/index.d.ts +91 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/index.js +45 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/nanoid.js +1 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/non-secure/index.cjs +21 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/non-secure/index.d.ts +33 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/non-secure/index.js +21 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/non-secure/package.json +6 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/package.json +88 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/url-alphabet/index.cjs +3 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/url-alphabet/index.js +3 -0
- package/dist/node_modules/sanitize-html/node_modules/nanoid/url-alphabet/package.json +6 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/at-rule.d.ts +115 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/at-rule.js +25 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/comment.d.ts +67 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/comment.js +13 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/container.d.ts +452 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/container.js +439 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/css-syntax-error.d.ts +248 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/css-syntax-error.js +100 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/declaration.d.ts +148 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/declaration.js +24 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/document.d.ts +68 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/document.js +33 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/fromJSON.d.ts +9 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/fromJSON.js +54 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/input.d.ts +194 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/input.js +248 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/lazy-result.d.ts +190 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/lazy-result.js +550 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/list.d.ts +57 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/list.js +58 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/map-generator.js +359 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/no-work-result.d.ts +46 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/no-work-result.js +135 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/node.d.ts +536 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/node.js +381 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/parse.d.ts +9 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/parse.js +42 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/parser.js +610 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/postcss.d.mts +72 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/postcss.d.ts +441 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/postcss.js +101 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/previous-map.d.ts +81 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/previous-map.js +142 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/processor.d.ts +115 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/processor.js +67 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/result.d.ts +206 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/result.js +42 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/root.d.ts +86 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/root.js +61 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/rule.d.ts +113 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/rule.js +27 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/stringifier.d.ts +46 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/stringifier.js +353 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/stringify.d.ts +9 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/stringify.js +11 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/symbols.js +5 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/terminal-highlight.js +70 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/tokenize.js +266 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/warn-once.js +13 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/warning.d.ts +147 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/lib/warning.js +37 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/node_modules/.bin/nanoid +15 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/node_modules/.bin/nanoid.cmd +7 -0
- package/dist/node_modules/sanitize-html/node_modules/postcss/package.json +88 -0
- package/dist/node_modules/sanitize-html/package.json +1 -0
- package/package.json +9 -1
- package/src/client/UserGuideBlock.tsx +53 -0
- package/src/client/UserGuideBlockInitializer.tsx +26 -0
- package/src/client/UserGuideBlockProvider.tsx +12 -0
- package/src/client/UserGuideManager.tsx +133 -0
- package/src/client/client.d.ts +249 -0
- package/src/client/components/BuildButton.tsx +43 -0
- package/src/client/components/LLMServiceSelect.tsx +44 -0
- package/src/client/components/ModelSelect.tsx +41 -0
- package/src/client/components/StatusTag.tsx +17 -0
- package/src/client/index.tsx +1 -0
- package/src/client/models/UserGuideBlockModel.ts +47 -0
- package/src/client/models/index.ts +12 -0
- package/src/client/plugin.tsx +30 -0
- package/src/client/schemas/spacesSchema.ts +305 -0
- package/src/index.ts +2 -0
- package/src/locale/en-US.json +27 -0
- package/src/locale/vi-VN.json +27 -0
- package/src/locale/zh-CN.json +27 -0
- package/src/server/actions/build.ts +171 -0
- package/src/server/actions/getHtml.ts +26 -0
- package/src/server/collections/.gitkeep +0 -0
- package/src/server/collections/ai-build-guide-spaces.ts +49 -0
- package/src/server/index.ts +1 -0
- package/src/server/plugin.ts +42 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
let Container = require('./container')
|
|
4
|
+
|
|
5
|
+
let LazyResult, Processor
|
|
6
|
+
|
|
7
|
+
class Root extends Container {
|
|
8
|
+
constructor(defaults) {
|
|
9
|
+
super(defaults)
|
|
10
|
+
this.type = 'root'
|
|
11
|
+
if (!this.nodes) this.nodes = []
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
normalize(child, sample, type) {
|
|
15
|
+
let nodes = super.normalize(child)
|
|
16
|
+
|
|
17
|
+
if (sample) {
|
|
18
|
+
if (type === 'prepend') {
|
|
19
|
+
if (this.nodes.length > 1) {
|
|
20
|
+
sample.raws.before = this.nodes[1].raws.before
|
|
21
|
+
} else {
|
|
22
|
+
delete sample.raws.before
|
|
23
|
+
}
|
|
24
|
+
} else if (this.first !== sample) {
|
|
25
|
+
for (let node of nodes) {
|
|
26
|
+
node.raws.before = sample.raws.before
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return nodes
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
removeChild(child, ignore) {
|
|
35
|
+
let index = this.index(child)
|
|
36
|
+
|
|
37
|
+
if (!ignore && index === 0 && this.nodes.length > 1) {
|
|
38
|
+
this.nodes[1].raws.before = this.nodes[index].raws.before
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return super.removeChild(child)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
toResult(opts = {}) {
|
|
45
|
+
let lazy = new LazyResult(new Processor(), this, opts)
|
|
46
|
+
return lazy.stringify()
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Root.registerLazyResult = dependant => {
|
|
51
|
+
LazyResult = dependant
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Root.registerProcessor = dependant => {
|
|
55
|
+
Processor = dependant
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = Root
|
|
59
|
+
Root.default = Root
|
|
60
|
+
|
|
61
|
+
Container.registerRoot(Root)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import Container, { ContainerProps } from './container.js'
|
|
2
|
+
|
|
3
|
+
declare namespace Rule {
|
|
4
|
+
export interface RuleRaws extends Record<string, unknown> {
|
|
5
|
+
/**
|
|
6
|
+
* The space symbols after the last child of the node to the end of the node.
|
|
7
|
+
*/
|
|
8
|
+
after?: string
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The space symbols before the node. It also stores `*`
|
|
12
|
+
* and `_` symbols before the declaration (IE hack).
|
|
13
|
+
*/
|
|
14
|
+
before?: string
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The symbols between the selector and `{` for rules.
|
|
18
|
+
*/
|
|
19
|
+
between?: string
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Contains `true` if there is semicolon after rule.
|
|
23
|
+
*/
|
|
24
|
+
ownSemicolon?: string
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The rule’s selector with comments.
|
|
28
|
+
*/
|
|
29
|
+
selector?: {
|
|
30
|
+
raw: string
|
|
31
|
+
value: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Contains `true` if the last child has an (optional) semicolon.
|
|
36
|
+
*/
|
|
37
|
+
semicolon?: boolean
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface RuleProps extends ContainerProps {
|
|
41
|
+
/** Information used to generate byte-to-byte equal node string as it was in the origin input. */
|
|
42
|
+
raws?: RuleRaws
|
|
43
|
+
/** Selector or selectors of the rule. */
|
|
44
|
+
selector?: string
|
|
45
|
+
/** Selectors of the rule represented as an array of strings. */
|
|
46
|
+
selectors?: string[]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
50
|
+
export { Rule_ as default }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Represents a CSS rule: a selector followed by a declaration block.
|
|
55
|
+
*
|
|
56
|
+
* ```js
|
|
57
|
+
* Once (root, { Rule }) {
|
|
58
|
+
* let a = new Rule({ selector: 'a' })
|
|
59
|
+
* a.append(…)
|
|
60
|
+
* root.append(a)
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* ```js
|
|
65
|
+
* const root = postcss.parse('a{}')
|
|
66
|
+
* const rule = root.first
|
|
67
|
+
* rule.type //=> 'rule'
|
|
68
|
+
* rule.toString() //=> 'a{}'
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
declare class Rule_ extends Container {
|
|
72
|
+
parent: Container | undefined
|
|
73
|
+
raws: Rule.RuleRaws
|
|
74
|
+
/**
|
|
75
|
+
* The rule’s full selector represented as a string.
|
|
76
|
+
*
|
|
77
|
+
* ```js
|
|
78
|
+
* const root = postcss.parse('a, b { }')
|
|
79
|
+
* const rule = root.first
|
|
80
|
+
* rule.selector //=> 'a, b'
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
selector: string
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* An array containing the rule’s individual selectors.
|
|
87
|
+
* Groups of selectors are split at commas.
|
|
88
|
+
*
|
|
89
|
+
* ```js
|
|
90
|
+
* const root = postcss.parse('a, b { }')
|
|
91
|
+
* const rule = root.first
|
|
92
|
+
*
|
|
93
|
+
* rule.selector //=> 'a, b'
|
|
94
|
+
* rule.selectors //=> ['a', 'b']
|
|
95
|
+
*
|
|
96
|
+
* rule.selectors = ['a', 'strong']
|
|
97
|
+
* rule.selector //=> 'a, strong'
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
selectors: string[]
|
|
101
|
+
|
|
102
|
+
type: 'rule'
|
|
103
|
+
|
|
104
|
+
constructor(defaults?: Rule.RuleProps)
|
|
105
|
+
assign(overrides: object | Rule.RuleProps): this
|
|
106
|
+
clone(overrides?: Partial<Rule.RuleProps>): Rule
|
|
107
|
+
cloneAfter(overrides?: Partial<Rule.RuleProps>): Rule
|
|
108
|
+
cloneBefore(overrides?: Partial<Rule.RuleProps>): Rule
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
declare class Rule extends Rule_ {}
|
|
112
|
+
|
|
113
|
+
export = Rule
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
let Container = require('./container')
|
|
4
|
+
let list = require('./list')
|
|
5
|
+
|
|
6
|
+
class Rule extends Container {
|
|
7
|
+
constructor(defaults) {
|
|
8
|
+
super(defaults)
|
|
9
|
+
this.type = 'rule'
|
|
10
|
+
if (!this.nodes) this.nodes = []
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
get selectors() {
|
|
14
|
+
return list.comma(this.selector)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
set selectors(values) {
|
|
18
|
+
let match = this.selector ? this.selector.match(/,\s*/) : null
|
|
19
|
+
let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')
|
|
20
|
+
this.selector = values.join(sep)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = Rule
|
|
25
|
+
Rule.default = Rule
|
|
26
|
+
|
|
27
|
+
Container.registerRule(Rule)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AnyNode,
|
|
3
|
+
AtRule,
|
|
4
|
+
Builder,
|
|
5
|
+
Comment,
|
|
6
|
+
Container,
|
|
7
|
+
Declaration,
|
|
8
|
+
Document,
|
|
9
|
+
Root,
|
|
10
|
+
Rule
|
|
11
|
+
} from './postcss.js'
|
|
12
|
+
|
|
13
|
+
declare namespace Stringifier {
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
15
|
+
export { Stringifier_ as default }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare class Stringifier_ {
|
|
19
|
+
builder: Builder
|
|
20
|
+
constructor(builder: Builder)
|
|
21
|
+
atrule(node: AtRule, semicolon?: boolean): void
|
|
22
|
+
beforeAfter(node: AnyNode, detect: 'after' | 'before'): string
|
|
23
|
+
block(node: AnyNode, start: string): void
|
|
24
|
+
body(node: Container): void
|
|
25
|
+
comment(node: Comment): void
|
|
26
|
+
decl(node: Declaration, semicolon?: boolean): void
|
|
27
|
+
document(node: Document): void
|
|
28
|
+
raw(node: AnyNode, own: null | string, detect?: string): string
|
|
29
|
+
rawBeforeClose(root: Root): string | undefined
|
|
30
|
+
rawBeforeComment(root: Root, node: Comment): string | undefined
|
|
31
|
+
rawBeforeDecl(root: Root, node: Declaration): string | undefined
|
|
32
|
+
rawBeforeOpen(root: Root): string | undefined
|
|
33
|
+
rawBeforeRule(root: Root): string | undefined
|
|
34
|
+
rawColon(root: Root): string | undefined
|
|
35
|
+
rawEmptyBody(root: Root): string | undefined
|
|
36
|
+
rawIndent(root: Root): string | undefined
|
|
37
|
+
rawSemicolon(root: Root): boolean | undefined
|
|
38
|
+
rawValue(node: AnyNode, prop: string): string
|
|
39
|
+
root(node: Root): void
|
|
40
|
+
rule(node: Rule): void
|
|
41
|
+
stringify(node: AnyNode, semicolon?: boolean): void
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare class Stringifier extends Stringifier_ {}
|
|
45
|
+
|
|
46
|
+
export = Stringifier
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const DEFAULT_RAW = {
|
|
4
|
+
after: '\n',
|
|
5
|
+
beforeClose: '\n',
|
|
6
|
+
beforeComment: '\n',
|
|
7
|
+
beforeDecl: '\n',
|
|
8
|
+
beforeOpen: ' ',
|
|
9
|
+
beforeRule: '\n',
|
|
10
|
+
colon: ': ',
|
|
11
|
+
commentLeft: ' ',
|
|
12
|
+
commentRight: ' ',
|
|
13
|
+
emptyBody: '',
|
|
14
|
+
indent: ' ',
|
|
15
|
+
semicolon: false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function capitalize(str) {
|
|
19
|
+
return str[0].toUpperCase() + str.slice(1)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
class Stringifier {
|
|
23
|
+
constructor(builder) {
|
|
24
|
+
this.builder = builder
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
atrule(node, semicolon) {
|
|
28
|
+
let name = '@' + node.name
|
|
29
|
+
let params = node.params ? this.rawValue(node, 'params') : ''
|
|
30
|
+
|
|
31
|
+
if (typeof node.raws.afterName !== 'undefined') {
|
|
32
|
+
name += node.raws.afterName
|
|
33
|
+
} else if (params) {
|
|
34
|
+
name += ' '
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (node.nodes) {
|
|
38
|
+
this.block(node, name + params)
|
|
39
|
+
} else {
|
|
40
|
+
let end = (node.raws.between || '') + (semicolon ? ';' : '')
|
|
41
|
+
this.builder(name + params + end, node)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
beforeAfter(node, detect) {
|
|
46
|
+
let value
|
|
47
|
+
if (node.type === 'decl') {
|
|
48
|
+
value = this.raw(node, null, 'beforeDecl')
|
|
49
|
+
} else if (node.type === 'comment') {
|
|
50
|
+
value = this.raw(node, null, 'beforeComment')
|
|
51
|
+
} else if (detect === 'before') {
|
|
52
|
+
value = this.raw(node, null, 'beforeRule')
|
|
53
|
+
} else {
|
|
54
|
+
value = this.raw(node, null, 'beforeClose')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let buf = node.parent
|
|
58
|
+
let depth = 0
|
|
59
|
+
while (buf && buf.type !== 'root') {
|
|
60
|
+
depth += 1
|
|
61
|
+
buf = buf.parent
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (value.includes('\n')) {
|
|
65
|
+
let indent = this.raw(node, null, 'indent')
|
|
66
|
+
if (indent.length) {
|
|
67
|
+
for (let step = 0; step < depth; step++) value += indent
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return value
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
block(node, start) {
|
|
75
|
+
let between = this.raw(node, 'between', 'beforeOpen')
|
|
76
|
+
this.builder(start + between + '{', node, 'start')
|
|
77
|
+
|
|
78
|
+
let after
|
|
79
|
+
if (node.nodes && node.nodes.length) {
|
|
80
|
+
this.body(node)
|
|
81
|
+
after = this.raw(node, 'after')
|
|
82
|
+
} else {
|
|
83
|
+
after = this.raw(node, 'after', 'emptyBody')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (after) this.builder(after)
|
|
87
|
+
this.builder('}', node, 'end')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
body(node) {
|
|
91
|
+
let last = node.nodes.length - 1
|
|
92
|
+
while (last > 0) {
|
|
93
|
+
if (node.nodes[last].type !== 'comment') break
|
|
94
|
+
last -= 1
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let semicolon = this.raw(node, 'semicolon')
|
|
98
|
+
for (let i = 0; i < node.nodes.length; i++) {
|
|
99
|
+
let child = node.nodes[i]
|
|
100
|
+
let before = this.raw(child, 'before')
|
|
101
|
+
if (before) this.builder(before)
|
|
102
|
+
this.stringify(child, last !== i || semicolon)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
comment(node) {
|
|
107
|
+
let left = this.raw(node, 'left', 'commentLeft')
|
|
108
|
+
let right = this.raw(node, 'right', 'commentRight')
|
|
109
|
+
this.builder('/*' + left + node.text + right + '*/', node)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
decl(node, semicolon) {
|
|
113
|
+
let between = this.raw(node, 'between', 'colon')
|
|
114
|
+
let string = node.prop + between + this.rawValue(node, 'value')
|
|
115
|
+
|
|
116
|
+
if (node.important) {
|
|
117
|
+
string += node.raws.important || ' !important'
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (semicolon) string += ';'
|
|
121
|
+
this.builder(string, node)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
document(node) {
|
|
125
|
+
this.body(node)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
raw(node, own, detect) {
|
|
129
|
+
let value
|
|
130
|
+
if (!detect) detect = own
|
|
131
|
+
|
|
132
|
+
// Already had
|
|
133
|
+
if (own) {
|
|
134
|
+
value = node.raws[own]
|
|
135
|
+
if (typeof value !== 'undefined') return value
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let parent = node.parent
|
|
139
|
+
|
|
140
|
+
if (detect === 'before') {
|
|
141
|
+
// Hack for first rule in CSS
|
|
142
|
+
if (!parent || (parent.type === 'root' && parent.first === node)) {
|
|
143
|
+
return ''
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// `root` nodes in `document` should use only their own raws
|
|
147
|
+
if (parent && parent.type === 'document') {
|
|
148
|
+
return ''
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Floating child without parent
|
|
153
|
+
if (!parent) return DEFAULT_RAW[detect]
|
|
154
|
+
|
|
155
|
+
// Detect style by other nodes
|
|
156
|
+
let root = node.root()
|
|
157
|
+
if (!root.rawCache) root.rawCache = {}
|
|
158
|
+
if (typeof root.rawCache[detect] !== 'undefined') {
|
|
159
|
+
return root.rawCache[detect]
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (detect === 'before' || detect === 'after') {
|
|
163
|
+
return this.beforeAfter(node, detect)
|
|
164
|
+
} else {
|
|
165
|
+
let method = 'raw' + capitalize(detect)
|
|
166
|
+
if (this[method]) {
|
|
167
|
+
value = this[method](root, node)
|
|
168
|
+
} else {
|
|
169
|
+
root.walk(i => {
|
|
170
|
+
value = i.raws[own]
|
|
171
|
+
if (typeof value !== 'undefined') return false
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (typeof value === 'undefined') value = DEFAULT_RAW[detect]
|
|
177
|
+
|
|
178
|
+
root.rawCache[detect] = value
|
|
179
|
+
return value
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
rawBeforeClose(root) {
|
|
183
|
+
let value
|
|
184
|
+
root.walk(i => {
|
|
185
|
+
if (i.nodes && i.nodes.length > 0) {
|
|
186
|
+
if (typeof i.raws.after !== 'undefined') {
|
|
187
|
+
value = i.raws.after
|
|
188
|
+
if (value.includes('\n')) {
|
|
189
|
+
value = value.replace(/[^\n]+$/, '')
|
|
190
|
+
}
|
|
191
|
+
return false
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
})
|
|
195
|
+
if (value) value = value.replace(/\S/g, '')
|
|
196
|
+
return value
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
rawBeforeComment(root, node) {
|
|
200
|
+
let value
|
|
201
|
+
root.walkComments(i => {
|
|
202
|
+
if (typeof i.raws.before !== 'undefined') {
|
|
203
|
+
value = i.raws.before
|
|
204
|
+
if (value.includes('\n')) {
|
|
205
|
+
value = value.replace(/[^\n]+$/, '')
|
|
206
|
+
}
|
|
207
|
+
return false
|
|
208
|
+
}
|
|
209
|
+
})
|
|
210
|
+
if (typeof value === 'undefined') {
|
|
211
|
+
value = this.raw(node, null, 'beforeDecl')
|
|
212
|
+
} else if (value) {
|
|
213
|
+
value = value.replace(/\S/g, '')
|
|
214
|
+
}
|
|
215
|
+
return value
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
rawBeforeDecl(root, node) {
|
|
219
|
+
let value
|
|
220
|
+
root.walkDecls(i => {
|
|
221
|
+
if (typeof i.raws.before !== 'undefined') {
|
|
222
|
+
value = i.raws.before
|
|
223
|
+
if (value.includes('\n')) {
|
|
224
|
+
value = value.replace(/[^\n]+$/, '')
|
|
225
|
+
}
|
|
226
|
+
return false
|
|
227
|
+
}
|
|
228
|
+
})
|
|
229
|
+
if (typeof value === 'undefined') {
|
|
230
|
+
value = this.raw(node, null, 'beforeRule')
|
|
231
|
+
} else if (value) {
|
|
232
|
+
value = value.replace(/\S/g, '')
|
|
233
|
+
}
|
|
234
|
+
return value
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
rawBeforeOpen(root) {
|
|
238
|
+
let value
|
|
239
|
+
root.walk(i => {
|
|
240
|
+
if (i.type !== 'decl') {
|
|
241
|
+
value = i.raws.between
|
|
242
|
+
if (typeof value !== 'undefined') return false
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
return value
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
rawBeforeRule(root) {
|
|
249
|
+
let value
|
|
250
|
+
root.walk(i => {
|
|
251
|
+
if (i.nodes && (i.parent !== root || root.first !== i)) {
|
|
252
|
+
if (typeof i.raws.before !== 'undefined') {
|
|
253
|
+
value = i.raws.before
|
|
254
|
+
if (value.includes('\n')) {
|
|
255
|
+
value = value.replace(/[^\n]+$/, '')
|
|
256
|
+
}
|
|
257
|
+
return false
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
})
|
|
261
|
+
if (value) value = value.replace(/\S/g, '')
|
|
262
|
+
return value
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
rawColon(root) {
|
|
266
|
+
let value
|
|
267
|
+
root.walkDecls(i => {
|
|
268
|
+
if (typeof i.raws.between !== 'undefined') {
|
|
269
|
+
value = i.raws.between.replace(/[^\s:]/g, '')
|
|
270
|
+
return false
|
|
271
|
+
}
|
|
272
|
+
})
|
|
273
|
+
return value
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
rawEmptyBody(root) {
|
|
277
|
+
let value
|
|
278
|
+
root.walk(i => {
|
|
279
|
+
if (i.nodes && i.nodes.length === 0) {
|
|
280
|
+
value = i.raws.after
|
|
281
|
+
if (typeof value !== 'undefined') return false
|
|
282
|
+
}
|
|
283
|
+
})
|
|
284
|
+
return value
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
rawIndent(root) {
|
|
288
|
+
if (root.raws.indent) return root.raws.indent
|
|
289
|
+
let value
|
|
290
|
+
root.walk(i => {
|
|
291
|
+
let p = i.parent
|
|
292
|
+
if (p && p !== root && p.parent && p.parent === root) {
|
|
293
|
+
if (typeof i.raws.before !== 'undefined') {
|
|
294
|
+
let parts = i.raws.before.split('\n')
|
|
295
|
+
value = parts[parts.length - 1]
|
|
296
|
+
value = value.replace(/\S/g, '')
|
|
297
|
+
return false
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
})
|
|
301
|
+
return value
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
rawSemicolon(root) {
|
|
305
|
+
let value
|
|
306
|
+
root.walk(i => {
|
|
307
|
+
if (i.nodes && i.nodes.length && i.last.type === 'decl') {
|
|
308
|
+
value = i.raws.semicolon
|
|
309
|
+
if (typeof value !== 'undefined') return false
|
|
310
|
+
}
|
|
311
|
+
})
|
|
312
|
+
return value
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
rawValue(node, prop) {
|
|
316
|
+
let value = node[prop]
|
|
317
|
+
let raw = node.raws[prop]
|
|
318
|
+
if (raw && raw.value === value) {
|
|
319
|
+
return raw.raw
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return value
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
root(node) {
|
|
326
|
+
this.body(node)
|
|
327
|
+
if (node.raws.after) this.builder(node.raws.after)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
rule(node) {
|
|
331
|
+
this.block(node, this.rawValue(node, 'selector'))
|
|
332
|
+
if (node.raws.ownSemicolon) {
|
|
333
|
+
this.builder(node.raws.ownSemicolon, node, 'end')
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
stringify(node, semicolon) {
|
|
338
|
+
/* c8 ignore start */
|
|
339
|
+
if (!this[node.type]) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
'Unknown AST node type ' +
|
|
342
|
+
node.type +
|
|
343
|
+
'. ' +
|
|
344
|
+
'Maybe you need to change PostCSS stringifier.'
|
|
345
|
+
)
|
|
346
|
+
}
|
|
347
|
+
/* c8 ignore stop */
|
|
348
|
+
this[node.type](node, semicolon)
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
module.exports = Stringifier
|
|
353
|
+
Stringifier.default = Stringifier
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
let pico = require('picocolors')
|
|
4
|
+
|
|
5
|
+
let tokenizer = require('./tokenize')
|
|
6
|
+
|
|
7
|
+
let Input
|
|
8
|
+
|
|
9
|
+
function registerInput(dependant) {
|
|
10
|
+
Input = dependant
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const HIGHLIGHT_THEME = {
|
|
14
|
+
';': pico.yellow,
|
|
15
|
+
':': pico.yellow,
|
|
16
|
+
'(': pico.cyan,
|
|
17
|
+
')': pico.cyan,
|
|
18
|
+
'[': pico.yellow,
|
|
19
|
+
']': pico.yellow,
|
|
20
|
+
'{': pico.yellow,
|
|
21
|
+
'}': pico.yellow,
|
|
22
|
+
'at-word': pico.cyan,
|
|
23
|
+
'brackets': pico.cyan,
|
|
24
|
+
'call': pico.cyan,
|
|
25
|
+
'class': pico.yellow,
|
|
26
|
+
'comment': pico.gray,
|
|
27
|
+
'hash': pico.magenta,
|
|
28
|
+
'string': pico.green
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getTokenType([type, value], processor) {
|
|
32
|
+
if (type === 'word') {
|
|
33
|
+
if (value[0] === '.') {
|
|
34
|
+
return 'class'
|
|
35
|
+
}
|
|
36
|
+
if (value[0] === '#') {
|
|
37
|
+
return 'hash'
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!processor.endOfFile()) {
|
|
42
|
+
let next = processor.nextToken()
|
|
43
|
+
processor.back(next)
|
|
44
|
+
if (next[0] === 'brackets' || next[0] === '(') return 'call'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return type
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function terminalHighlight(css) {
|
|
51
|
+
let processor = tokenizer(new Input(css), { ignoreErrors: true })
|
|
52
|
+
let result = ''
|
|
53
|
+
while (!processor.endOfFile()) {
|
|
54
|
+
let token = processor.nextToken()
|
|
55
|
+
let color = HIGHLIGHT_THEME[getTokenType(token, processor)]
|
|
56
|
+
if (color) {
|
|
57
|
+
result += token[1]
|
|
58
|
+
.split(/\r?\n/)
|
|
59
|
+
.map(i => color(i))
|
|
60
|
+
.join('\n')
|
|
61
|
+
} else {
|
|
62
|
+
result += token[1]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
terminalHighlight.registerInput = registerInput
|
|
69
|
+
|
|
70
|
+
module.exports = terminalHighlight
|