@promptbook/components 0.101.0-7 → 0.101.0-8

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/esm/index.es.js CHANGED
@@ -19,7 +19,7 @@ const BOOK_LANGUAGE_VERSION = '1.0.0';
19
19
  * @generated
20
20
  * @see https://github.com/webgptorg/promptbook
21
21
  */
22
- const PROMPTBOOK_ENGINE_VERSION = '0.101.0-7';
22
+ const PROMPTBOOK_ENGINE_VERSION = '0.101.0-8';
23
23
  /**
24
24
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
25
25
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -2087,6 +2087,64 @@ function parseAgentSourceWithCommitments(agentSource) {
2087
2087
  };
2088
2088
  }
2089
2089
 
2090
+ /**
2091
+ * Parses parameters from text using both supported notations:
2092
+ * 1. @Parameter - single word parameter starting with @
2093
+ * 2. {parameterName} or {parameter with multiple words} or {parameterName: description text}
2094
+ *
2095
+ * Both notations represent the same syntax feature - parameters
2096
+ *
2097
+ * @param text - Text to extract parameters from
2098
+ * @returns Array of parsed parameters with unified representation
2099
+ * @public exported from `@promptbook/core`
2100
+ */
2101
+ function parseParameters(text) {
2102
+ const parameters = [];
2103
+ // [🧠] Parameter syntax parsing - unified approach for two different notations of the same syntax feature
2104
+ // The Book language supports parameters in two different notations but they represent the same concept
2105
+ // Extract @Parameter notation (single word parameters starting with @)
2106
+ const atParameterRegex = /@[\w\u00C0-\u017F\u0100-\u024F\u1E00-\u1EFF]+/gim;
2107
+ text.replace(atParameterRegex, (match) => {
2108
+ const parameterName = match.slice(1); // Remove the @ symbol
2109
+ parameters.push({
2110
+ text: match,
2111
+ notation: 'at',
2112
+ name: parameterName,
2113
+ });
2114
+ return match;
2115
+ });
2116
+ // Extract {parameter} notation (parameters in braces)
2117
+ const braceParameterRegex = /\{([^}]+)\}/gim;
2118
+ text.replace(braceParameterRegex, (match, content) => {
2119
+ // Check if the parameter has a description (parameterName: description)
2120
+ const colonIndex = content.indexOf(':');
2121
+ if (colonIndex !== -1) {
2122
+ const name = content.substring(0, colonIndex).trim();
2123
+ const description = content.substring(colonIndex + 1).trim();
2124
+ parameters.push({
2125
+ text: match,
2126
+ notation: 'brace',
2127
+ name,
2128
+ description,
2129
+ });
2130
+ }
2131
+ else {
2132
+ // Simple parameter without description
2133
+ parameters.push({
2134
+ text: match,
2135
+ notation: 'brace',
2136
+ name: content.trim(),
2137
+ });
2138
+ }
2139
+ return match;
2140
+ });
2141
+ // Remove duplicates based on name (keep the first occurrence)
2142
+ const uniqueParameters = parameters.filter((param, index, array) => {
2143
+ return array.findIndex(p => p.name === param.name) === index;
2144
+ });
2145
+ return uniqueParameters;
2146
+ }
2147
+
2090
2148
  /**
2091
2149
  * Parses basic information from agent source
2092
2150
  *
@@ -2113,10 +2171,14 @@ function parseAgentSource(agentSource) {
2113
2171
  if (!profileImageUrl) {
2114
2172
  profileImageUrl = generatePlaceholderAgentProfileImageUrl(parseResult.agentName || '!!');
2115
2173
  }
2174
+ // Parse parameters using unified approach - both @Parameter and {parameter} notations
2175
+ // are treated as the same syntax feature with unified representation
2176
+ const parameters = parseParameters(agentSource);
2116
2177
  return {
2117
2178
  agentName: parseResult.agentName,
2118
2179
  personaDescription,
2119
2180
  profileImageUrl,
2181
+ parameters,
2120
2182
  };
2121
2183
  }
2122
2184
  /**
@@ -3667,7 +3729,7 @@ parseInt(process.env.API_REQUEST_TIMEOUT || '90000');
3667
3729
  * TODO: [🧠][🧜‍♂️] Maybe join remoteServerUrl and path into single value
3668
3730
  */
3669
3731
 
