hdoc-tools 0.17.29 → 0.17.31

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/hdoc-serve.js CHANGED
@@ -48,7 +48,12 @@
48
48
  const hdocbook_project_config_path = path.join(source_path, 'hdocbook-project.json');
49
49
 
50
50
  // Load the hdocbook config file
51
- hdocbook_project = require(hdocbook_project_config_path);
51
+ try {
52
+ hdocbook_project = require(hdocbook_project_config_path);
53
+ } catch (e) {
54
+ console.log(`\nFailed to load hdocbook-project.json:\n${e}\n`);
55
+ process.exit(1);
56
+ }
52
57
 
53
58
  // Get the ID of the hdocbook we are serving
54
59
  docId = hdocbook_project.docId;
@@ -78,7 +83,12 @@
78
83
  const hdocbook_path = path.join(source_path, docId, 'hdocbook.json');
79
84
 
80
85
  // Pull in the book config file
81
- hdocbook_config = require(hdocbook_path);
86
+ try {
87
+ hdocbook_config = require(hdocbook_path);
88
+ } catch (e) {
89
+ console.log(`\nFailed to load hdocbook.json:${e}\n`);
90
+ process.exit(1);
91
+ }
82
92
 
83
93
  app.get('/_books/library.json', function (req, res) {
84
94
  let library = {
@@ -290,6 +300,15 @@
290
300
  return;
291
301
  }
292
302
  } else if (fs.existsSync(file_path)) {
303
+ if (file_path.endsWith('hdocbook.json') || file_path.endsWith('hdocbook_project.json')) {
304
+ try {
305
+ // Read & parse file
306
+ JSON.parse(fs.readFileSync(file_path));
307
+ } catch (e) {
308
+ console.log(`Error parsing hdocbook.json: ${e}`);
309
+
310
+ }
311
+ }
293
312
  send_file(req, res, file_path);
294
313
  return;
295
314
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hdoc-tools",
3
- "version": "0.17.29",
3
+ "version": "0.17.31",
4
4
  "description": "Hornbill HDocBook Development Support Tool",
5
5
  "main": "hdoc.js",
6
6
  "bin": {
@@ -0,0 +1,6 @@
1
+ <h1>FAILED TO LOAD HDOC MENU</h1>
2
+ <div class="alert alert-danger" role="alert">
3
+ <strong>Warning!</strong>
4
+ <p><strong>hdoc serve</strong> has failed to load the book navigation. This is due to invalid JSON in the <code>hdocbook.json</code> file in your book.</p>
5
+ <p>Please fix the broken JSON, then refresh your browser to reload the book.</p>
6
+ </div>
@@ -0,0 +1,7 @@
1
+ <h1>FAILED TO LOAD HDOC MENU</h1>
2
+ <div class="alert alert-danger" role="alert">
3
+ <p><code>hdoc serve</code> has failed to load the book navigation. This is due to invalid JSON in the <code>hdocbook.json</code> file in your book.</p>
4
+ <p>Please fix the broken JSON, then refresh your browser to reload the book.</p>
5
+ <p>{{docApp.error}}</p>
6
+ </div>
7
+ </div>
package/ui/index.html CHANGED
@@ -138,6 +138,7 @@
138
138
 
139
139
  <h2 class="title">{{docApp.title}}</h2>
140
140
  <h6 class="description">{{docApp.description}}</h6>
141
+
141
142
  <!-- could generate nav bar based on library settings -->
142
143
  <!--
143
144
  <ul class="nav-bar-nav-list">
@@ -240,59 +241,69 @@
240
241
  <div v-show="!docApp.showInlineDocumentsMarkup" class="injected-document-container hb-container-horizontal">
241
242
 
242
243
  <div class="injected-document-content">
243
- <div class="document-header">
244
-
245
- <!-- breadcrumb-->
246
- <div class="hb-container-horizontal">
247
- <div class="hb-center-v hb-container-expand">
248
- <ul class="ps-0 nav-bar-nav-list noeffects after-fslash overflow-ellipsis">
249
- <li class="mt-0 nav-bar-item"
250
- v-for="(crumb,$index) in docApp.bookBreadCrumb">
251
- <a class="ps-0 pe-0 text-decoration-none"
252
- v-bind:href="crumb.link">{{crumb.title}}</a>
253
- </li>
254
- </ul>
244
+ <div v-if="docApp.error === ''">
245
+ <div class="document-header">
246
+
247
+ <!-- breadcrumb-->
248
+ <div class="hb-container-horizontal">
249
+ <div class="hb-center-v hb-container-expand">
250
+ <ul class="ps-0 nav-bar-nav-list noeffects after-fslash overflow-ellipsis">
251
+ <li class="mt-0 nav-bar-item"
252
+ v-for="(crumb,$index) in docApp.bookBreadCrumb">
253
+ <a class="ps-0 pe-0 text-decoration-none"
254
+ v-bind:href="crumb.link">{{crumb.title}}</a>
255
+ </li>
256
+ </ul>
257
+ </div>
258
+ <div class="toolbar-right hb-center-v">
259
+
260
+ <a class="toolbar-action" v-bind:href="docApp.documentGithubUrl"
261
+ target="_blank">
262
+ <i class="bi bi-pencil"></i>
263
+ </a>
264
+
265
+ <a class="toolbar-action">
266
+ <i class="bi bi-three-dots-vertical"></i>
267
+ </a>
268
+ </div>
255
269
  </div>
256
- <div class="toolbar-right hb-center-v">
257
270
 
258
- <a class="toolbar-action" v-bind:href="docApp.documentGithubUrl"
259
- target="_blank">
260
- <i class="bi bi-pencil"></i>
261
- </a>
262
-
263
- <a class="toolbar-action">
264
- <i class="bi bi-three-dots-vertical"></i>
265
- </a>
271
+ <div class="document-title"></div>
272
+
273
+ <!-- doc frontmatter info -->
274
+ <div class="hb-container-horizontal">
275
+ <div class="hb-center-v hb-container-expand">
276
+ <ul
277
+ class="ps-0 nav-bar-nav-list noeffects after-bullets overflow-ellipsis text-light-2">
278
+ <li class="ps-0 mt-0 nav-bar-item">
279
+ Article
280
+ </li>
281
+ <li class="ps-0 mt-0 nav-bar-item">
282
+ YYYY-MM-DD
283
+ </li>
284
+ <li class="ps-0 mt-0 nav-bar-item">
285
+ (n) minutes to read
286
+ </li>
287
+ <li class="ps-0 mt-0 nav-bar-item">
288
+ <a class="link c-pointer">(n) contributors</a>
289
+ </li>
290
+ </ul>
291
+ </div>
292
+ <div class="toolbar-right hb-center-v">
293
+ </div>
266
294
  </div>
267
- </div>
268
295
 
269
- <div class="document-title"></div>
270
-
271
- <!-- doc frontmatter info -->
272
- <div class="hb-container-horizontal">
273
- <div class="hb-center-v hb-container-expand">
274
- <ul
275
- class="ps-0 nav-bar-nav-list noeffects after-bullets overflow-ellipsis text-light-2">
276
- <li class="ps-0 mt-0 nav-bar-item">
277
- Article
278
- </li>
279
- <li class="ps-0 mt-0 nav-bar-item">
280
- YYYY-MM-DD
281
- </li>
282
- <li class="ps-0 mt-0 nav-bar-item">
283
- (n) minutes to read
284
- </li>
285
- <li class="ps-0 mt-0 nav-bar-item">
286
- <a class="link c-pointer">(n) contributors</a>
287
- </li>
288
- </ul>
289
- </div>
290
- <div class="toolbar-right hb-center-v">
291
- </div>
292
296
  </div>
297
+ <div class="document-body"></div>
298
+ </div>
293
299
 
300
+ <div v-if="docApp.error !== ''">
301
+ <div class="alert alert-danger" role="alert">
302
+ <h1>Book Navigation Render Failed!</h1>
303
+ <p>This is likely due to invalid JSON in the <strong>hdocbook.json</strong> file in your book. Please fix the error below, then refresh your browser to reload the book.</p>
304
+ <p><code>{{docApp.error}}</code></p>
305
+ </div>
294
306
  </div>
295
- <div class="document-body"></div>
296
307
 
297
308
  </div>
298
309
 
@@ -246,10 +246,9 @@ function generateTableOfContentsFromDoc() {
246
246
  }
247
247
 
248
248
 
249
- function loadContentUrl(linkRef, fromPageRefresh, fromPopState) {
249
+ function loadContentUrl(linkRef, fromPageRefresh, fromPopState, fromBook = true) {
250
250
  //-- clear table of contents
251
251
  view.docApp.tableOfContents = [];
252
-
253
252
  if (linkRef.indexOf(window.location.origin + "/") === 0) {
254
253
  linkRef = linkRef.replace(window.location.origin + "/", "");
255
254
  }
@@ -260,15 +259,17 @@ function loadContentUrl(linkRef, fromPageRefresh, fromPopState) {
260
259
  linkRef = removeStartingSlash(linkRef);
261
260
 
262
261
  //-- update url in browser
263
- setBrowserViewUrl(linkRef, {}, fromPageRefresh, fromPopState);
264
-
262
+ if (fromBook) setBrowserViewUrl(linkRef, {}, fromPageRefresh, fromPopState);
265
263
  //-- destroy any existing content children and events properly
266
264
  jqContentContainer.empty();
267
265
  jqDocumentHeader.find(".document-title").empty();
268
-
266
+
269
267
  //-- for now just load whatever the href prop is (we can add actions to perform specific processing and then load content based on element atts etc)
270
268
  let frontmatterData = {};
271
- let booksLinkRef = linkRef.includes('_books/') ? linkRef : "_books/" + linkRef;
269
+ let booksLinkRef = linkRef;
270
+ if (fromBook) {
271
+ booksLinkRef = linkRef.includes('_books/') ? linkRef : "_books/" + linkRef;
272
+ }
272
273
  fetch(booksLinkRef).then(response => {
273
274
  if (response.headers.has("X-frontmatter")) {
274
275
  frontmatterData = response.headers.get("X-frontmatter");
@@ -333,7 +334,6 @@ function loadContentUrl(linkRef, fromPageRefresh, fromPopState) {
333
334
  });
334
335
  });
335
336
 
336
-
337
337
  //-- do any code highlighting
338
338
  if (hljs) {
339
339
  document.querySelectorAll('pre code').forEach((el) => {
@@ -372,8 +372,7 @@ function loadContentUrl(linkRef, fromPageRefresh, fromPopState) {
372
372
 
373
373
 
374
374
  setGitHubBookUrl(linkRef);
375
-
376
-
375
+
377
376
  //-- make sure selected link parents are set to .expand=true
378
377
  if (expandNavParentSectionBySelectedLinkHref(linkRef)) {
379
378
  view.updateCounter++;
@@ -381,7 +380,7 @@ function loadContentUrl(linkRef, fromPageRefresh, fromPopState) {
381
380
  //-- find any navigation links that match url and highlight
382
381
  // listenForHrefClicks();
383
382
  highlightNavigationLinkFromUrl(linkRef);
384
-
383
+
385
384
  //-- scroll to element that match hash (if have one)
386
385
  if (document.location.hash) {
387
386
  let gotoEle = getAnchorFromHash(document.location.hash);
@@ -390,7 +389,7 @@ function loadContentUrl(linkRef, fromPageRefresh, fromPopState) {
390
389
  });
391
390
  view.$forceUpdate();
392
391
  }
393
-
392
+
394
393
  listenForHrefClicks();
395
394
  });
396
395
  }
@@ -547,11 +546,11 @@ async function fetchJsonFile(strFilePath) {
547
546
 
548
547
 
549
548
  //-- THE INIT APP CALLED FROM index.html
550
- $(".document-body").attr("v-pre", "");
549
+ //$(".document-body").attr("v-pre", "");
551
550
 
552
551
  var view = new Vue({
553
552
  el: '#vDocDevApp',
554
- data: { userSession: {}, updateCounter: 0, bookId: "", docApp: {inlinePopupDocumentHref:"",showInlineDocumentsMarkup:false, keepTocLayout: false, book: {}, navSections: [], inlineDocumentItems:[], tableOfContents: [], bookBreadCrumb: [] } },
553
+ data: { userSession: {}, updateCounter: 0, bookId: "", docApp: {error: "", inlinePopupDocumentHref:"",showInlineDocumentsMarkup:false, keepTocLayout: false, book: {}, navSections: [], inlineDocumentItems:[], tableOfContents: [], bookBreadCrumb: [] } },
555
554
  methods: docAppMethods,
556
555
  directives: {
557
556
  somedirectivename: {
@@ -603,33 +602,6 @@ async function intialiseApp() {
603
602
  //jqContentContainer = $(".injected-document-content");
604
603
  jqLeftNav = $("#DocSidebarNav");
605
604
 
606
-
607
- //-- get session info
608
- /*
609
- let dummyResponse = {
610
- "type": "user",
611
- "userId": "doom-guy",
612
- "userName": "Doom Guy",
613
- "email": "doomguy@hornbill.com",
614
- "profileImage": "https://www.writeups.org/wp-content/uploads/Doomguy-doom-portrait-featured-sprite.jpg",
615
- "issuerDomain": ".hornbill.com",
616
- "issuerInstance": "hornbill",
617
- "validUntil": "2023-07-30 06:33:49Z"
618
- }
619
- dummyResponse.expiresDateTime = new Date(dummyResponse.validUntil).toLocaleDateString() + ' ' + new Date(dummyResponse.validUntil).toLocaleTimeString();
620
- */
621
-
622
- fetchJsonFile("_api/session/").then(function (sessionData) {
623
- hslDocLog.log("Hornbill docs get session data response", sessionData)
624
- if (sessionData && sessionData.type === "user") {
625
- hslDocLog.log("Hornbill docs set session set expires date time to browser locale")
626
- sessionData.expiresDateTime = new Date(sessionData.validUntil).toLocaleDateString() + ' ' + new Date(sessionData.validUntil).toLocaleTimeString();
627
- hslDocLog.log("Hornbill docs update vue session object model", sessionData);
628
- view.setSessionInfo(sessionData);
629
- }
630
- });
631
-
632
- //-- eof session stuff
633
605
  await fetchJsonFile("_books/library.json").then(function (data) {
634
606
 
635
607
  // Get docbook library list
@@ -674,12 +646,15 @@ async function intialiseApp() {
674
646
 
675
647
  }
676
648
  else {
677
- hslDocLog.log("initial first view link to laod is not present");
649
+ hslDocLog.log("initial first view link to load is not present");
678
650
  }
679
651
 
680
652
  $(".hb-hidden").removeClass("hb-hidden");
681
653
 
682
654
  }, 200);
655
+ }).catch(function (data) {
656
+ view.docApp.error = data;
657
+ $(".hb-hidden").removeClass("hb-hidden");
683
658
  });
684
659
  });
685
660
  }