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.
@@ -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,cAqC3B,CAAA;AAuCD,eAAe,aAAa,CAAA"}
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
- console.log();
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","console","log","uri","site","render","context","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 console.log()\n if (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":[]}
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
- const element = ct === 'text/markdown' ? 'DIV' : 'IFRAME';
75
- const frame = myDocument.createElement(element);
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
- // render markdown to html
93
- const markdownHtml = function () {
94
- kb.fetcher.webOperation('GET', subject.uri).then(response => {
95
- const markdownText = response.responseText;
96
- const lines = Math.min(30, markdownText.split(/\n/).length + 5);
97
- const res = _marked.marked.parse(markdownText);
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
- setIframeAttributes(frame, blob, lines);
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":[]}
@@ -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');