@jupyterlab/mathjax-extension 4.5.0-alpha.3 → 4.5.0-beta.0

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/lib/index.js CHANGED
@@ -52,6 +52,7 @@ export class MathJaxTypesetter {
52
52
  this._mathDocument.options.elements = [node];
53
53
  this._mathDocument.clear().render();
54
54
  delete this._mathDocument.options.elements;
55
+ Private.hardenAnchorLinks(node);
55
56
  }
56
57
  }
57
58
  /**
@@ -85,6 +86,13 @@ const mathJaxPlugin = {
85
86
  const scale = args['scale'] || 1.0;
86
87
  md.outputJax.options.scale = scale;
87
88
  md.rerender();
89
+ // Harden only the re-rendered anchors
90
+ for (const math of md.math) {
91
+ const root = math.typesetRoot;
92
+ if (root) {
93
+ Private.hardenAnchorLinks(root);
94
+ }
95
+ }
88
96
  },
89
97
  label: args => trans.__('Mathjax Scale ') +
90
98
  (args['scale'] ? `x${args['scale']}` : trans.__('Reset')),
@@ -156,5 +164,25 @@ var Private;
156
164
  return _loading.promise;
157
165
  }
158
166
  Private.ensureMathDocument = ensureMathDocument;
167
+ /**
168
+ * Utility function to harden anchor links in a given element
169
+ */
170
+ function hardenAnchorLinks(element) {
171
+ const anchors = element.querySelectorAll('.MathJax a');
172
+ anchors.forEach(anchor => {
173
+ // Add rel="noopener" if not already present
174
+ const existingRel = anchor.rel || '';
175
+ const relValues = existingRel.split(/\s+/).filter(v => v.length > 0);
176
+ if (!relValues.includes('noopener')) {
177
+ relValues.push('noopener');
178
+ }
179
+ anchor.rel = relValues.join(' ');
180
+ // Add target="_blank" if not already present
181
+ if (anchor.target !== '_blank') {
182
+ anchor.target = '_blank';
183
+ }
184
+ });
185
+ }
186
+ Private.hardenAnchorLinks = hardenAnchorLinks;
159
187
  })(Private || (Private = {}));
160
188
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,2DAA2D;AAC3D;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAItE,IAAU,UAAU,CASnB;AATD,WAAU,UAAU;IAClB;;OAEG;IACU,eAAI,GAAG,mBAAmB,CAAC;IACxC;;OAEG;IACU,gBAAK,GAAG,eAAe,CAAC;AACvC,CAAC,EATS,UAAU,KAAV,UAAU,QASnB;AAQD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QAiCY,iBAAY,GAAY,KAAK,CAAC;IAE1C,CAAC;IAlCW,KAAK,CAAC,kBAAkB;QAChC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,IAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3C,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CAIF;AAED;;GAEG;AACH,MAAM,aAAa,GAA4C;IAC7D,EAAE,EAAE,sCAAsC;IAC1C,WAAW,EAAE,yDAAyD;IACtE,QAAQ,EAAE,gBAAgB;IAC1B,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,QAAQ,EAAE,CAAC,GAAoB,EAAE,UAA8B,EAAE,EAAE;QACjE,MAAM,KAAK,GAAG,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,cAAc,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE3C,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAQ,EAAE,CAAC,SAAS,CAAC;gBAC/B,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;YACD,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC;YACrC,WAAW,EAAE;gBACX,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACf;aACF;SACF,CAAC,CAAC;QAEH,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE;YACxC,OAAO,EAAE,KAAK,EAAE,IAAuB,EAAE,EAAE;gBACzC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;gBACnC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAEd,sCAAsC;gBACtC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAiC,CAAC;oBACpD,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,EAAE,IAAI,CAAC,EAAE,CACZ,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC;gBAC1B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAC3D,WAAW,EAAE;gBACX,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,wCAAwC,CAAC;yBAChE;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,eAAe,aAAa,CAAC;AAE7B;;GAEG;AACH,IAAU,OAAO,CA6FhB;AA7FD,WAAU,OAAO;IACf,IAAI,QAAQ,GAAwD,IAAI,CAAC;IAElE,KAAK,UAAU,kBAAkB;QAGtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;YAEjC,KAAK,MAAM,CAAC,wDAAwD,CAAC,CAAC;YAEtE,MAAM,CACJ,EAAE,OAAO,EAAE,EACX,EAAE,KAAK,EAAE,EACT,EAAE,GAAG,EAAE,EACP,EAAE,OAAO,EAAE,EACX,EAAE,WAAW,EAAE,EACf,EAAE,WAAW,EAAE,EACf,EAAE,WAAW,EAAE,EACf,EAAE,cAAc,EAAE,EAClB,EAAE,mBAAmB,EAAE,CACxB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACpB,MAAM,CAAC,yBAAyB,CAAC;gBACjC,MAAM,CAAC,8BAA8B,CAAC;gBACtC,MAAM,CAAC,2BAA2B,CAAC;gBACnC,MAAM,CAAC,wCAAwC,CAAC;gBAChD,MAAM,CAAC,uCAAuC,CAAC;gBAC/C,MAAM,CAAC,qCAAqC,CAAC;gBAC7C,MAAM,CAAC,2CAA2C,CAAC;gBACnD,MAAM,CAAC,yCAAyC,CAAC;gBACjD,MAAM,CAAC,oCAAoC,CAAC;aAC7C,CAAC,CAAC;YAEH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CACvB,mBAAmB,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CACpE,CAAC;YAEF,MAAM,SAAU,SAAQ,OAAO;;YACZ,sBAAY,GAAG,EAAS,CAAC;YAG5C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,gEAAgE;gBAChE,IAAI,EAAE,IAAI,SAAS,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;gBAClB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;gBACvC,UAAU,EAAE;oBACV,CAAC,GAAG,EAAE,GAAG,CAAC;oBACV,CAAC,KAAK,EAAE,KAAK,CAAC;iBACf;gBACD,WAAW,EAAE;oBACX,CAAC,IAAI,EAAE,IAAI,CAAC;oBACZ,CAAC,KAAK,EAAE,KAAK,CAAC;iBACf;gBACD,cAAc,EAAE,IAAI;gBACpB,mBAAmB,EAAE,IAAI;aAC1B,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACrD,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAlEqB,0BAAkB,qBAkEvC,CAAA;IAED;;OAEG;IACH,SAAgB,iBAAiB,CAAC,OAAoB;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAoB,YAAY,CAAC,CAAC;QAC1E,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,4CAA4C;YAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEjC,6CAA6C;YAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAlBe,yBAAiB,oBAkBhC,CAAA;AACH,CAAC,EA7FS,OAAO,KAAP,OAAO,QA6FhB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jupyterlab/mathjax-extension",
3
- "version": "4.5.0-alpha.3",
3
+ "version": "4.5.0-beta.0",
4
4
  "description": "A JupyterLab extension providing MathJax Typesetting",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -38,18 +38,26 @@
