@riebeckite/plugin-dataview 0.0.1
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/LICENSE +201 -0
- package/README.md +227 -0
- package/README_ja.md +191 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +1258 -0
- package/dist/src/evaluate.d.ts +28 -0
- package/dist/src/parse.d.ts +11 -0
- package/dist/src/placeholder.d.ts +5 -0
- package/dist/src/remark.d.ts +5 -0
- package/dist/src/render.d.ts +4 -0
- package/dist/src/runtime.d.ts +7 -0
- package/dist/src/types.d.ts +95 -0
- package/package.json +57 -0
- package/style.css +192 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ContentManifest, ContentManifestEntry } from "@riebeckite/core";
|
|
2
|
+
import type { DataviewExpression, DataviewFrom, DataviewSpec } from "./types.js";
|
|
3
|
+
export type DataviewScope = {
|
|
4
|
+
entry: ContentManifestEntry;
|
|
5
|
+
manifest: ContentManifest;
|
|
6
|
+
};
|
|
7
|
+
export type DataviewGroup = {
|
|
8
|
+
key: string;
|
|
9
|
+
entries: ContentManifestEntry[];
|
|
10
|
+
};
|
|
11
|
+
export type DataviewSelection = {
|
|
12
|
+
entries: ContentManifestEntry[];
|
|
13
|
+
groups: DataviewGroup[];
|
|
14
|
+
grouped: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare class DataviewEvaluationError extends Error {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Select the manifest entries a spec matches, applying `FROM`, `WHERE`, `SORT`,
|
|
20
|
+
* `LIMIT`, and `GROUP BY` in that order.
|
|
21
|
+
*/
|
|
22
|
+
export declare function selectDataviewEntries(spec: DataviewSpec, manifest: ContentManifest, defaultLimit: number | null): DataviewSelection;
|
|
23
|
+
export declare function matchesDataviewFrom(from: DataviewFrom | null, entry: ContentManifestEntry, manifest: ContentManifest): boolean;
|
|
24
|
+
export declare function evaluateDataviewExpression(expression: DataviewExpression, scope: DataviewScope): unknown;
|
|
25
|
+
export declare function readDataviewField(entry: ContentManifestEntry, path: readonly string[], _manifest?: ContentManifest): unknown;
|
|
26
|
+
export declare function isTruthy(value: unknown): boolean;
|
|
27
|
+
/** Parse a value into a millisecond timestamp, or `null` when impossible. */
|
|
28
|
+
export declare function toDataviewTime(value: unknown): number | null;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DataviewParseResult } from "./types.js";
|
|
2
|
+
declare class DataviewParseError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Parse a declarative `dataview` block body into a {@link DataviewSpec}.
|
|
6
|
+
*
|
|
7
|
+
* The parser never throws: unsupported or malformed input is reported as a
|
|
8
|
+
* failed {@link DataviewParseResult} so callers can render a fallback.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseDataview(source: string): DataviewParseResult;
|
|
11
|
+
export { DataviewParseError };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const DATAVIEW_ATTRIBUTE = "data-rr-dataview";
|
|
2
|
+
export declare function encodeDataviewSource(source: string): string;
|
|
3
|
+
export declare function decodeDataviewSource(encoded: string): string;
|
|
4
|
+
export declare function createDataviewPlaceholder(source: string): string;
|
|
5
|
+
export declare function createDataviewPlaceholderPattern(): RegExp;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type DataviewSelection } from "./evaluate.js";
|
|
2
|
+
import type { DataviewSpec, ResolvedDataviewOptions } from "./types.js";
|
|
3
|
+
export declare function renderDataview(selection: DataviewSelection, spec: DataviewSpec, options: ResolvedDataviewOptions, source: string): string;
|
|
4
|
+
export declare function renderDataviewError(message: string, source: string, options: ResolvedDataviewOptions): string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContentManifest, Diagnostic, PostContent } from "@riebeckite/core";
|
|
2
|
+
import { type DataviewOptions } from "./types.js";
|
|
3
|
+
export type DataviewRuntime = {
|
|
4
|
+
track(slug: string, content: PostContent): void;
|
|
5
|
+
resolve(manifest: ContentManifest, diagnostics: Diagnostic[]): void;
|
|
6
|
+
};
|
|
7
|
+
export declare function createDataviewRuntime(options?: DataviewOptions): DataviewRuntime;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export type DataviewQueryType = "list" | "table" | "task" | "calendar";
|
|
2
|
+
export type DataviewSortOrder = "asc" | "desc";
|
|
3
|
+
export type DataviewSort = {
|
|
4
|
+
field: string;
|
|
5
|
+
order: DataviewSortOrder;
|
|
6
|
+
};
|
|
7
|
+
export type DataviewColumn = {
|
|
8
|
+
field: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
};
|
|
11
|
+
export type DataviewComparisonOperator = "=" | "!=" | ">" | "<" | ">=" | "<=";
|
|
12
|
+
export type DataviewSource = {
|
|
13
|
+
kind: "tag";
|
|
14
|
+
value: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: "folder";
|
|
17
|
+
value: string;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "link";
|
|
20
|
+
value: string;
|
|
21
|
+
};
|
|
22
|
+
export type DataviewFrom = {
|
|
23
|
+
kind: "source";
|
|
24
|
+
source: DataviewSource;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "not";
|
|
27
|
+
child: DataviewFrom;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "and";
|
|
30
|
+
left: DataviewFrom;
|
|
31
|
+
right: DataviewFrom;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "or";
|
|
34
|
+
left: DataviewFrom;
|
|
35
|
+
right: DataviewFrom;
|
|
36
|
+
};
|
|
37
|
+
export type DataviewExpression = {
|
|
38
|
+
kind: "literal";
|
|
39
|
+
value: string | number | boolean | null;
|
|
40
|
+
} | {
|
|
41
|
+
kind: "field";
|
|
42
|
+
path: readonly string[];
|
|
43
|
+
} | {
|
|
44
|
+
kind: "not";
|
|
45
|
+
operand: DataviewExpression;
|
|
46
|
+
} | {
|
|
47
|
+
kind: "and";
|
|
48
|
+
left: DataviewExpression;
|
|
49
|
+
right: DataviewExpression;
|
|
50
|
+
} | {
|
|
51
|
+
kind: "or";
|
|
52
|
+
left: DataviewExpression;
|
|
53
|
+
right: DataviewExpression;
|
|
54
|
+
} | {
|
|
55
|
+
kind: "compare";
|
|
56
|
+
operator: DataviewComparisonOperator;
|
|
57
|
+
left: DataviewExpression;
|
|
58
|
+
right: DataviewExpression;
|
|
59
|
+
} | {
|
|
60
|
+
kind: "call";
|
|
61
|
+
name: string;
|
|
62
|
+
args: readonly DataviewExpression[];
|
|
63
|
+
};
|
|
64
|
+
export type DataviewSpec = {
|
|
65
|
+
type: DataviewQueryType;
|
|
66
|
+
columns: readonly DataviewColumn[];
|
|
67
|
+
expression: string | null;
|
|
68
|
+
from: DataviewFrom | null;
|
|
69
|
+
where: DataviewExpression | null;
|
|
70
|
+
sort: readonly DataviewSort[];
|
|
71
|
+
groupBy: string | null;
|
|
72
|
+
limit: number | null;
|
|
73
|
+
};
|
|
74
|
+
export type DataviewParseResult = {
|
|
75
|
+
status: "ok";
|
|
76
|
+
spec: DataviewSpec;
|
|
77
|
+
} | {
|
|
78
|
+
status: "error";
|
|
79
|
+
message: string;
|
|
80
|
+
};
|
|
81
|
+
export type DataviewOptions = {
|
|
82
|
+
className?: string;
|
|
83
|
+
language?: string;
|
|
84
|
+
hideFallback?: boolean;
|
|
85
|
+
limit?: number;
|
|
86
|
+
};
|
|
87
|
+
export type ResolvedDataviewOptions = {
|
|
88
|
+
className: string;
|
|
89
|
+
language: string;
|
|
90
|
+
hideFallback: boolean;
|
|
91
|
+
limit: number | null;
|
|
92
|
+
};
|
|
93
|
+
export declare const DEFAULT_DATAVIEW_CLASS_NAME = "rb-dataview";
|
|
94
|
+
export declare const DEFAULT_DATAVIEW_LANGUAGE = "dataview";
|
|
95
|
+
export declare function resolveDataviewOptions(options?: DataviewOptions): ResolvedDataviewOptions;
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@riebeckite/plugin-dataview",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"source": "./index.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./style.css": "./style.css"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@types/mdast": "^4.0.4",
|
|
19
|
+
"unist-util-visit": "^5.1.0",
|
|
20
|
+
"@riebeckite/core": "0.0.1"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"LICENSE",
|
|
27
|
+
"README.md",
|
|
28
|
+
"README_ja.md",
|
|
29
|
+
"dist",
|
|
30
|
+
"style.css"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/Rerurate514/riebeckite.git",
|
|
35
|
+
"directory": "packages/plugins/dataview"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/Rerurate514/riebeckite#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/Rerurate514/riebeckite/issues"
|
|
40
|
+
},
|
|
41
|
+
"description": "Build-time dataview queries for Riebeckite content.",
|
|
42
|
+
"keywords": [
|
|
43
|
+
"riebeckite",
|
|
44
|
+
"plugin",
|
|
45
|
+
"dataview",
|
|
46
|
+
"obsidian"
|
|
47
|
+
],
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
50
|
+
},
|
|
51
|
+
"sideEffects": [
|
|
52
|
+
"./style.css"
|
|
53
|
+
],
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "node ../../../scripts/build_package.mjs"
|
|
56
|
+
}
|
|
57
|
+
}
|
package/style.css
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
.rb-dataview {
|
|
2
|
+
--rb-dataview-ink: var(--rb-color-ink, #000000);
|
|
3
|
+
--rb-dataview-paper: var(--rb-color-paper, #ffffff);
|
|
4
|
+
--rb-dataview-muted: var(--rb-color-muted, #69645c);
|
|
5
|
+
--rb-dataview-accent: var(--rb-color-accent, #686868);
|
|
6
|
+
--rb-dataview-rule: var(
|
|
7
|
+
--rb-color-border,
|
|
8
|
+
color-mix(in srgb, var(--rb-dataview-ink) 18%, transparent)
|
|
9
|
+
);
|
|
10
|
+
--rb-dataview-surface: color-mix(
|
|
11
|
+
in srgb,
|
|
12
|
+
var(--rb-dataview-paper) 94%,
|
|
13
|
+
var(--rb-dataview-ink)
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
margin: 1.5rem 0;
|
|
17
|
+
color: var(--rb-dataview-ink);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.rb-dataview__table,
|
|
21
|
+
.rb-dataview__calendar {
|
|
22
|
+
width: 100%;
|
|
23
|
+
border-collapse: collapse;
|
|
24
|
+
font-size: 0.9375rem;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.rb-dataview__heading,
|
|
28
|
+
.rb-dataview__calendar-weekday {
|
|
29
|
+
padding: 0.5rem 0.75rem;
|
|
30
|
+
border-bottom: 1px solid var(--rb-dataview-ink);
|
|
31
|
+
text-align: left;
|
|
32
|
+
font-weight: 700;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.rb-dataview__cell,
|
|
36
|
+
.rb-dataview__calendar-cell {
|
|
37
|
+
padding: 0.5rem 0.75rem;
|
|
38
|
+
vertical-align: top;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.rb-dataview__row:not(:last-child) .rb-dataview__cell {
|
|
42
|
+
border-bottom: 1px solid var(--rb-dataview-rule);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.rb-dataview__group {
|
|
46
|
+
margin: 1rem 0 0.25rem;
|
|
47
|
+
font-size: 0.8125rem;
|
|
48
|
+
font-weight: 700;
|
|
49
|
+
letter-spacing: 0.04em;
|
|
50
|
+
text-transform: uppercase;
|
|
51
|
+
color: var(--rb-dataview-muted);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.rb-dataview__group-cell {
|
|
55
|
+
padding: 0.5rem 0.75rem;
|
|
56
|
+
border-bottom: 1px solid var(--rb-dataview-ink);
|
|
57
|
+
text-align: left;
|
|
58
|
+
font-weight: 700;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.rb-dataview__link {
|
|
62
|
+
color: inherit;
|
|
63
|
+
text-decoration: underline;
|
|
64
|
+
text-decoration-color: var(--rb-dataview-rule);
|
|
65
|
+
text-underline-offset: 0.2em;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.rb-dataview__link:hover,
|
|
69
|
+
.rb-dataview__link:focus-visible {
|
|
70
|
+
text-decoration-color: var(--rb-dataview-accent);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.rb-dataview__tag {
|
|
74
|
+
display: inline-block;
|
|
75
|
+
margin-right: 0.25rem;
|
|
76
|
+
color: var(--rb-dataview-muted);
|
|
77
|
+
font-size: 0.8125em;
|
|
78
|
+
white-space: nowrap;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.rb-dataview__list,
|
|
82
|
+
.rb-dataview__tasks {
|
|
83
|
+
margin: 0;
|
|
84
|
+
padding: 0;
|
|
85
|
+
list-style: none;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.rb-dataview__item,
|
|
89
|
+
.rb-dataview__task {
|
|
90
|
+
display: flex;
|
|
91
|
+
flex-wrap: wrap;
|
|
92
|
+
gap: 0.5rem;
|
|
93
|
+
align-items: baseline;
|
|
94
|
+
padding: 0.5rem 0;
|
|
95
|
+
border-bottom: 1px solid var(--rb-dataview-rule);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.rb-dataview__item:last-child,
|
|
99
|
+
.rb-dataview__task:last-child {
|
|
100
|
+
border-bottom: 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.rb-dataview__meta {
|
|
104
|
+
color: var(--rb-dataview-muted);
|
|
105
|
+
font-size: 0.8125em;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.rb-dataview__task[data-task="x"] .rb-dataview__task-text {
|
|
109
|
+
color: var(--rb-dataview-muted);
|
|
110
|
+
text-decoration: line-through;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.rb-dataview__task::before {
|
|
114
|
+
content: "☐";
|
|
115
|
+
color: var(--rb-dataview-muted);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.rb-dataview__task[data-task="x"]::before {
|
|
119
|
+
content: "☑";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.rb-dataview__task-link {
|
|
123
|
+
color: var(--rb-dataview-muted);
|
|
124
|
+
font-size: 0.8125em;
|
|
125
|
+
text-decoration: underline;
|
|
126
|
+
text-underline-offset: 0.2em;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.rb-dataview__calendar-caption {
|
|
130
|
+
padding-bottom: 0.5rem;
|
|
131
|
+
text-align: left;
|
|
132
|
+
font-weight: 700;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.rb-dataview__calendar-cell {
|
|
136
|
+
border: 1px solid var(--rb-dataview-rule);
|
|
137
|
+
min-width: 4rem;
|
|
138
|
+
height: 4rem;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.rb-dataview__calendar-cell--empty {
|
|
142
|
+
background: var(--rb-dataview-surface);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.rb-dataview__calendar-day {
|
|
146
|
+
display: block;
|
|
147
|
+
font-size: 0.75rem;
|
|
148
|
+
color: var(--rb-dataview-muted);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.rb-dataview__calendar-links {
|
|
152
|
+
display: block;
|
|
153
|
+
font-size: 0.8125rem;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.rb-dataview__empty {
|
|
157
|
+
margin: 1.5rem 0;
|
|
158
|
+
color: var(--rb-dataview-muted);
|
|
159
|
+
font-style: italic;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.rb-dataview__fallback {
|
|
163
|
+
margin-top: 0.75rem;
|
|
164
|
+
color: var(--rb-dataview-muted);
|
|
165
|
+
font-size: 0.8125rem;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.rb-dataview__fallback-summary {
|
|
169
|
+
cursor: pointer;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.rb-dataview__fallback-code {
|
|
173
|
+
overflow-x: auto;
|
|
174
|
+
margin: 0.5rem 0 0;
|
|
175
|
+
padding: 0.75rem 1rem;
|
|
176
|
+
border: 1px solid var(--rb-dataview-rule);
|
|
177
|
+
background: var(--rb-dataview-surface);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.rb-dataview--error {
|
|
181
|
+
margin: 1.5rem 0;
|
|
182
|
+
padding: 0.75rem 1rem;
|
|
183
|
+
border: 1px solid var(--rb-dataview-ink);
|
|
184
|
+
background: var(--rb-dataview-surface);
|
|
185
|
+
font-size: 0.875rem;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
html[data-theme="dark"] .rb-dataview,
|
|
189
|
+
html.dark .rb-dataview {
|
|
190
|
+
--rb-dataview-ink: var(--rb-color-paper, #ffffff);
|
|
191
|
+
--rb-dataview-paper: var(--rb-color-ink, #000000);
|
|
192
|
+
}
|