solid-panes 4.0.0 → 4.1.0-2cd4b385
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/dashboard/dashboardPane.d.ts.map +1 -1
- package/dist/dashboard/dashboardPane.js +1 -2
- package/dist/dashboard/dashboardPane.js.map +1 -1
- package/dist/humanReadablePane.js +51 -24
- package/dist/humanReadablePane.js.map +1 -1
- package/dist/outline/manager.js +1 -1
- package/dist/outline/manager.js.map +1 -1
- package/dist/versionInfo.js +25 -26
- package/dist/versionInfo.js.map +1 -1
- package/package.json +45 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardPane.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboardPane.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,cAAc,EAAE,MAAM,eAAe,CAAA;AAElE,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"dashboardPane.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboardPane.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,cAAc,EAAE,MAAM,eAAe,CAAA;AAElE,eAAO,MAAM,aAAa,EAAE,cAoC3B,CAAA;AAuCD,eAAe,aAAa,CAAA"}
|
|
@@ -11,8 +11,7 @@ const dashboardPane = exports.dashboardPane = {
|
|
|
11
11
|
icon: _solidUi.icons.iconBase + 'noun_547570.svg',
|
|
12
12
|
name: 'dashboard',
|
|
13
13
|
label: subject => {
|
|
14
|
-
|
|
15
|
-
if (subject.uri === subject.site().uri) {
|
|
14
|
+
if (subject.termType === 'NamedNode' && subject.uri === subject.site().uri) {
|
|
16
15
|
return 'Dashboard';
|
|
17
16
|
}
|
|
18
17
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardPane.js","names":["_solidUi","require","_solidLogic","_homepage","dashboardPane","exports","icon","icons","iconBase","name","label","subject","
|
|
1
|
+
{"version":3,"file":"dashboardPane.js","names":["_solidUi","require","_solidLogic","_homepage","dashboardPane","exports","icon","icons","iconBase","name","label","subject","termType","uri","site","render","context","console","log","dom","container","createElement","runBuildPage","innerHTML","buildPage","authn","currentUser","authSession","events","on","webId","URL","window","location","href","searchParams","get","buildDashboard","buildHomePage","outliner","getOutliner","getDashboard","then","dashboard","appendChild","wrapper","document","shadow","attachShadow","mode","link","rel","generateHomepage","store","fetcher","homepage","_default","default"],"sources":["../../src/dashboard/dashboardPane.ts"],"sourcesContent":["import { icons } from 'solid-ui'\nimport { authn, authSession, store } from 'solid-logic'\nimport { Fetcher, NamedNode } from 'rdflib'\nimport { generateHomepage } from './homepage'\nimport { DataBrowserContext, PaneDefinition } from 'pane-registry'\n\nexport const dashboardPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_547570.svg',\n name: 'dashboard',\n label: subject => {\n if (subject.termType === 'NamedNode' && subject.uri === subject.site().uri) {\n return 'Dashboard'\n }\n return null\n },\n render: (subject, context) => {\n console.log('Dashboard Pane Render')\n const dom = context.dom\n const container = dom.createElement('div')\n const runBuildPage = () => {\n container.innerHTML = ''\n buildPage(\n container,\n authn.currentUser() || null,\n context,\n subject\n )\n }\n\n authSession.events.on('login', () => {\n // console.log('On Login')\n runBuildPage()\n })\n authSession.events.on('sessionRestore', () => {\n // console.log('On Session Restore')\n runBuildPage()\n })\n // console.log('Initial Load')\n runBuildPage()\n\n return container\n }\n}\n\nfunction buildPage (\n container: HTMLElement,\n webId: NamedNode | null,\n context: DataBrowserContext,\n subject: NamedNode\n) {\n // if uri then SolidOS is a browse.html web app\n const uri = (new URL(window.location.href)).searchParams.get('uri')\n if (webId && (uri || webId.site().uri === subject.site().uri)) {\n return buildDashboard(container, context)\n }\n return buildHomePage(container, subject)\n}\n\nfunction buildDashboard (container: HTMLElement, context: DataBrowserContext) {\n // console.log('build dashboard')\n // @@ TODO get a proper type\n const outliner: any = context.getOutliner(context.dom)\n outliner\n .getDashboard()\n .then((dashboard: HTMLElement) => container.appendChild(dashboard))\n}\n\nfunction buildHomePage (container: HTMLElement, subject: NamedNode) {\n // console.log('build home page')\n const wrapper = document.createElement('div')\n container.appendChild(wrapper)\n const shadow = wrapper.attachShadow({ mode: 'open' })\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = '/common/css/bootstrap.min.css'\n shadow.appendChild(link)\n generateHomepage(subject, store, store.fetcher as Fetcher).then(homepage =>\n shadow.appendChild(homepage)\n )\n}\n\nexport default dashboardPane\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,6 +15,12 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
15
15
|
** This is for peeking at a page, because the user might not want to leave the data browser.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
// Helper function to check if a URI has a markdown file extension
|
|
19
|
+
const isMarkdownFile = uri => {
|
|
20
|
+
if (!uri) return false;
|
|
21
|
+
const path = uri.split('?')[0].split('#')[0]; // Remove query string and fragment
|
|
22
|
+
return /\.(md|markdown|mdown|mkd|mkdn)$/i.test(path);
|
|
23
|
+
};
|
|
18
24
|
const humanReadablePane = {
|
|
19
25
|
icon: _solidUi.icons.originalIconBase + 'tango/22-text-x-generic.png',
|
|
20
26
|
name: 'humanReadable',
|
|
@@ -52,6 +58,11 @@ const humanReadablePane = {
|
|
|
52
58
|
|
|
53
59
|
const t = kb.findTypeURIs(subject);
|
|
54
60
|
if (t[_solidUi.ns.link('WebPage').uri]) return 'view';
|
|
61
|
+
|
|
62
|
+
// Check file extension for markdown files
|
|
63
|
+
if (isMarkdownFile(subject.uri)) {
|
|
64
|
+
return 'View';
|
|
65
|
+
}
|
|
55
66
|
if (hasContentTypeIn(kb, subject, allowed) || hasContentTypeIn2(kb, subject, allowed)) {
|
|
56
67
|
return 'View';
|
|
57
68
|
}
|
|
@@ -63,6 +74,9 @@ const humanReadablePane = {
|
|
|
63
74
|
const kb = context.session.store;
|
|
64
75
|
const cts = kb.fetcher.getHeader(subject.doc(), 'content-type');
|
|
65
76
|
const ct = cts ? cts[0].split(';', 1)[0].trim() : null; // remove content-type parameters
|
|
77
|
+
|
|
78
|
+
// Fallback: detect markdown by file extension if content-type is not text/markdown
|
|
79
|
+
const isMarkdown = ct === 'text/markdown' || isMarkdownFile(subject.uri);
|
|
66
80
|
if (ct) {
|
|
67
81
|
// console.log('humanReadablePane: c-t:' + ct)
|
|
68
82
|
} else {
|
|
@@ -71,8 +85,22 @@ const humanReadablePane = {
|
|
|
71
85
|
|
|
72
86
|
// @@ When we can, use CSP to turn off scripts within the iframe
|
|
73
87
|
div.setAttribute('class', 'docView');
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
|
|
89
|
+
// render markdown to html in a DIV element
|
|
90
|
+
const renderMarkdownContent = function (frame) {
|
|
91
|
+
kb.fetcher.webOperation('GET', subject.uri).then(response => {
|
|
92
|
+
const markdownText = response.responseText;
|
|
93
|
+
const lines = Math.min(30, markdownText.split(/\n/).length + 5);
|
|
94
|
+
const res = _marked.marked.parse(markdownText);
|
|
95
|
+
const clean = _dompurify.default.sanitize(res);
|
|
96
|
+
frame.innerHTML = clean;
|
|
97
|
+
frame.setAttribute('class', 'doc');
|
|
98
|
+
frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`);
|
|
99
|
+
}).catch(error => {
|
|
100
|
+
console.error('Error fetching markdown content:', error);
|
|
101
|
+
frame.innerHTML = '<p>Error loading content</p>';
|
|
102
|
+
});
|
|
103
|
+
};
|
|
76
104
|
const setIframeAttributes = (frame, blob, lines) => {
|
|
77
105
|
frame.setAttribute('src', URL.createObjectURL(blob));
|
|
78
106
|
frame.setAttribute('type', blob.type);
|
|
@@ -88,25 +116,16 @@ const humanReadablePane = {
|
|
|
88
116
|
frame.setAttribute('sandbox', 'allow-scripts allow-same-origin');
|
|
89
117
|
}
|
|
90
118
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const clean = _dompurify.default.sanitize(res);
|
|
99
|
-
frame.innerHTML = clean;
|
|
100
|
-
frame.setAttribute('class', 'doc');
|
|
101
|
-
frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`);
|
|
102
|
-
}).catch(error => {
|
|
103
|
-
console.error('Error fetching markdown content:', error);
|
|
104
|
-
frame.innerHTML = '<p>Error loading content</p>';
|
|
105
|
-
});
|
|
106
|
-
};
|
|
107
|
-
if (ct === 'text/markdown') {
|
|
108
|
-
markdownHtml();
|
|
119
|
+
if (isMarkdown) {
|
|
120
|
+
// For markdown, use a DIV element and render the content
|
|
121
|
+
const frame = myDocument.createElement('DIV');
|
|
122
|
+
renderMarkdownContent(frame);
|
|
123
|
+
const tr = myDocument.createElement('TR');
|
|
124
|
+
tr.appendChild(frame);
|
|
125
|
+
div.appendChild(tr);
|
|
109
126
|
} else {
|
|
127
|
+
// For other content types, use IFRAME
|
|
128
|
+
const frame = myDocument.createElement('IFRAME');
|
|
110
129
|
// Fetch and process the blob
|
|
111
130
|
kb.fetcher._fetch(subject.uri).then(response => response.blob()).then(blob => {
|
|
112
131
|
const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve('');
|
|
@@ -120,14 +139,22 @@ const humanReadablePane = {
|
|
|
120
139
|
}) => {
|
|
121
140
|
const newLines = blobText.includes('<script src="https://dokie.li/scripts/dokieli.js">') ? -10 : 5;
|
|
122
141
|
const lines = Math.min(30, blobText.split(/\n/).length + newLines);
|
|
123
|
-
|
|
142
|
+
// For text content, create a new blob with proper charset to avoid encoding warnings
|
|
143
|
+
if (blob.type.startsWith('text/') && !blob.type.includes('charset')) {
|
|
144
|
+
const newBlob = new Blob([blobText], {
|
|
145
|
+
type: blob.type + '; charset=utf-8'
|
|
146
|
+
});
|
|
147
|
+
setIframeAttributes(frame, newBlob, lines);
|
|
148
|
+
} else {
|
|
149
|
+
setIframeAttributes(frame, blob, lines);
|
|
150
|
+
}
|
|
124
151
|
}).catch(err => {
|
|
125
152
|
console.log('Error fetching or processing blob:', err);
|
|
126
153
|
});
|
|
154
|
+
const tr = myDocument.createElement('TR');
|
|
155
|
+
tr.appendChild(frame);
|
|
156
|
+
div.appendChild(tr);
|
|
127
157
|
}
|
|
128
|
-
const tr = myDocument.createElement('TR');
|
|
129
|
-
tr.appendChild(frame);
|
|
130
|
-
div.appendChild(tr);
|
|
131
158
|
return div;
|
|
132
159
|
}
|
|
133
160
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humanReadablePane.js","names":["_solidUi","require","_rdflib","_marked","_dompurify","_interopRequireDefault","e","__esModule","default","humanReadablePane","icon","icons","originalIconBase","name","label","subject","context","kb","session","store","allowed","hasContentTypeIn","x","displayables","cts","fetcher","getHeader","j","length","k","indexOf","hasContentTypeIn2","t","findTypeURIs","Util","mediaTypeClass","uri","ns","link","render","myDocument","dom","div","createElement","doc","ct","split","trim","console","log","setAttribute","element","frame","setIframeAttributes","blob","lines","URL","createObjectURL","type","markdownHtml","webOperation","then","response","markdownText","responseText","Math","min","res","marked","parse","clean","DOMPurify","sanitize","innerHTML","catch","error","_fetch","blobTextPromise","startsWith","text","Promise","resolve","blobText","newLines","includes","err","tr","appendChild","_default","exports"],"sources":["../src/humanReadablePane.js"],"sourcesContent":["/* Human-readable Pane\n **\n ** This outline pane contains the document contents for an HTML document\n ** This is for peeking at a page, because the user might not want to leave the data browser.\n */\nimport { icons, ns } from 'solid-ui'\nimport { Util } from 'rdflib'\nimport { marked } from 'marked'\nimport DOMPurify from 'dompurify'\n\nconst humanReadablePane = {\n icon: icons.originalIconBase + 'tango/22-text-x-generic.png',\n\n name: 'humanReadable',\n\n label: function (subject, context) {\n const kb = context.session.store\n\n // See also the source pane, which has lower precedence.\n\n const allowed = [\n 'text/plain',\n 'text/html',\n 'text/markdown',\n 'application/xhtml+xml',\n 'image/png',\n 'image/jpeg',\n 'application/pdf',\n 'video/mp4'\n ]\n\n const hasContentTypeIn = function (kb, x, displayables) {\n const cts = kb.fetcher.getHeader(x, 'content-type')\n if (cts) {\n for (let j = 0; j < cts.length; j++) {\n for (let k = 0; k < displayables.length; k++) {\n if (cts[j].indexOf(displayables[k]) >= 0) {\n return true\n }\n }\n }\n }\n return false\n }\n\n // This data could come from a fetch OR from ldp container\n const hasContentTypeIn2 = function (kb, x, displayables) {\n const t = kb.findTypeURIs(x)\n for (let k = 0; k < displayables.length; k++) {\n if (Util.mediaTypeClass(displayables[k]).uri in t) {\n return true\n }\n }\n return false\n }\n\n if (!subject.uri) return null // no bnodes\n\n const t = kb.findTypeURIs(subject)\n if (t[ns.link('WebPage').uri]) return 'view'\n\n if (\n hasContentTypeIn(kb, subject, allowed) ||\n hasContentTypeIn2(kb, subject, allowed)\n ) {\n return 'View'\n }\n\n return null\n },\n\n render: function (subject, context) {\n const myDocument = context.dom\n const div = myDocument.createElement('div')\n const kb = context.session.store\n\n const cts = kb.fetcher.getHeader(subject.doc(), 'content-type')\n const ct = cts ? cts[0].split(';', 1)[0].trim() : null // remove content-type parameters\n if (ct) {\n // console.log('humanReadablePane: c-t:' + ct)\n } else {\n console.log('humanReadablePane: unknown content-type?')\n }\n\n // @@ When we can, use CSP to turn off scripts within the iframe\n div.setAttribute('class', 'docView')\n const element = ct === 'text/markdown' ? 'DIV' : 'IFRAME'\n const frame = myDocument.createElement(element)\n\n const setIframeAttributes = (frame, blob, lines) => {\n frame.setAttribute('src', URL.createObjectURL(blob))\n frame.setAttribute('type', blob.type)\n frame.setAttribute('class', 'doc')\n frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)\n\n // Apply sandbox attribute only for HTML files\n // @@ Note below - if we set ANY sandbox, then Chrome and Safari won't display it if it is PDF.\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe\n // You can't have any sandbox and allow plugins.\n // We could sandbox only HTML files I suppose.\n if (blob.type === 'text/html' || blob.type === 'application/xhtml+xml') {\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin')\n }\n }\n\n // render markdown to html\n const markdownHtml = function () {\n kb.fetcher.webOperation('GET', subject.uri).then(response => {\n const markdownText = response.responseText\n const lines = Math.min(30, markdownText.split(/\\n/).length + 5)\n const res = marked.parse(markdownText)\n const clean = DOMPurify.sanitize(res)\n frame.innerHTML = clean\n frame.setAttribute('class', 'doc')\n frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)\n }).catch(error => {\n console.error('Error fetching markdown content:', error)\n frame.innerHTML = '<p>Error loading content</p>'\n })\n }\n\n if (ct === 'text/markdown') {\n markdownHtml()\n } else {\n // Fetch and process the blob\n kb.fetcher._fetch(subject.uri)\n .then(response => response.blob())\n .then(blob => {\n const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve('')\n return blobTextPromise.then(blobText => ({ blob, blobText }))\n })\n .then(({ blob, blobText }) => {\n const newLines = blobText.includes('<script src=\"https://dokie.li/scripts/dokieli.js\">') ? -10 : 5\n const lines = Math.min(30, blobText.split(/\\n/).length + newLines)\n setIframeAttributes(frame, blob, lines)\n })\n .catch(err => {\n console.log('Error fetching or processing blob:', err)\n })\n }\n\n const tr = myDocument.createElement('TR')\n tr.appendChild(frame)\n div.appendChild(tr)\n return div\n }\n}\n\nexport default humanReadablePane\n// ends\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"humanReadablePane.js","names":["_solidUi","require","_rdflib","_marked","_dompurify","_interopRequireDefault","e","__esModule","default","isMarkdownFile","uri","path","split","test","humanReadablePane","icon","icons","originalIconBase","name","label","subject","context","kb","session","store","allowed","hasContentTypeIn","x","displayables","cts","fetcher","getHeader","j","length","k","indexOf","hasContentTypeIn2","t","findTypeURIs","Util","mediaTypeClass","ns","link","render","myDocument","dom","div","createElement","doc","ct","trim","isMarkdown","console","log","setAttribute","renderMarkdownContent","frame","webOperation","then","response","markdownText","responseText","lines","Math","min","res","marked","parse","clean","DOMPurify","sanitize","innerHTML","catch","error","setIframeAttributes","blob","URL","createObjectURL","type","tr","appendChild","_fetch","blobTextPromise","startsWith","text","Promise","resolve","blobText","newLines","includes","newBlob","Blob","err","_default","exports"],"sources":["../src/humanReadablePane.js"],"sourcesContent":["/* Human-readable Pane\n **\n ** This outline pane contains the document contents for an HTML document\n ** This is for peeking at a page, because the user might not want to leave the data browser.\n */\nimport { icons, ns } from 'solid-ui'\nimport { Util } from 'rdflib'\nimport { marked } from 'marked'\nimport DOMPurify from 'dompurify'\n\n// Helper function to check if a URI has a markdown file extension\nconst isMarkdownFile = (uri) => {\n if (!uri) return false\n const path = uri.split('?')[0].split('#')[0] // Remove query string and fragment\n return /\\.(md|markdown|mdown|mkd|mkdn)$/i.test(path)\n}\n\nconst humanReadablePane = {\n icon: icons.originalIconBase + 'tango/22-text-x-generic.png',\n\n name: 'humanReadable',\n\n label: function (subject, context) {\n const kb = context.session.store\n\n // See also the source pane, which has lower precedence.\n\n const allowed = [\n 'text/plain',\n 'text/html',\n 'text/markdown',\n 'application/xhtml+xml',\n 'image/png',\n 'image/jpeg',\n 'application/pdf',\n 'video/mp4'\n ]\n\n const hasContentTypeIn = function (kb, x, displayables) {\n const cts = kb.fetcher.getHeader(x, 'content-type')\n if (cts) {\n for (let j = 0; j < cts.length; j++) {\n for (let k = 0; k < displayables.length; k++) {\n if (cts[j].indexOf(displayables[k]) >= 0) {\n return true\n }\n }\n }\n }\n return false\n }\n\n // This data could come from a fetch OR from ldp container\n const hasContentTypeIn2 = function (kb, x, displayables) {\n const t = kb.findTypeURIs(x)\n for (let k = 0; k < displayables.length; k++) {\n if (Util.mediaTypeClass(displayables[k]).uri in t) {\n return true\n }\n }\n return false\n }\n\n if (!subject.uri) return null // no bnodes\n\n const t = kb.findTypeURIs(subject)\n if (t[ns.link('WebPage').uri]) return 'view'\n\n // Check file extension for markdown files\n if (isMarkdownFile(subject.uri)) {\n return 'View'\n }\n\n if (\n hasContentTypeIn(kb, subject, allowed) ||\n hasContentTypeIn2(kb, subject, allowed)\n ) {\n return 'View'\n }\n\n return null\n },\n\n render: function (subject, context) {\n const myDocument = context.dom\n const div = myDocument.createElement('div')\n const kb = context.session.store\n\n const cts = kb.fetcher.getHeader(subject.doc(), 'content-type')\n const ct = cts ? cts[0].split(';', 1)[0].trim() : null // remove content-type parameters\n\n // Fallback: detect markdown by file extension if content-type is not text/markdown\n const isMarkdown = ct === 'text/markdown' || isMarkdownFile(subject.uri)\n\n if (ct) {\n // console.log('humanReadablePane: c-t:' + ct)\n } else {\n console.log('humanReadablePane: unknown content-type?')\n }\n\n // @@ When we can, use CSP to turn off scripts within the iframe\n div.setAttribute('class', 'docView')\n\n // render markdown to html in a DIV element\n const renderMarkdownContent = function (frame) {\n kb.fetcher.webOperation('GET', subject.uri).then(response => {\n const markdownText = response.responseText\n const lines = Math.min(30, markdownText.split(/\\n/).length + 5)\n const res = marked.parse(markdownText)\n const clean = DOMPurify.sanitize(res)\n frame.innerHTML = clean\n frame.setAttribute('class', 'doc')\n frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)\n }).catch(error => {\n console.error('Error fetching markdown content:', error)\n frame.innerHTML = '<p>Error loading content</p>'\n })\n }\n\n const setIframeAttributes = (frame, blob, lines) => {\n frame.setAttribute('src', URL.createObjectURL(blob))\n frame.setAttribute('type', blob.type)\n frame.setAttribute('class', 'doc')\n frame.setAttribute('style', `border: 1px solid; padding: 1em; height: ${lines}em; width: 800px; resize: both; overflow: auto;`)\n\n // Apply sandbox attribute only for HTML files\n // @@ Note below - if we set ANY sandbox, then Chrome and Safari won't display it if it is PDF.\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe\n // You can't have any sandbox and allow plugins.\n // We could sandbox only HTML files I suppose.\n if (blob.type === 'text/html' || blob.type === 'application/xhtml+xml') {\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin')\n }\n }\n\n if (isMarkdown) {\n // For markdown, use a DIV element and render the content\n const frame = myDocument.createElement('DIV')\n renderMarkdownContent(frame)\n const tr = myDocument.createElement('TR')\n tr.appendChild(frame)\n div.appendChild(tr)\n } else {\n // For other content types, use IFRAME\n const frame = myDocument.createElement('IFRAME')\n // Fetch and process the blob\n kb.fetcher._fetch(subject.uri)\n .then(response => response.blob())\n .then(blob => {\n const blobTextPromise = blob.type.startsWith('text') ? blob.text() : Promise.resolve('')\n return blobTextPromise.then(blobText => ({ blob, blobText }))\n })\n .then(({ blob, blobText }) => {\n const newLines = blobText.includes('<script src=\"https://dokie.li/scripts/dokieli.js\">') ? -10 : 5\n const lines = Math.min(30, blobText.split(/\\n/).length + newLines)\n // For text content, create a new blob with proper charset to avoid encoding warnings\n if (blob.type.startsWith('text/') && !blob.type.includes('charset')) {\n const newBlob = new Blob([blobText], { type: blob.type + '; charset=utf-8' })\n setIframeAttributes(frame, newBlob, lines)\n } else {\n setIframeAttributes(frame, blob, lines)\n }\n })\n .catch(err => {\n console.log('Error fetching or processing blob:', err)\n })\n const tr = myDocument.createElement('TR')\n tr.appendChild(frame)\n div.appendChild(tr)\n }\n\n return div\n }\n}\n\nexport default humanReadablePane\n// ends\n"],"mappings":"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","ignoreList":[]}
|
package/dist/outline/manager.js
CHANGED
|
@@ -203,7 +203,7 @@ function _default(context) {
|
|
|
203
203
|
// some choices of predicate
|
|
204
204
|
lab = UI.utils.predicateLabelForXML(predicate.elements[0], inverse);
|
|
205
205
|
}
|
|
206
|
-
lab = lab.slice(0, 1).toUpperCase() + lab.slice(1);
|
|
206
|
+
lab = lab ? lab.slice(0, 1).toUpperCase() + lab.slice(1) : '...';
|
|
207
207
|
// if (kb.statementsMatching(predicate,rdf('type'), UI.ns.link('Request')).length) predicateTD.className='undetermined';
|
|
208
208
|
|
|
209
209
|
const labelTD = dom.createElement('TD');
|