@redpanda-data/docs-extensions-and-macros 3.0.15 → 3.0.17

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.
@@ -6,72 +6,91 @@
6
6
 
7
7
  module.exports.register = function ({ config }) {
8
8
  const logger = this.getLogger('term-aggregation-extension');
9
- const chalk = require('chalk')
9
+ const chalk = require('chalk');
10
+
11
+ function processTermContent(termContent) {
12
+ const hoverTextMatch = termContent.match(/:hover-text: (.*)/);
13
+ const hoverText = hoverTextMatch ? hoverTextMatch[1] : '';
14
+ if (hoverText && !termContent.includes('{hover-text}')) {
15
+ const firstNewlineIndex = termContent.indexOf('\n\n');
16
+ termContent = firstNewlineIndex !== -1
17
+ ? termContent.slice(0, firstNewlineIndex + 1) + hoverText + '\n' + termContent.slice(firstNewlineIndex + 1)
18
+ : termContent += '\n' + hoverText;
19
+ }
20
+
21
+ const linkMatch = termContent.match(/:link: (.*)/);
22
+ const link = linkMatch ? linkMatch[1] : '';
23
+ if (link) {
24
+ termContent += `\n\nFor more details, see ${link}`;
25
+ }
26
+
27
+ return termContent;
28
+ }
10
29
 
11
30
  this.on('contentAggregated', ({ siteCatalog, contentAggregate }) => {
12
31
  try {
32
+ siteCatalog.termsByCategory = {};
33
+
13
34
  for (const component of contentAggregate) {
14
35
  if (component.name === 'shared') {
15
36
  const termFiles = component.files.filter(file => file.path.includes('modules/terms/partials/'));
16
- siteCatalog.terms = {}
37
+
17
38
  termFiles.forEach(file => {
18
39
  const termContent = file.contents.toString('utf8');
19
- siteCatalog.terms[file.basename] = termContent;
40
+ const categoryMatch = /:category: (.*)/.exec(termContent);
41
+ var category = categoryMatch ? categoryMatch[1] : 'Miscellaneous'; // Default category
42
+
43
+ category = category.charAt(0).toUpperCase() + category.slice(1);
44
+
45
+ if (!siteCatalog.termsByCategory[category]) {
46
+ siteCatalog.termsByCategory[category] = [];
47
+ }
48
+
49
+ siteCatalog.termsByCategory[category].push({ name: file.basename, content: termContent });
20
50
  });
21
- console.log(chalk.green('Loaded terms from shared component.'));
22
- break
51
+
52
+ console.log(chalk.green('Categorized terms from shared component.'));
53
+ break;
23
54
  }
24
55
  }
25
56
  } catch (error) {
26
- logger.error(`Error loading terms: ${error.message}`);
57
+ logger.error(`Error categorizing terms: ${error.message}`);
27
58
  }
28
59
  })
29
60
 
30
61
  .on('contentClassified', ({ siteCatalog, contentCatalog }) => {
31
- const components = contentCatalog.getComponents()
62
+ const components = contentCatalog.getComponents();
32
63
  try {
33
- for (const { versions } of components) {
34
- for (const { name: component, version, asciidoc, title } of versions) {
35
- if (component == 'shared') continue;
36
- const glossaryPage = contentCatalog.resolvePage(`${version?version +'@':''}${component}:reference:glossary.adoc`);
64
+ components.forEach(({ versions }) => {
65
+ versions.forEach(({ name: component, version, asciidoc, title }) => {
66
+ if (component == 'shared') return;
67
+
68
+ const glossaryPage = contentCatalog.resolvePage(`${version ? version + '@' : ''}${component}:reference:glossary.adoc`);
69
+
37
70
  if (glossaryPage) {
38
- asciidoc.attributes['glossary-page'] = 'reference:glossary.adoc'
39
- const glossaryContent = glossaryPage.contents.toString('utf8');
40
- let newContent = glossaryContent;
41
- const sortedTerms = Object.keys(siteCatalog.terms).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
42
- for (i = 0; i < sortedTerms.length; i++) {
43
- const termName = sortedTerms[i];
44
- let termContent = siteCatalog.terms[termName];
45
- const hoverTextMatch = termContent.match(/:hover-text: (.*)/);
46
- const hoverText = hoverTextMatch ? hoverTextMatch[1] : '';
47
- const linkMatch = termContent.match(/:link: (.*)/);
48
- const link = linkMatch ? linkMatch[1] : '';
49
- // If the hover-text attribute is found and the content does not already contain {hover-text}, append it as a new line after the first newline
50
- if (hoverText && !termContent.includes('{hover-text}')) {
51
- const firstNewlineIndex = termContent.indexOf('\n\n');
52
- if (firstNewlineIndex !== -1) {
53
- termContent = termContent.slice(0, firstNewlineIndex + 1) + hoverText + '\n' + termContent.slice(firstNewlineIndex + 1);
54
- } else {
55
- // If there's no newline, just append at the end
56
- termContent += '\n' + hoverText;
57
- }
58
- }
59
- // If the link attribute is found, append it at the end of the term content
60
- if (link) {
61
- termContent += `\n\nFor more details, see ${link}`;
62
- }
63
- newContent += '\n\n' + termContent;
64
- }
65
- glossaryPage.contents = Buffer.from(newContent, 'utf8');
71
+ asciidoc.attributes['glossary-page'] = 'reference:glossary.adoc';
72
+ let glossaryContent = glossaryPage.contents.toString('utf8');
66
73
 
67
- console.log(chalk.green(`Merged terms into glossary for ${component} component${version? version: ''}.`));
74
+ Object.keys(siteCatalog.termsByCategory).sort().forEach(category => {
75
+ let categoryContent = `\n\n== ${category}\n`;
76
+
77
+ siteCatalog.termsByCategory[category].sort((a, b) => a.name.localeCompare(b.name)).forEach(term => {
78
+ let processedContent = processTermContent(term.content);
79
+ categoryContent += `\n\n${processedContent}`;
80
+ });
81
+
82
+ glossaryContent += categoryContent;
83
+ });
84
+
85
+ glossaryPage.contents = Buffer.from(glossaryContent, 'utf8');
86
+ console.log(chalk.green(`Merged terms into glossary for ${component} component${version ? ' version ' + version : ''}.`));
68
87
  } else {
69
- logger.info(`Skipping ${title} ${version} - No glossary page (reference:glossary.adoc) found`)
88
+ logger.info(`Skipping ${title} ${version ? ' version ' + version : ''} - No glossary page (reference:glossary.adoc) found`);
70
89
  }
71
- }
72
- }
90
+ });
91
+ });
73
92
  } catch (error) {
74
93
  logger.error(`Error merging terms: ${error.message}`);
75
94
  }
76
95
  });
77
- }
96
+ };
@@ -143,13 +143,37 @@ function generateIndex (playbook, contentCatalog, { indexLatestOnly = false, exc
143
143
  if (!(cname in algolia)) algolia[cname] = {}
144
144
  if (!(version in algolia[cname])) algolia[cname][version] = []
145
145
 
146
- /* Handle the article text
147
- var text = decode(article.text)
148
- text = text.replace(/\n/g, ' ')
146
+ // Handle the article text
147
+ const contentElements = article.querySelectorAll('p, table, li');
148
+ let contentText = '';
149
+ let currentSize = 0;
150
+ // Maximum size in bytes
151
+ const MAX_SIZE = 50000;
152
+ const encoder = new TextEncoder();
153
+ contentElements.forEach(element => {
154
+ let elementText = '';
155
+ if (element.tagName === 'TABLE') {
156
+ element.querySelectorAll('tr').forEach(tr => {
157
+ tr.querySelectorAll('td, th').forEach(cell => {
158
+ elementText += cell.text + ' ';
159
+ });
160
+ });
161
+ } else {
162
+ elementText = decode(element.rawText);
163
+ }
164
+ const elementSize = encoder.encode(elementText).length;
165
+ if (currentSize + elementSize > MAX_SIZE) {
166
+ return;
167
+ } else {
168
+ contentText += elementText;
169
+ currentSize += elementSize;
170
+ }
171
+ });
172
+
173
+ var text = contentText.replace(/\n/g, ' ')
149
174
  .replace(/\r/g, ' ')
150
175
  .replace(/\s+/g, ' ')
151
- .trim()
152
- if (text.length > 4000) text = text.substr(0, 4000)*/
176
+ .trim();
153
177
 
154
178
  var tag = `${component.title}-${version}`
155
179
 
@@ -158,7 +182,7 @@ function generateIndex (playbook, contentCatalog, { indexLatestOnly = false, exc
158
182
  product: component.title,
159
183
  version: version,
160
184
  //image: image? image: '',
161
- //text: text,
185
+ text: text,
162
186
  breadcrumbs: breadcrumbs,
163
187
  intro: intro,
164
188
  objectID: urlPath + page.pub.url,
@@ -49,6 +49,7 @@ module.exports.register = function (registry, config = {}) {
49
49
  const termObject = {
50
50
  term: attributes['term-name'],
51
51
  def: attributes['hover-text'],
52
+ category: attributes['category'] || '',
52
53
  content
53
54
  }
54
55
 
@@ -115,7 +116,7 @@ module.exports.register = function (registry, config = {}) {
115
116
  definition = attributes.definition;
116
117
  }
117
118
  if (definition) {
118
- logTerms && console.log(`${term}:: ${definition}`)
119
+ logTerms && console.log(`${term}:: ${definition}`)
119
120
  } else if (tooltip) {
120
121
  definition = `${term} not yet defined`
121
122
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redpanda-data/docs-extensions-and-macros",
3
- "version": "3.0.15",
3
+ "version": "3.0.17",
4
4
  "description": "Antora extensions and macros developed for Redpanda documentation.",
5
5
  "keywords": [
6
6
  "antora",