signalk-maintenance-tracker 1.2.0 → 1.3.0
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/CHANGELOG.md +40 -0
- package/README.md +1 -1
- package/dist/api/router.js +1 -1
- package/dist/api/router.js.map +1 -1
- package/dist/domain/status.js +7 -7
- package/dist/domain/status.js.map +1 -1
- package/dist/signalk/notifications.js +3 -3
- package/dist/signalk/notifications.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/public/app/components/MarkdownView.js +7 -3
- package/public/app/lib/autolink.js +136 -0
- package/public/app/lib/softbreak.js +163 -0
- package/public/app/pages/TaskDetailPage.js +6 -4
- package/public/app/types.js +1 -1
- package/public/styles/main.css +3 -3
- package/public/styles/tokens.css +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,43 @@
|
|
|
1
|
+
# v1.3.0
|
|
2
|
+
|
|
3
|
+
Notes and descriptions now render the way you typed them: pasted URLs become
|
|
4
|
+
links, and line breaks stay where you put them. And the `unknown` task status
|
|
5
|
+
is now `info`.
|
|
6
|
+
|
|
7
|
+
## Highlights
|
|
8
|
+
|
|
9
|
+
- **Bare URLs in notes and descriptions become links.** Pasting a manual's URL
|
|
10
|
+
into a note used to leave dead text, since markdown only links explicit
|
|
11
|
+
`[text](url)`. Bare `http(s)://` and `www.` runs are now anchored, with the
|
|
12
|
+
hostname as the link text (a pasted tracking URL is unreadable inline) and the
|
|
13
|
+
full URL on hover. Linking runs over the already-sanitized HTML and skips text
|
|
14
|
+
inside existing links, `code` and `pre`, so it can't reintroduce a
|
|
15
|
+
`javascript:` URL.
|
|
16
|
+
- **Line breaks survive.** A note typed over several lines came out as one
|
|
17
|
+
run-on line, because a lone newline means whitespace to markdown but a line
|
|
18
|
+
break to whoever typed it into a textarea. Single newlines are now kept as
|
|
19
|
+
breaks and runs of blank lines are no longer collapsed, while fenced code
|
|
20
|
+
blocks and list spacing are left exactly as markdown intends them.
|
|
21
|
+
- **The `unknown` task status is now `info`.** A task with no intervals is a
|
|
22
|
+
plain informational record, not one whose state we failed to work out — but
|
|
23
|
+
the badge read "unknown", which sounds like something is missing. The rename
|
|
24
|
+
goes all the way through: badge, CSS tokens, API filter value, and the status
|
|
25
|
+
the notification manager declines to publish for. Precedence is unchanged:
|
|
26
|
+
`overdue` > `due_soon` > `ok` > `info`.
|
|
27
|
+
|
|
28
|
+
## Breaking changes
|
|
29
|
+
|
|
30
|
+
- `GET /tasks?status=unknown` no longer matches anything. Unrecognized filter
|
|
31
|
+
values are dropped rather than rejected, so an old caller gets an unfiltered
|
|
32
|
+
list instead of an error — pass `status=info` instead. Task status values in
|
|
33
|
+
API responses and on published SignalK paths change from `unknown` to `info`
|
|
34
|
+
as well.
|
|
35
|
+
|
|
36
|
+
## Smaller changes and fixes
|
|
37
|
+
|
|
38
|
+
- The task detail page no longer shows a "Description" heading (or a "No
|
|
39
|
+
description." placeholder) for a task that only has consumables.
|
|
40
|
+
|
|
1
41
|
# v1.2.0
|
|
2
42
|
|
|
3
43
|
A task detail page that puts the numbers you actually compare side by side,
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ else that comes due by engine hours, by calendar time, or both.
|
|
|
11
11
|
(days/weeks/months/years). Add a one-time calendar due date for a one-off
|
|
12
12
|
job, or leave every interval blank to keep a plain informational record.
|
|
13
13
|
- **Status tracking** — each task is `overdue`, `due soon`, `ok`, or
|
|
14
|
-
`
|
|
14
|
+
`info`; the task list sorts most-urgent first. Any task can override the
|
|
15
15
|
plugin-wide "due soon" lead windows with its own runtime-hours and
|
|
16
16
|
calendar-days thresholds.
|
|
17
17
|
- **Maintenance log** — per-task history plus a master log across all tasks,
|
package/dist/api/router.js
CHANGED
|
@@ -163,7 +163,7 @@ function parseTaskListQuery(req) {
|
|
|
163
163
|
return {
|
|
164
164
|
search: str(req.query.search),
|
|
165
165
|
tags: csv(req.query.tags),
|
|
166
|
-
status: csv(req.query.status)?.filter((s) => ['overdue', 'due_soon', 'ok', '
|
|
166
|
+
status: csv(req.query.status)?.filter((s) => ['overdue', 'due_soon', 'ok', 'info'].includes(s)),
|
|
167
167
|
sort: pickEnum(req.query.sort, [
|
|
168
168
|
'name',
|
|
169
169
|
'remaining_runtime',
|
package/dist/api/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/status.js
CHANGED
|
@@ -35,7 +35,7 @@ function addMonths(d, n) {
|
|
|
35
35
|
}
|
|
36
36
|
function mostUrgent(statuses) {
|
|
37
37
|
if (statuses.length === 0)
|
|
38
|
-
return '
|
|
38
|
+
return 'info';
|
|
39
39
|
return statuses.reduce((a, b) => (types_1.STATUS_RANK[a] <= types_1.STATUS_RANK[b] ? a : b));
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
@@ -65,8 +65,8 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
65
65
|
remaining_time_ms: null,
|
|
66
66
|
time_fraction: null,
|
|
67
67
|
time_status: null,
|
|
68
|
-
status: '
|
|
69
|
-
status_rank: types_1.STATUS_RANK.
|
|
68
|
+
status: 'info',
|
|
69
|
+
status_rank: types_1.STATUS_RANK.info,
|
|
70
70
|
urgency: -Infinity,
|
|
71
71
|
};
|
|
72
72
|
// Elapsed-since-last-service figures stand on their own: they need only a
|
|
@@ -95,7 +95,7 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
95
95
|
: 'ok';
|
|
96
96
|
}
|
|
97
97
|
else {
|
|
98
|
-
out.runtime_status = '
|
|
98
|
+
out.runtime_status = 'info';
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
// Recurring time-interval dimension: configured when magnitude + unit are set.
|
|
@@ -110,7 +110,7 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
110
110
|
out.scheduled_status = dateStatus(out.scheduled_remaining_ms, timeLead);
|
|
111
111
|
}
|
|
112
112
|
else {
|
|
113
|
-
out.scheduled_status = '
|
|
113
|
+
out.scheduled_status = 'info';
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
// One-time due-date dimension: the stored deadline. Fraction runs from task
|
|
@@ -125,8 +125,8 @@ function computeTask(task, currentRuntime, now, cfg) {
|
|
|
125
125
|
}
|
|
126
126
|
// Merged "time" dimension = the more urgent of the two: whichever has the
|
|
127
127
|
// lower remaining drives remaining_time_ms + time_fraction; time_status is
|
|
128
|
-
// the most-urgent of the sub-statuses (so a configured-but-
|
|
129
|
-
// dimension still surfaces as
|
|
128
|
+
// the most-urgent of the sub-statuses (so a configured-but-uncomputable
|
|
129
|
+
// recurring dimension still surfaces as info).
|
|
130
130
|
const timeSubs = [
|
|
131
131
|
{ remaining: out.scheduled_remaining_ms, fraction: out.scheduled_fraction },
|
|
132
132
|
{ remaining: out.due_date_remaining_ms, fraction: out.due_date_fraction },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/domain/status.ts"],"names":[],"mappings":";;AAoBA,kCAcC;AAuBD,kCAyIC;AAlMD,oCAMkB;AAOlB,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B;;;;GAIG;AACH,SAAgB,WAAW,CAAC,GAAW,EAAE,CAAS,EAAE,IAAc;IAChE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACjC,OAAO,CAAC,CAAC;QACX,KAAK,OAAO;YACV,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAO,EAAE,CAAS;IACnC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,IAAI,CAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CACrD,CAAC,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/domain/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ class NotificationManager {
|
|
|
27
27
|
case 'overdue':
|
|
28
28
|
return this.opts.alarmStateOverdue;
|
|
29
29
|
default:
|
|
30
|
-
return undefined; //
|
|
30
|
+
return undefined; // info
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
publishAll(tasks) {
|
|
@@ -36,10 +36,10 @@ class NotificationManager {
|
|
|
36
36
|
for (const task of tasks) {
|
|
37
37
|
const state = this.stateForStatus(task.status);
|
|
38
38
|
if (!state) {
|
|
39
|
-
//
|
|
39
|
+
// info: publish nothing, but clear a previously-raised notification
|
|
40
40
|
const last = this.lastState.get(task.slug);
|
|
41
41
|
if (last && last !== 'none') {
|
|
42
|
-
this.send(task.slug, 'none', `${task.name}: status
|
|
42
|
+
this.send(task.slug, 'none', `${task.name}: status info`);
|
|
43
43
|
}
|
|
44
44
|
continue;
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/signalk/notifications.ts"],"names":[],"mappings":";;;AA8FA,oCA6BC;AAxHD;;;;;GAKG;AACH,MAAa,mBAAmB;IAIpB;IACA;IACA;IALF,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAElD,YACU,GAAQ,EACR,QAAgB,EAChB,IAMP;QARO,QAAG,GAAH,GAAG,CAAK;QACR,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAMX;IACA,CAAC;IAEI,cAAc,CAAC,MAAc;QACnC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YAChC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACrC,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACrC;gBACE,OAAO,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/signalk/notifications.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAI9D,QAAA,WAAW,GAA2B;IACjD,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,EAAE,EAAE,CAAC;IACL,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAI9D,QAAA,WAAW,GAA2B;IACjD,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,EAAE,EAAE,CAAC;IACL,IAAI,EAAE,CAAC;CACR,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The single place raw HTML is set (§7.8):
|
|
3
|
-
* dangerouslySetInnerHTML. Nothing else may
|
|
2
|
+
* The single place raw HTML is set (§7.8): mark blank lines → snarkdown →
|
|
3
|
+
* sanitize → autolink → soft breaks → dangerouslySetInnerHTML. Nothing else may
|
|
4
|
+
* set raw HTML.
|
|
4
5
|
*/
|
|
5
6
|
import snarkdown from '../../vendor/snarkdown.js';
|
|
7
|
+
import { autolinkHtml } from '../lib/autolink.js';
|
|
6
8
|
import { html } from '../lib/html.js';
|
|
7
9
|
import { sanitizeHtml } from '../lib/sanitize.js';
|
|
10
|
+
import { keepBlankLines, softBreakHtml } from '../lib/softbreak.js';
|
|
8
11
|
|
|
9
12
|
/** @param {{ markdown: string|null|undefined }} props */
|
|
10
13
|
export function MarkdownView(props) {
|
|
11
14
|
if (!props.markdown) return null;
|
|
12
|
-
const
|
|
15
|
+
const rendered = snarkdown(keepBlankLines(props.markdown));
|
|
16
|
+
const clean = softBreakHtml(autolinkHtml(sanitizeHtml(rendered)));
|
|
13
17
|
return html`<div
|
|
14
18
|
class="markdown"
|
|
15
19
|
dangerouslySetInnerHTML=${{ __html: clean }}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bare-URL autolinking for markdown output (§7.8). snarkdown only links
|
|
3
|
+
* explicit [text](url), so a note that just pastes a URL renders as dead text.
|
|
4
|
+
* This turns http(s):// and www. runs in the text into anchors.
|
|
5
|
+
*
|
|
6
|
+
* Runs *after* sanitizeHtml() on already-clean HTML: every href here is built
|
|
7
|
+
* from a match that must start with http://, https:// or www., so this pass
|
|
8
|
+
* cannot reintroduce a javascript: URL. Text inside existing links and inside
|
|
9
|
+
* code is left alone. Only <MarkdownView/> consumes this.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Bare URL run: everything up to whitespace or a tag; trimmed below. */
|
|
13
|
+
const URL_RE = /(?:https?:\/\/|www\.)[^\s<]+/gi;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Elements whose text must not be linkified.
|
|
17
|
+
* @type {Record<string, boolean>}
|
|
18
|
+
*/
|
|
19
|
+
const SKIP_TAGS = {
|
|
20
|
+
A: true,
|
|
21
|
+
CODE: true,
|
|
22
|
+
PRE: true,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Sentence punctuation that follows a URL far more often than it ends one. */
|
|
26
|
+
const TRAILING = '.,;:!?\'"';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string} clean sanitized HTML from sanitizeHtml()
|
|
30
|
+
* @returns {string} the same HTML with bare URLs wrapped in anchors
|
|
31
|
+
*/
|
|
32
|
+
export function autolinkHtml(clean) {
|
|
33
|
+
const doc = new DOMParser().parseFromString(clean, 'text/html');
|
|
34
|
+
autolinkNode(doc.body);
|
|
35
|
+
return doc.body.innerHTML;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** @param {Node} parent */
|
|
39
|
+
function autolinkNode(parent) {
|
|
40
|
+
// Snapshot: linkifying replaces text nodes with fragments as we walk.
|
|
41
|
+
const children = Array.prototype.slice.call(parent.childNodes);
|
|
42
|
+
for (let i = 0; i < children.length; i++) {
|
|
43
|
+
const node = children[i];
|
|
44
|
+
if (node.nodeType === 3) {
|
|
45
|
+
linkifyText(/** @type {Text} */ (node));
|
|
46
|
+
} else if (
|
|
47
|
+
node.nodeType === 1 &&
|
|
48
|
+
!SKIP_TAGS[/** @type {Element} */ (node).tagName]
|
|
49
|
+
) {
|
|
50
|
+
autolinkNode(node);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Replace one text node with its text plus <a> elements for any URLs in it.
|
|
57
|
+
* @param {Text} node
|
|
58
|
+
*/
|
|
59
|
+
function linkifyText(node) {
|
|
60
|
+
const text = node.nodeValue || '';
|
|
61
|
+
const doc = node.ownerDocument;
|
|
62
|
+
if (!doc) return;
|
|
63
|
+
let frag = null;
|
|
64
|
+
let last = 0;
|
|
65
|
+
let match;
|
|
66
|
+
URL_RE.lastIndex = 0;
|
|
67
|
+
while ((match = URL_RE.exec(text)) !== null) {
|
|
68
|
+
const url = trimTrailing(match[0]);
|
|
69
|
+
// Resume after what we kept, so trimmed punctuation stays plain text.
|
|
70
|
+
URL_RE.lastIndex = match.index + url.length;
|
|
71
|
+
if (!url) continue;
|
|
72
|
+
if (!frag) frag = doc.createDocumentFragment();
|
|
73
|
+
if (match.index > last) {
|
|
74
|
+
frag.appendChild(doc.createTextNode(text.slice(last, match.index)));
|
|
75
|
+
}
|
|
76
|
+
const href = url.indexOf('www.') === 0 ? 'https://' + url : url;
|
|
77
|
+
const a = doc.createElement('a');
|
|
78
|
+
a.setAttribute('href', href);
|
|
79
|
+
// The host is the readable part; the full URL stays on hover.
|
|
80
|
+
a.setAttribute('title', href);
|
|
81
|
+
a.textContent = hostnameOf(href) || url;
|
|
82
|
+
frag.appendChild(a);
|
|
83
|
+
last = match.index + url.length;
|
|
84
|
+
}
|
|
85
|
+
if (!frag) return;
|
|
86
|
+
if (last < text.length) {
|
|
87
|
+
frag.appendChild(doc.createTextNode(text.slice(last)));
|
|
88
|
+
}
|
|
89
|
+
node.parentNode && node.parentNode.replaceChild(frag, node);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The host is what identifies a link to a reader; a pasted path is usually
|
|
94
|
+
* noise ("example.com" beats a 90-character tracking URL). Returns '' if the
|
|
95
|
+
* URL will not parse, and the caller falls back to showing it whole.
|
|
96
|
+
*
|
|
97
|
+
* @param {string} href
|
|
98
|
+
* @returns {string}
|
|
99
|
+
*/
|
|
100
|
+
function hostnameOf(href) {
|
|
101
|
+
try {
|
|
102
|
+
return new URL(href).hostname;
|
|
103
|
+
} catch (_e) {
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Drop punctuation a sentence left on the end of a URL: "see https://x.com."
|
|
110
|
+
* A closing paren only counts as the URL's when the URL opened one, so both
|
|
111
|
+
* "(see https://x.com)" and "https://x.com/a_(b)" come out right.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} url
|
|
114
|
+
* @returns {string}
|
|
115
|
+
*/
|
|
116
|
+
function trimTrailing(url) {
|
|
117
|
+
let end = url.length;
|
|
118
|
+
while (end > 0) {
|
|
119
|
+
const ch = url.charAt(end - 1);
|
|
120
|
+
if (TRAILING.indexOf(ch) !== -1) {
|
|
121
|
+
end--;
|
|
122
|
+
} else if (ch === ')' && closesMoreThanOpens(url.slice(0, end))) {
|
|
123
|
+
end--;
|
|
124
|
+
} else {
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return url.slice(0, end);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** @param {string} s */
|
|
132
|
+
function closesMoreThanOpens(s) {
|
|
133
|
+
const opens = s.match(/\(/g);
|
|
134
|
+
const closes = s.match(/\)/g);
|
|
135
|
+
return (closes ? closes.length : 0) > (opens ? opens.length : 0);
|
|
136
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authored line breaks for markdown output (§7.8). People type notes into a
|
|
3
|
+
* textarea and mean every newline they press, but markdown does not: snarkdown
|
|
4
|
+
* drops a lone newline to whitespace, and collapses any run of blank lines into
|
|
5
|
+
* a single <br>. So "Maxwell HRC10\n\n\n<url>" came out as one run-on line, and
|
|
6
|
+
* spacing the author added could not be got back.
|
|
7
|
+
*
|
|
8
|
+
* Two steps, on either side of snarkdown:
|
|
9
|
+
*
|
|
10
|
+
* - keepBlankLines() runs first, splitting each run of newlines with a marker
|
|
11
|
+
* character so snarkdown sees single newlines it leaves alone instead of the
|
|
12
|
+
* blank-line run it would collapse.
|
|
13
|
+
* - softBreakHtml() runs last, turning the newlines left in the text into <br>
|
|
14
|
+
* and dropping the markers.
|
|
15
|
+
*
|
|
16
|
+
* The usual one-step trick — rewriting "\n" to " \n" before snarkdown — does
|
|
17
|
+
* not work here: it merges list items and leaves trailing spaces inside code
|
|
18
|
+
* fences. Only <MarkdownView/> consumes this.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Stands in for a blank line between two newlines. A control character, so it
|
|
23
|
+
* is inert to snarkdown's grammar and cannot occur in a note by accident.
|
|
24
|
+
*/
|
|
25
|
+
const MARKER = '\u0001';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Unmarked newlines at either edge of a text node. Marked ones are blank lines
|
|
29
|
+
* the author typed and survive; these are snarkdown's own output formatting.
|
|
30
|
+
*/
|
|
31
|
+
const LEAD_RE = /^\n+/;
|
|
32
|
+
const TAIL_RE = /\n+$/;
|
|
33
|
+
|
|
34
|
+
/** Fenced code, kept whole: blank lines in there are code, not layout. */
|
|
35
|
+
const FENCE_RE = /(```[\s\S]*?```)/g;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Split runs of blank lines so snarkdown cannot collapse them. Runs before
|
|
39
|
+
* snarkdown; softBreakHtml() clears up after it.
|
|
40
|
+
*
|
|
41
|
+
* @param {string} markdown as the author typed it
|
|
42
|
+
* @returns {string} markdown with blank-line runs marked
|
|
43
|
+
*/
|
|
44
|
+
export function keepBlankLines(markdown) {
|
|
45
|
+
// Odd indices are the fences themselves — left exactly as written.
|
|
46
|
+
const chunks = String(markdown).replace(/\r\n?/g, '\n').split(FENCE_RE);
|
|
47
|
+
for (let i = 0; i < chunks.length; i += 2) {
|
|
48
|
+
chunks[i] = chunks[i]
|
|
49
|
+
.split(MARKER)
|
|
50
|
+
.join('')
|
|
51
|
+
.replace(/\n{2,}/g, markRun);
|
|
52
|
+
}
|
|
53
|
+
return chunks.join('');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** @param {string} run two or more newlines */
|
|
57
|
+
function markRun(run) {
|
|
58
|
+
let out = '\n';
|
|
59
|
+
for (let i = 1; i < run.length; i++) out += MARKER + '\n';
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Newlines are content here, not layout.
|
|
65
|
+
* @type {Record<string, boolean>}
|
|
66
|
+
*/
|
|
67
|
+
const SKIP_TAGS = {
|
|
68
|
+
CODE: true,
|
|
69
|
+
PRE: true,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Elements that already break the line. A newline next to one of these came
|
|
74
|
+
* from snarkdown's own output formatting, not from the author.
|
|
75
|
+
* @type {Record<string, boolean>}
|
|
76
|
+
*/
|
|
77
|
+
const BLOCK_TAGS = {
|
|
78
|
+
BLOCKQUOTE: true,
|
|
79
|
+
DIV: true,
|
|
80
|
+
H1: true,
|
|
81
|
+
H2: true,
|
|
82
|
+
H3: true,
|
|
83
|
+
H4: true,
|
|
84
|
+
H5: true,
|
|
85
|
+
H6: true,
|
|
86
|
+
HR: true,
|
|
87
|
+
LI: true,
|
|
88
|
+
OL: true,
|
|
89
|
+
P: true,
|
|
90
|
+
PRE: true,
|
|
91
|
+
TABLE: true,
|
|
92
|
+
UL: true,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @param {string} clean sanitized HTML from sanitizeHtml()
|
|
97
|
+
* @returns {string} the same HTML with authored newlines as <br>
|
|
98
|
+
*/
|
|
99
|
+
export function softBreakHtml(clean) {
|
|
100
|
+
const doc = new DOMParser().parseFromString(clean, 'text/html');
|
|
101
|
+
breakNode(doc.body);
|
|
102
|
+
return doc.body.innerHTML;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** @param {Node} parent */
|
|
106
|
+
function breakNode(parent) {
|
|
107
|
+
// Snapshot: breaking replaces text nodes with fragments as we walk.
|
|
108
|
+
const children = Array.prototype.slice.call(parent.childNodes);
|
|
109
|
+
for (let i = 0; i < children.length; i++) {
|
|
110
|
+
const node = children[i];
|
|
111
|
+
if (node.nodeType === 3) {
|
|
112
|
+
breakText(/** @type {Text} */ (node));
|
|
113
|
+
} else if (
|
|
114
|
+
node.nodeType === 1 &&
|
|
115
|
+
!SKIP_TAGS[/** @type {Element} */ (node).tagName]
|
|
116
|
+
) {
|
|
117
|
+
breakNode(node);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Replace one text node with its lines separated by <br>.
|
|
124
|
+
* @param {Text} node
|
|
125
|
+
*/
|
|
126
|
+
function breakText(node) {
|
|
127
|
+
const doc = node.ownerDocument;
|
|
128
|
+
let text = node.nodeValue || '';
|
|
129
|
+
if (!doc || (text.indexOf('\n') === -1 && text.indexOf(MARKER) === -1)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// A newline against a block is snarkdown's formatting, not a typed line.
|
|
133
|
+
if (isBlockEdge(node.previousSibling)) text = text.replace(LEAD_RE, '');
|
|
134
|
+
if (isBlockEdge(node.nextSibling)) text = text.replace(TAIL_RE, '');
|
|
135
|
+
if (text.indexOf('\n') === -1) {
|
|
136
|
+
node.nodeValue = text.split(MARKER).join('');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const lines = text.split('\n');
|
|
140
|
+
const frag = doc.createDocumentFragment();
|
|
141
|
+
for (let i = 0; i < lines.length; i++) {
|
|
142
|
+
if (i > 0) frag.appendChild(doc.createElement('br'));
|
|
143
|
+
// A marked line is a blank one: the <br> pair around it is the whole line.
|
|
144
|
+
const line = lines[i].split(MARKER).join('');
|
|
145
|
+
if (line) frag.appendChild(doc.createTextNode(line));
|
|
146
|
+
}
|
|
147
|
+
node.parentNode && node.parentNode.replaceChild(frag, node);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* True at the start/end of the enclosing block, or against a sibling that
|
|
152
|
+
* breaks the line on its own — a <br> there would be a stray blank line.
|
|
153
|
+
*
|
|
154
|
+
* @param {Node|null} sibling
|
|
155
|
+
* @returns {boolean}
|
|
156
|
+
*/
|
|
157
|
+
function isBlockEdge(sibling) {
|
|
158
|
+
if (!sibling) return true;
|
|
159
|
+
return (
|
|
160
|
+
sibling.nodeType === 1 &&
|
|
161
|
+
BLOCK_TAGS[/** @type {Element} */ (sibling).tagName] === true
|
|
162
|
+
);
|
|
163
|
+
}
|
|
@@ -214,15 +214,17 @@ export function TaskDetailPage(props) {
|
|
|
214
214
|
// Nothing to say without a description or parts: drop the card.
|
|
215
215
|
task.description || consumables.length
|
|
216
216
|
? html`<div class="card">
|
|
217
|
-
<h3>Description</h3>
|
|
218
217
|
${
|
|
219
218
|
task.description
|
|
220
|
-
? html
|
|
221
|
-
|
|
219
|
+
? html`<h3>Description</h3>
|
|
220
|
+
<${MarkdownView} markdown=${task.description} />`
|
|
221
|
+
: null
|
|
222
222
|
}
|
|
223
223
|
${
|
|
224
224
|
consumables.length
|
|
225
|
-
? html`<div
|
|
225
|
+
? html`<div
|
|
226
|
+
style=${task.description ? 'margin-top:16px' : ''}
|
|
227
|
+
>
|
|
226
228
|
<h3>Consumables</h3>
|
|
227
229
|
<ul class="consumables-list">
|
|
228
230
|
${consumables.map(
|
package/public/app/types.js
CHANGED
package/public/styles/main.css
CHANGED
|
@@ -624,9 +624,9 @@ pre {
|
|
|
624
624
|
background: var(--ok-bg);
|
|
625
625
|
color: var(--ok);
|
|
626
626
|
}
|
|
627
|
-
.badge.
|
|
628
|
-
background: var(--
|
|
629
|
-
color: var(--
|
|
627
|
+
.badge.info {
|
|
628
|
+
background: var(--info-bg);
|
|
629
|
+
color: var(--info);
|
|
630
630
|
}
|
|
631
631
|
|
|
632
632
|
/* stock status badge (parts linked via signalk-stowage-mgmt) */
|
package/public/styles/tokens.css
CHANGED
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
--ok: #2b8a3e;
|
|
23
23
|
--ok-hover: #237434;
|
|
24
24
|
--ok-bg: #d3f9d8;
|
|
25
|
-
--
|
|
26
|
-
--
|
|
25
|
+
--info: #5c6570;
|
|
26
|
+
--info-bg: #e9ecef;
|
|
27
27
|
--shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
|
|
28
28
|
--overlay: rgba(20, 24, 28, 0.5);
|
|
29
29
|
}
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
--ok: #69db7c;
|
|
49
49
|
--ok-hover: #8ce99a;
|
|
50
50
|
--ok-bg: #1e3325;
|
|
51
|
-
--
|
|
52
|
-
--
|
|
51
|
+
--info: #9aa4ae;
|
|
52
|
+
--info-bg: #272d33;
|
|
53
53
|
--shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
|
|
54
54
|
--overlay: rgba(0, 0, 0, 0.65);
|
|
55
55
|
}
|