3670
- var css_248z = ".BookEditor-module_BookEditor__s-0PU{height:450px;width:100%}.BookEditor-module_bookEditorContainer__wLMwM{height:100%;width:100%}.BookEditor-module_bookEditorContainer__wLMwM.BookEditor-module_isVerbose__VQ6iL{background-color:rgba(0,0,0,.05);outline:1px dotted rgba(0,0,0,.5)}.BookEditor-module_isVerbose__VQ6iL{outline:2px dotted #ff7526}.BookEditor-module_bookEditorWrapper__twppD{background-color:#fff;border:1px solid rgba(209,213,219,.8);border-radius:1rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);height:100%;overflow:hidden;position:relative;transition:box-shadow .2s ease-in-out;width:100%}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorWrapper__twppD{overflow:visible}.BookEditor-module_bookEditorWrapper__twppD:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.BookEditor-module_bookEditorWrapper__twppD:focus-within{box-shadow:0 0 0 3px rgba(99,102,241,.4);outline:2px solid transparent;outline-offset:2px}.BookEditor-module_bookEditorWrapper__twppD.BookEditor-module_isBorderRadiusDisabled__h1I3v{border-radius:0}.BookEditor-module_bookEditorBackground__5O4wu,.BookEditor-module_bookEditorHighlight__vs37t{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0}.BookEditor-module_bookEditorHighlight__vs37t{-ms-overflow-style:none;color:#111827;font-size:1.125rem;margin-bottom:50px;overflow:auto;overflow-wrap:break-word;padding-left:46px;padding-right:46px;padding-top:0;scrollbar-width:none;white-space:pre-wrap;z-index:10}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorHighlight__vs37t{opacity:.5;outline:1px dotted rgba(255,0,0,.5)}.BookEditor-module_bookEditorHighlight__vs37t::-webkit-scrollbar{display:none}.BookEditor-module_bookEditorTextarea__mUURn{background-color:transparent;border:none;bottom:0;caret-color:#111827;color:transparent;font-size:1.125rem;left:0;outline:none;overflow-wrap:break-word;padding-left:46px;padding-right:46px;padding-top:18px;position:absolute;resize:none;right:0;top:0;white-space:pre-wrap}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorTextarea__mUURn{color:rgba(255,255,0,.5);outline:1px dotted rgba(255,255,0,.5)}.BookEditor-module_bookEditorTextarea__mUURn::selection{background-color:rgba(99,102,241,.6)}.BookEditor-module_bookEditorSerif__QRS7g{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.BookEditor-module_bookEditorBar__haBDz{background-color:rgba(99,102,241,.1);border-top:1px solid rgba(209,213,219,.8);bottom:0;color:rgba(17,24,39,.6);font-size:.875rem;left:0;padding:.5rem 1rem;position:absolute;right:0}.BookEditor-module_bookEditorBar__haBDz a{color:unset;text-decoration:none}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-title{color:#30a8bd;text-decoration:underline}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-keyword{color:#30a8bd}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-at-parameter{color:#e67e22;font-weight:500}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-brace-parameter{color:#8e44ad;font-weight:500}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJvb2tFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FDSSxZQUFhLENBQ2IsVUFDSixDQUVBLDhDQUVJLFdBQVksQ0FEWixVQUVKLENBRUEsaUZBRUksZ0NBQXFDLENBQ3JDLGlDQUVKLENBRUEsb0NBQ0ksMEJBQ0osQ0FFQSw0Q0FRSSxxQkFBdUIsQ0FEdkIscUNBQTBDLENBRDFDLGtCQUFtQixDQUduQixzQ0FBMkMsQ0FQM0MsV0FBWSxDQUdaLGVBQWdCLENBRGhCLGlCQUFrQixDQU1sQixxQ0FBdUMsQ0FUdkMsVUFVSixDQUNBLGdGQUVJLGdCQUVKLENBRUEsa0RBQ0ksdUVBQ0osQ0FFQSx5REFHSSx3Q0FBNkMsQ0FGN0MsNkJBQThCLENBQzlCLGtCQUVKLENBRUEsNEZBQ0ksZUFDSixDQVdBLDZGQUpJLFFBQVMsQ0FDVCxNQUFPLENBTFAsbUJBQW9CLENBQ3BCLGlCQUFrQixDQUVsQixPQUFRLENBRFIsS0E4QkosQ0F4QkEsOENBb0JJLHVCQUF3QixDQVR4QixhQUFzQixDQUN0QixrQkFBbUIsQ0FJbkIsa0JBQW1CLENBUm5CLGFBQWMsQ0FjZCx3QkFBeUIsQ0FSekIsaUJBQWtCLENBQ2xCLGtCQUFtQixDQUZuQixhQUFjLENBTWQsb0JBQXFCLENBSXJCLG9CQUFxQixDQU5yQixVQU9KLENBRUEsa0ZBRUksVUFBWSxDQUNaLG1DQUVKLENBRUEsaUVBQ0ksWUFDSixDQUVBLDZDQVdJLDRCQUE2QixDQU03QixXQUFZLENBWlosUUFBUyxDQUlULG1CQUE0QixDQUQ1QixpQkFBa0IsQ0FFbEIsa0JBQW1CLENBSm5CLE1BQU8sQ0FNUCxZQUFhLENBUWIsd0JBQXlCLENBTHpCLGlCQUFrQixDQUNsQixrQkFBbUIsQ0FGbkIsZ0JBQWlCLENBWmpCLGlCQUFrQixDQVdsQixXQUFZLENBVFosT0FBUSxDQURSLEtBQU0sQ0FnQk4sb0JBRUosQ0FFQSxpRkFFSSx3QkFBNkIsQ0FDN0IscUNBRUosQ0FFQSx3REFDSSxvQ0FDSixDQUVBLDBDQUNJLGdFQUNKLENBRUEsd0NBVUksb0NBQXlDLENBRHpDLHlDQUE4QyxDQVA5QyxRQUFTLENBS1QsdUJBQTRCLENBRDVCLGlCQUFtQixDQUhuQixNQUFPLENBS1Asa0JBQW9CLENBUHBCLGlCQUFrQixDQUdsQixPQU9KLENBRUEsMENBQ0ksV0FBWSxDQUNaLG9CQUNKLENBSUEsb0VBQ0ksYUFBYyxDQUNkLHlCQUNKLENBRUEsc0VBQ0ksYUFDSixDQUdBLDJFQUNJLGFBQWMsQ0FDZCxlQUNKLENBRUEsOEVBQ0ksYUFBYyxDQUNkLGVBQ0oiLCJmaWxlIjoiQm9va0VkaXRvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLkJvb2tFZGl0b3Ige1xuICAgIGhlaWdodDogNDUwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib29rRWRpdG9yQ29udGFpbmVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5ib29rRWRpdG9yQ29udGFpbmVyLmlzVmVyYm9zZSB7XG4gICAgLyoqL1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgb3V0bGluZTogMXB4IGRvdHRlZCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgLyoqL1xufVxuXG4uaXNWZXJib3NlIHtcbiAgICBvdXRsaW5lOiAycHggZG90dGVkIHJnYigyNTUgMTE3IDM4KTtcbn1cblxuLmJvb2tFZGl0b3JXcmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXItcmFkaXVzOiAxcmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjA5LCAyMTMsIDIxOSwgMC44KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4ycyBlYXNlLWluLW91dDtcbn1cbi5pc1ZlcmJvc2UgLmJvb2tFZGl0b3JXcmFwcGVyIHtcbiAgICAvKiovXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgLyoqL1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXI6aG92ZXIge1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjA2KTtcbn1cblxuLmJvb2tFZGl0b3JXcmFwcGVyOmZvY3VzLXdpdGhpbiB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoOTksIDEwMiwgMjQxLCAwLjQpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIuaXNCb3JkZXJSYWRpdXNEaXNhYmxlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmJvb2tFZGl0b3JCYWNrZ3JvdW5kIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xufVxuXG4uYm9va0VkaXRvckhpZ2hsaWdodCB7XG4gICAgLyogVE9ETzogRFJZICovXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogMDtcblxuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgY29sb3I6IHJnYigxNywgMjQsIDM5KTtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtOyAvKiBUT0RPOiBEUlkgKi9cbiAgICBwYWRkaW5nLXRvcDogMDtcbiAgICBwYWRkaW5nLWxlZnQ6IDQ2cHg7XG4gICAgcGFkZGluZy1yaWdodDogNDZweDtcbiAgICBtYXJnaW4tYm90dG9tOiA1MHB4O1xuICAgIHotaW5kZXg6IDEwO1xuXG4gICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTtcblxuICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxuXG4uaXNWZXJib3NlIC5ib29rRWRpdG9ySGlnaGxpZ2h0IHtcbiAgICAvKiovXG4gICAgb3BhY2l0eTogMC41O1xuICAgIG91dGxpbmU6IDFweCBkb3R0ZWQgcmdiYSgyNTUsIDAsIDAsIDAuNSk7XG4gICAgLyoqL1xufVxuXG4uYm9va0VkaXRvckhpZ2hsaWdodDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5ib29rRWRpdG9yVGV4dGFyZWEge1xuICAgIC8qIFRPRE86IERSWSAqL1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG5cbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgY2FyZXQtY29sb3I6IHJnYigxNywgMjQsIDM5KTtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtOyAvKiBUT0RPOiBEUlkgKi9cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIHJlc2l6ZTogbm9uZTtcbiAgICBwYWRkaW5nLXRvcDogMThweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDQ2cHg7XG4gICAgcGFkZGluZy1yaWdodDogNDZweDtcbiAgICBib3JkZXI6IG5vbmU7XG5cbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbn1cblxuLmlzVmVyYm9zZSAuYm9va0VkaXRvclRleHRhcmVhIHtcbiAgICAvKiovXG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDAsIDAuNSk7XG4gICAgb3V0bGluZTogMXB4IGRvdHRlZCByZ2JhKDI1NSwgMjU1LCAwLCAwLjUpO1xuICAgIC8qKi9cbn1cblxuLmJvb2tFZGl0b3JUZXh0YXJlYTo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDk5LCAxMDIsIDI0MSwgMC42KTtcbn1cblxuLmJvb2tFZGl0b3JTZXJpZiB7XG4gICAgZm9udC1mYW1pbHk6IHVpLXNlcmlmLCBHZW9yZ2lhLCBDYW1icmlhLCAnVGltZXMgTmV3IFJvbWFuJywgVGltZXMsIHNlcmlmO1xufVxuXG4uYm9va0VkaXRvckJhciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICBjb2xvcjogcmdiYSgxNywgMjQsIDM5LCAwLjYpO1xuICAgIHBhZGRpbmc6IDAuNXJlbSAxcmVtO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDIwOSwgMjEzLCAyMTksIDAuOCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg5OSwgMTAyLCAyNDEsIDAuMSk7XG59XG5cbi5ib29rRWRpdG9yQmFyIGEge1xuICAgIGNvbG9yOiB1bnNldDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi8qIC0tLSBCb29rIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cblxuLmJvb2tFZGl0b3JIaWdobGlnaHQgOmdsb2JhbCguYm9vay1oaWdobGlnaHQtdGl0bGUpIHtcbiAgICBjb2xvcjogIzMwYThiZDtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuLmJvb2tFZGl0b3JIaWdobGlnaHQgOmdsb2JhbCguYm9vay1oaWdobGlnaHQta2V5d29yZCkge1xuICAgIGNvbG9yOiAjMzBhOGJkO1xufVxuXG4vKiBb8J+noF0gUGFyYW1ldGVyIHN5bnRheCBoaWdobGlnaHRpbmcgLSBkaWZmZXJlbnQgY29sb3JzIGZvciBkaWZmZXJlbnQgcGFyYW1ldGVyIHR5cGVzICovXG4uYm9va0VkaXRvckhpZ2hsaWdodCA6Z2xvYmFsKC5ib29rLWhpZ2hsaWdodC1hdC1wYXJhbWV0ZXIpIHtcbiAgICBjb2xvcjogI2U2N2UyMjsgLyogT3JhbmdlIGNvbG9yIGZvciBAUGFyYW1ldGVyIHN5bnRheCAqL1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5ib29rRWRpdG9ySGlnaGxpZ2h0IDpnbG9iYWwoLmJvb2staGlnaGxpZ2h0LWJyYWNlLXBhcmFtZXRlcikge1xuICAgIGNvbG9yOiAjOGU0NGFkOyAvKiBQdXJwbGUgY29sb3IgZm9yIHtwYXJhbWV0ZXJ9IHN5bnRheCAqL1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG4iXX0= */";
3732
+ var css_248z = ".BookEditor-module_BookEditor__s-0PU{height:450px;width:100%}.BookEditor-module_bookEditorContainer__wLMwM{height:100%;width:100%}.BookEditor-module_bookEditorContainer__wLMwM.BookEditor-module_isVerbose__VQ6iL{background-color:rgba(0,0,0,.05);outline:1px dotted rgba(0,0,0,.5)}.BookEditor-module_isVerbose__VQ6iL{outline:2px dotted #ff7526}.BookEditor-module_bookEditorWrapper__twppD{background-color:#fff;border:1px solid rgba(209,213,219,.8);border-radius:1rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);height:100%;overflow:hidden;position:relative;transition:box-shadow .2s ease-in-out;width:100%}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorWrapper__twppD{overflow:visible}.BookEditor-module_bookEditorWrapper__twppD:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.BookEditor-module_bookEditorWrapper__twppD:focus-within{box-shadow:0 0 0 3px rgba(99,102,241,.4);outline:2px solid transparent;outline-offset:2px}.BookEditor-module_bookEditorWrapper__twppD.BookEditor-module_isBorderRadiusDisabled__h1I3v{border-radius:0}.BookEditor-module_bookEditorBackground__5O4wu,.BookEditor-module_bookEditorHighlight__vs37t{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0}.BookEditor-module_bookEditorHighlight__vs37t{-ms-overflow-style:none;color:#111827;font-size:1.125rem;margin-bottom:50px;overflow:auto;overflow-wrap:break-word;padding-left:46px;padding-right:46px;padding-top:0;scrollbar-width:none;white-space:pre-wrap;z-index:10}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorHighlight__vs37t{opacity:.5;outline:1px dotted rgba(255,0,0,.5)}.BookEditor-module_bookEditorHighlight__vs37t::-webkit-scrollbar{display:none}.BookEditor-module_bookEditorTextarea__mUURn{background-color:transparent;border:none;bottom:0;caret-color:#111827;color:transparent;font-size:1.125rem;left:0;outline:none;overflow-wrap:break-word;padding-left:46px;padding-right:46px;padding-top:18px;position:absolute;resize:none;right:0;top:0;white-space:pre-wrap}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorTextarea__mUURn{color:rgba(255,255,0,.5);outline:1px dotted rgba(255,255,0,.5)}.BookEditor-module_bookEditorTextarea__mUURn::selection{background-color:rgba(99,102,241,.6)}.BookEditor-module_bookEditorSerif__QRS7g{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.BookEditor-module_bookEditorBar__haBDz{background-color:rgba(99,102,241,.1);border-top:1px solid rgba(209,213,219,.8);bottom:0;color:rgba(17,24,39,.6);font-size:.875rem;left:0;padding:.5rem 1rem;position:absolute;right:0}.BookEditor-module_bookEditorBar__haBDz a{color:unset;text-decoration:none}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-title{color:#30a8bd;text-decoration:underline}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-keyword{color:#30a8bd}.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-at-parameter,.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-brace-parameter,.BookEditor-module_bookEditorHighlight__vs37t .book-highlight-parameter{color:#8e44ad;font-weight:500}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJvb2tFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FDSSxZQUFhLENBQ2IsVUFDSixDQUVBLDhDQUVJLFdBQVksQ0FEWixVQUVKLENBRUEsaUZBRUksZ0NBQXFDLENBQ3JDLGlDQUVKLENBRUEsb0NBQ0ksMEJBQ0osQ0FFQSw0Q0FRSSxxQkFBdUIsQ0FEdkIscUNBQTBDLENBRDFDLGtCQUFtQixDQUduQixzQ0FBMkMsQ0FQM0MsV0FBWSxDQUdaLGVBQWdCLENBRGhCLGlCQUFrQixDQU1sQixxQ0FBdUMsQ0FUdkMsVUFVSixDQUNBLGdGQUVJLGdCQUVKLENBRUEsa0RBQ0ksdUVBQ0osQ0FFQSx5REFHSSx3Q0FBNkMsQ0FGN0MsNkJBQThCLENBQzlCLGtCQUVKLENBRUEsNEZBQ0ksZUFDSixDQVdBLDZGQUpJLFFBQVMsQ0FDVCxNQUFPLENBTFAsbUJBQW9CLENBQ3BCLGlCQUFrQixDQUVsQixPQUFRLENBRFIsS0E4QkosQ0F4QkEsOENBb0JJLHVCQUF3QixDQVR4QixhQUFzQixDQUN0QixrQkFBbUIsQ0FJbkIsa0JBQW1CLENBUm5CLGFBQWMsQ0FjZCx3QkFBeUIsQ0FSekIsaUJBQWtCLENBQ2xCLGtCQUFtQixDQUZuQixhQUFjLENBTWQsb0JBQXFCLENBSXJCLG9CQUFxQixDQU5yQixVQU9KLENBRUEsa0ZBRUksVUFBWSxDQUNaLG1DQUVKLENBRUEsaUVBQ0ksWUFDSixDQUVBLDZDQVdJLDRCQUE2QixDQU03QixXQUFZLENBWlosUUFBUyxDQUlULG1CQUE0QixDQUQ1QixpQkFBa0IsQ0FFbEIsa0JBQW1CLENBSm5CLE1BQU8sQ0FNUCxZQUFhLENBUWIsd0JBQXlCLENBTHpCLGlCQUFrQixDQUNsQixrQkFBbUIsQ0FGbkIsZ0JBQWlCLENBWmpCLGlCQUFrQixDQVdsQixXQUFZLENBVFosT0FBUSxDQURSLEtBQU0sQ0FnQk4sb0JBRUosQ0FFQSxpRkFFSSx3QkFBNkIsQ0FDN0IscUNBRUosQ0FFQSx3REFDSSxvQ0FDSixDQUVBLDBDQUNJLGdFQUNKLENBRUEsd0NBVUksb0NBQXlDLENBRHpDLHlDQUE4QyxDQVA5QyxRQUFTLENBS1QsdUJBQTRCLENBRDVCLGlCQUFtQixDQUhuQixNQUFPLENBS1Asa0JBQW9CLENBUHBCLGlCQUFrQixDQUdsQixPQU9KLENBRUEsMENBQ0ksV0FBWSxDQUNaLG9CQUNKLENBSUEsb0VBQ0ksYUFBYyxDQUNkLHlCQUNKLENBRUEsc0VBQ0ksYUFDSixDQW1CQSxpT0FDSSxhQUFjLENBQ2QsZUFDSiIsImZpbGUiOiJCb29rRWRpdG9yLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuQm9va0VkaXRvciB7XG4gICAgaGVpZ2h0OiA0NTBweDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLmJvb2tFZGl0b3JDb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLmJvb2tFZGl0b3JDb250YWluZXIuaXNWZXJib3NlIHtcbiAgICAvKiovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICBvdXRsaW5lOiAxcHggZG90dGVkIHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICAvKiovXG59XG5cbi5pc1ZlcmJvc2Uge1xuICAgIG91dGxpbmU6IDJweCBkb3R0ZWQgcmdiKDI1NSAxMTcgMzgpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcblxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMDksIDIxMywgMjE5LCAwLjgpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzIGVhc2UtaW4tb3V0O1xufVxuLmlzVmVyYm9zZSAuYm9va0VkaXRvcldyYXBwZXIge1xuICAgIC8qKi9cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAvKiovXG59XG5cbi5ib29rRWRpdG9yV3JhcHBlcjpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggcmdiYSg5OSwgMTAyLCAyNDEsIDAuNCk7XG59XG5cbi5ib29rRWRpdG9yV3JhcHBlci5pc0JvcmRlclJhZGl1c0Rpc2FibGVkIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xufVxuXG4uYm9va0VkaXRvckJhY2tncm91bmQge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG59XG5cbi5ib29rRWRpdG9ySGlnaGxpZ2h0IHtcbiAgICAvKiBUT0RPOiBEUlkgKi9cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuXG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG5cbiAgICBjb2xvcjogcmdiKDE3LCAyNCwgMzkpO1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07IC8qIFRPRE86IERSWSAqL1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHBhZGRpbmctbGVmdDogNDZweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0NnB4O1xuICAgIG1hcmdpbi1ib3R0b206IDUwcHg7XG4gICAgei1pbmRleDogMTA7XG5cbiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7XG4gICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lO1xuXG4gICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5pc1ZlcmJvc2UgLmJvb2tFZGl0b3JIaWdobGlnaHQge1xuICAgIC8qKi9cbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgb3V0bGluZTogMXB4IGRvdHRlZCByZ2JhKDI1NSwgMCwgMCwgMC41KTtcbiAgICAvKiovXG59XG5cbi5ib29rRWRpdG9ySGlnaGxpZ2h0Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJvb2tFZGl0b3JUZXh0YXJlYSB7XG4gICAgLyogVE9ETzogRFJZICovXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogMDtcblxuICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBjYXJldC1jb2xvcjogcmdiKDE3LCAyNCwgMzkpO1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07IC8qIFRPRE86IERSWSAqL1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgcmVzaXplOiBub25lO1xuICAgIHBhZGRpbmctdG9wOiAxOHB4O1xuICAgIHBhZGRpbmctbGVmdDogNDZweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0NnB4O1xuICAgIGJvcmRlcjogbm9uZTtcblxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xufVxuXG4uaXNWZXJib3NlIC5ib29rRWRpdG9yVGV4dGFyZWEge1xuICAgIC8qKi9cbiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMCwgMC41KTtcbiAgICBvdXRsaW5lOiAxcHggZG90dGVkIHJnYmEoMjU1LCAyNTUsIDAsIDAuNSk7XG4gICAgLyoqL1xufVxuXG4uYm9va0VkaXRvclRleHRhcmVhOjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoOTksIDEwMiwgMjQxLCAwLjYpO1xufVxuXG4uYm9va0VkaXRvclNlcmlmIHtcbiAgICBmb250LWZhbWlseTogdWktc2VyaWYsIEdlb3JnaWEsIENhbWJyaWEsICdUaW1lcyBOZXcgUm9tYW4nLCBUaW1lcywgc2VyaWY7XG59XG5cbi5ib29rRWRpdG9yQmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG5cbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgIGNvbG9yOiByZ2JhKDE3LCAyNCwgMzksIDAuNik7XG4gICAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjA5LCAyMTMsIDIxOSwgMC44KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDk5LCAxMDIsIDI0MSwgMC4xKTtcbn1cblxuLmJvb2tFZGl0b3JCYXIgYSB7XG4gICAgY29sb3I6IHVuc2V0O1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLyogLS0tIEJvb2sgc3ludGF4IGhpZ2hsaWdodGluZyAqL1xuXG4uYm9va0VkaXRvckhpZ2hsaWdodCA6Z2xvYmFsKC5ib29rLWhpZ2hsaWdodC10aXRsZSkge1xuICAgIGNvbG9yOiAjMzBhOGJkO1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uYm9va0VkaXRvckhpZ2hsaWdodCA6Z2xvYmFsKC5ib29rLWhpZ2hsaWdodC1rZXl3b3JkKSB7XG4gICAgY29sb3I6ICMzMGE4YmQ7XG59XG5cbi8qIFvwn6egXSBQYXJhbWV0ZXIgc3ludGF4IGhpZ2hsaWdodGluZyAtIHVuaWZpZWQgY29sb3IgZm9yIGJvdGggcGFyYW1ldGVyIG5vdGF0aW9uc1xuICogVGhlIEJvb2sgbGFuZ3VhZ2Ugc3VwcG9ydHMgdHdvIGRpZmZlcmVudCBub3RhdGlvbnMgZm9yIHRoZSBzYW1lIHN5bnRheCBmZWF0dXJlIC0gcGFyYW1ldGVyczpcbiAqIDEuIEBQYXJhbWV0ZXIgLSBzaW5nbGUgd29yZCBwYXJhbWV0ZXIgc3RhcnRpbmcgd2l0aCBAXG4gKiAyLiB7cGFyYW1ldGVyTmFtZX0gb3Ige3BhcmFtZXRlciB3aXRoIG11bHRpcGxlIHdvcmRzfSBvciB7cGFyYW1ldGVyTmFtZTogZGVzY3JpcHRpb24gdGV4dH1cbiAqIEJvdGggbm90YXRpb25zIHJlcHJlc2VudCB0aGUgc2FtZSBzZW1hbnRpYyBjb25jZXB0IGFuZCBhcmUgaGlnaGxpZ2h0ZWQgd2l0aCB0aGUgc2FtZSBwdXJwbGUgY29sb3IuXG4gKi9cbi5ib29rRWRpdG9ySGlnaGxpZ2h0IDpnbG9iYWwoLmJvb2staGlnaGxpZ2h0LXBhcmFtZXRlcikge1xuICAgIGNvbG9yOiAjOGU0NGFkOyAvKiBQdXJwbGUgY29sb3IgZm9yIGFsbCBwYXJhbWV0ZXIgc3ludGF4ZXMgKi9cbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4vKiBMZWdhY3kgY2xhc3NlcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIGJvdGggdXNlIHRoZSBzYW1lIHB1cnBsZSBjb2xvciBub3cgKi9cbi5ib29rRWRpdG9ySGlnaGxpZ2h0IDpnbG9iYWwoLmJvb2staGlnaGxpZ2h0LWF0LXBhcmFtZXRlcikge1xuICAgIGNvbG9yOiAjOGU0NGFkOyAvKiBQdXJwbGUgY29sb3IgKHVuaWZpZWQgd2l0aCBicmFjZSBwYXJhbWV0ZXJzKSAqL1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5ib29rRWRpdG9ySGlnaGxpZ2h0IDpnbG9iYWwoLmJvb2staGlnaGxpZ2h0LWJyYWNlLXBhcmFtZXRlcikge1xuICAgIGNvbG9yOiAjOGU0NGFkOyAvKiBQdXJwbGUgY29sb3IgKHNhbWUgYXMgYXQgcGFyYW1ldGVycykgKi9cbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuIl19 */";
3671
3733
  var styles = {"BookEditor":"BookEditor-module_BookEditor__s-0PU","bookEditorContainer":"BookEditor-module_bookEditorContainer__wLMwM","isVerbose":"BookEditor-module_isVerbose__VQ6iL","bookEditorWrapper":"BookEditor-module_bookEditorWrapper__twppD","isBorderRadiusDisabled":"BookEditor-module_isBorderRadiusDisabled__h1I3v","bookEditorBackground":"BookEditor-module_bookEditorBackground__5O4wu","bookEditorHighlight":"BookEditor-module_bookEditorHighlight__vs37t","bookEditorTextarea":"BookEditor-module_bookEditorTextarea__mUURn","bookEditorSerif":"BookEditor-module_bookEditorSerif__QRS7g","bookEditorBar":"BookEditor-module_bookEditorBar__haBDz"};