38
38
  ],
39
39
  "scripts": {
40
40
  "build": "tsc -b",
41
+ "build:test": "tsc --build tsconfig.test.json",
41
42
  "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo",
42
43
  "eslint": "eslint . --ext .ts,.tsx --fix",
44
+ "test": "jest",
45
+ "test:cov": "jest --collect-coverage",
46
+ "test:debug": "node --inspect-brk ../../node_modules/.bin/jest --runInBand",
47
+ "test:debug:watch": "node --inspect-brk ../../node_modules/.bin/jest --runInBand --watch",
43
48
  "watch": "tsc -b --watch"
44
49
  },
45
50
  "dependencies": {
46
- "@jupyterlab/application": "^4.5.0-alpha.3",
47
- "@jupyterlab/rendermime": "^4.5.0-alpha.3",
48
- "@jupyterlab/translation": "^4.5.0-alpha.3",
51
+ "@jupyterlab/application": "^4.5.0-beta.0",
52
+ "@jupyterlab/rendermime": "^4.5.0-beta.0",
53
+ "@jupyterlab/translation": "^4.5.0-beta.0",
49
54
  "@lumino/coreutils": "^2.2.1",
50
55
  "mathjax-full": "^3.2.2"
51
56
  },
52
57
  "devDependencies": {
58
+ "@jupyterlab/testing": "^4.5.0-beta.0",
59
+ "@types/jest": "^29.2.0",
60
+ "jest": "^29.2.0",
53
61
  "rimraf": "~5.0.5",
54
62
  "typescript": "~5.5.4"
55
63
  },
package/src/index.ts CHANGED
@@ -68,6 +68,7 @@ export class MathJaxTypesetter implements ILatexTypesetter {
68
68
  this._mathDocument.options.elements = [node];
69
69
  this._mathDocument.clear().render();
70
70
  delete this._mathDocument.options.elements;
71
+ Private.hardenAnchorLinks(node);
71
72
  }
72
73
 
73
74
  protected _initialized: boolean = false;
@@ -107,6 +108,14 @@ const mathJaxPlugin: JupyterFrontEndPlugin<ILatexTypesetter> = {
107
108
  const scale = args['scale'] || 1.0;
108
109
  md.outputJax.options.scale = scale;
109
110
  md.rerender();
111
+
112
+ // Harden only the re-rendered anchors
113
+ for (const math of md.math) {
114
+ const root = math.typesetRoot as HTMLElement | null;
115
+ if (root) {
116
+ Private.hardenAnchorLinks(root);
117
+ }
118
+ }
110
119
  },
111
120
  label: args =>
112
121
  trans.__('Mathjax Scale ') +
@@ -204,4 +213,27 @@ namespace Private {
204
213
 
205
214
  return _loading.promise;
206
215
  }
216
+
217
+ /**
218
+ * Utility function to harden anchor links in a given element
219
+ */
220
+ export function hardenAnchorLinks(element: HTMLElement): void {
221
+ const anchors = element.querySelectorAll<HTMLAnchorElement>('.MathJax a');
222
+ anchors.forEach(anchor => {
223
+ // Add rel="noopener" if not already present
224
+ const existingRel = anchor.rel || '';
225
+ const relValues = existingRel.split(/\s+/).filter(v => v.length > 0);
226
+
227
+ if (!relValues.includes('noopener')) {
228
+ relValues.push('noopener');
229
+ }
230
+
231
+ anchor.rel = relValues.join(' ');
232
+
233
+ // Add target="_blank" if not already present
234
+ if (anchor.target !== '_blank') {
235
+ anchor.target = '_blank';
236
+ }
237
+ });
238
+ }
207
239
  }