3672
3734
  styleInject(css_248z);
3673
3735
 
@@ -3982,13 +4044,24 @@ function BookEditorInner(props) {
3982
4044
  return new RegExp(pattern, 'gmi');
3983
4045
  }, []);
3984
4046
  const metaRegex = useMemo(() => {
3985
- // Pattern to match META followed by one or more uppercase words
3986
- // This will match: META IMAGE, META LINK, META TITLE, META DESCRIPTION, META CUSTOM FOO, etc.
3987
- return /\bMETA\s+(?:[A-Z]+(?:\s+[A-Z]+)*)/gim;
4047
+ // Pattern to match META followed by exactly one uppercase word (DRY principle - single pattern for all META commitments)
4048
+ // This will match: META IMAGE, META LINK, META TITLE, META DESCRIPTION, META FOO, etc.
4049
+ // But NOT multiple words like "META IMAGE SOMETHING" - only "META IMAGE" part will be highlighted
4050
+ return /\bMETA\s+[A-Z]+\b/gim;
3988
4051
  }, []);
3989
- // [🧠] Parameter syntax highlighting - two types:
3990
- // 1. @Parameter (single word parameters starting with @)
3991
- // 2. {parameterName} or {parameter with multiple words} or {parameterName: description text}
4052
+ // [🧠] Parameter syntax highlighting - unified approach for two different notations of the same syntax feature
4053
+ //
4054
+ // IMPORTANT PRINCIPLE: The Book language supports parameters as a single syntax feature
4055
+ // expressed through two different notations:
4056
+ // 1. @Parameter (single word parameters starting with @) - e.g., @name, @ěščřžý
4057
+ // 2. {parameterName} (parameters in braces) - e.g., {name}, {user name}, {name: description}
4058
+ //
4059
+ // Both notations represent the same semantic concept - parameters - and should be:
4060
+ // - Highlighted with the same color (purple)
4061
+ // - Parsed using the same logic
4062
+ // - Treated identically in the syntax processing
4063
+ //
4064
+ // This follows the DRY principle: don't repeat yourself for the same syntax feature.
3992
4065
  const atParameterRegex = useMemo(() => {
3993
4066
  // Match @followed by word characters (letters, numbers, underscore) and unicode letters (for @ěščřžý)
3994
4067
  return /@[\w\u00C0-\u017F\u0100-\u024F\u1E00-\u1EFF]+/gim;
@@ -3997,6 +4070,43 @@ function BookEditorInner(props) {
3997
4070
  // Match {parameter} or {parameter: description} - content inside braces
3998
4071
  return /\{[^}]+\}/gim;
3999
4072
  }, []);
4073
+ /**
4074
+ * Unified parameter extraction function that handles both parameter notations
4075
+ *
4076
+ * This function embodies the principle that @Parameter and {parameter} are
4077
+ * two different notations for the same syntax feature - parameters.
4078
+ *
4079
+ * @param text - Text to extract parameters from
4080
+ * @returns Array of parameter ranges with unified type
4081
+ */
4082
+ const extractUnifiedParameters = useCallback((text) => {
4083
+ const parameters = [];
4084
+ // Extract @Parameter notation (first notation)
4085
+ text.replace(atParameterRegex, (match, ...args) => {
4086
+ const index = args[args.length - 2];
4087
+ parameters.push({
4088
+ start: index,
4089
+ end: index + match.length,
4090
+ type: 'parameter',
4091
+ notation: 'at',
4092
+ text: match,
4093
+ });
4094
+ return match;
4095
+ });
4096
+ // Extract {parameter} notation (second notation)
4097
+ text.replace(braceParameterRegex, (match, ...args) => {
4098
+ const index = args[args.length - 2];
4099
+ parameters.push({
4100
+ start: index,
4101
+ end: index + match.length,
4102
+ type: 'parameter',
4103
+ notation: 'brace',
4104
+ text: match,
4105
+ });
4106
+ return match;
4107
+ });
4108
+ return parameters.sort((a, b) => a.start - b.start);
4109
+ }, [atParameterRegex, braceParameterRegex]);
4000
4110
  const highlightedHtml = useMemo(() => {
4001
4111
  const text = value !== null && value !== void 0 ? value : '';
4002
4112
  let lastIndex = 0;
@@ -4021,31 +4131,21 @@ function BookEditorInner(props) {
4021
4131
  }
4022
4132
  return match;
4023
4133
  });
4024
- // Handle @Parameter syntax (single word parameters starting with @)
4025
- text.replace(atParameterRegex, (match, ...args) => {
4026
- const index = args[args.length - 2];
4027
- const matchEnd = index + match.length;
4028
- // Check if this match overlaps with any existing range
4029
- const overlaps = processedRanges.some((range) => (index >= range.start && index < range.end) ||
4030
- (matchEnd > range.start && matchEnd <= range.end) ||
4031
- (index < range.start && matchEnd > range.end));
4134
+ // Handle parameters using the unified extraction function - both @Parameter and {parameter} notations
4135
+ // are treated as the same syntax feature with unified highlighting
4136
+ const unifiedParameters = extractUnifiedParameters(text);
4137
+ unifiedParameters.forEach((param) => {
4138
+ // Check if this parameter overlaps with any existing range
4139
+ const overlaps = processedRanges.some((range) => (param.start >= range.start && param.start < range.end) ||
4140
+ (param.end > range.start && param.end <= range.end) ||
4141
+ (param.start < range.start && param.end > range.end));
4032
4142
  if (!overlaps) {
4033
- processedRanges.push({ start: index, end: matchEnd, type: 'at-parameter' });
4034
- }
4035
- return match;
4036
- });
4037
- // Handle {parameter} syntax (parameters in braces)
4038
- text.replace(braceParameterRegex, (match, ...args) => {
4039
- const index = args[args.length - 2];
4040
- const matchEnd = index + match.length;
4041
- // Check if this match overlaps with any existing range
4042
- const overlaps = processedRanges.some((range) => (index >= range.start && index < range.end) ||
4043
- (matchEnd > range.start && matchEnd <= range.end) ||
4044
- (index < range.start && matchEnd > range.end));
4045
- if (!overlaps) {
4046
- processedRanges.push({ start: index, end: matchEnd, type: 'brace-parameter' });
4143
+ processedRanges.push({
4144
+ start: param.start,
4145
+ end: param.end,
4146
+ type: 'parameter'
4147
+ });
4047
4148
  }
4048
- return match;
4049
4149
  });
4050
4150
  // Sort ranges by start position
4051
4151
  processedRanges.sort((a, b) => a.start - b.start);
@@ -4060,11 +4160,9 @@ function BookEditorInner(props) {
4060
4160
  case 'keyword':
4061
4161
  cssClass = 'book-highlight-keyword';
4062
4162
  break;
4063
- case 'at-parameter':
4064
- cssClass = 'book-highlight-at-parameter';
4065
- break;
4066
- case 'brace-parameter':
4067
- cssClass = 'book-highlight-brace-parameter';
4163
+ case 'parameter':
4164
+ // Use the unified parameter class, but maintain backward compatibility
4165
+ cssClass = 'book-highlight-parameter';
4068
4166
  break;
4069
4167
  default:
4070
4168
  cssClass = 'book-highlight-keyword';
@@ -4080,7 +4178,7 @@ function BookEditorInner(props) {
4080
4178
  lines[0] = `<span class="book-highlight-title">${lines[0]}</span>`;
4081
4179
  }
4082
4180
  return lines.join('\n');
4083
- }, [value, typeRegex, metaRegex, atParameterRegex, braceParameterRegex]);
4181
+ }, [value, typeRegex, metaRegex, extractUnifiedParameters]);
4084
4182
  return (jsx("div", { className: classNames(styles.bookEditorContainer, isVerbose && styles.isVerbose, className), children: jsxs("div", { className: classNames(styles.bookEditorWrapper, effectiveFontClassName, isBorderRadiusDisabled && styles.isBorderRadiusDisabled), children: [jsx("div", { "aria-hidden": true, className: styles.bookEditorBackground, style: { backgroundImage: 'none' } }), jsx("pre", { ref: highlightRef, "aria-hidden": true, className: `${styles.bookEditorHighlight} ${effectiveFontClassName}`, style: {
4085
4183
  lineHeight: `${lineHeight}px`,
4086
4184
  backgroundImage: `linear-gradient(90deg, transparent 30px, rgba(59,130,246,0.3) 30px, rgba(59,130,246,0.3) 31px, transparent 31px), repeating-linear-gradient(0deg, transparent, transparent calc(${lineHeight}px - 1px), rgba(0,0,0,0.06) ${lineHeight}px)`,