diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/auswertung.md b/demos/stefan/aexpr-diss-inter-tagger-reliability/auswertung.md
index 2b84aab2c..b25b6ff8b 100644
--- a/demos/stefan/aexpr-diss-inter-tagger-reliability/auswertung.md
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/auswertung.md
@@ -9,19 +9,19 @@ const results = results = await runEvaluation(this);
'results computed'
-change detection
-reactive behavior
-
-### main
+### main.js
-### setup
+### setup.js
+change detection
+reactive behavior
+
### cohen's kappa
cohen's kappa for binary classification:
```javascript
diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/legend.js b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/legend.js
new file mode 100644
index 000000000..0d7570248
--- /dev/null
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/legend.js
@@ -0,0 +1,8 @@
+/*
+
+ both change detection
+ both reactive behavior
+ different (change detection for primary tagger, reactive behavior for second tagger)
+
+
+*/
\ No newline at end of file
diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/legend.js.l4a b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/legend.js.l4a
new file mode 100644
index 000000000..c7c26e20c
--- /dev/null
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/legend.js.l4a
@@ -0,0 +1,4 @@
+{"type":"Reference","version":"7a3bb6b0486f99bdcc17d5acc9b73a62fa43d60b","content":"/*\n\n both change detection\n both reactive behavior\n different (change detection for primary tagger, reactive behavior for second tagger)\n\n\n*/"}
+{"from":4,"to":18,"name":"color","color":"#fdd49e"}
+{"from":41,"to":55,"name":"color","color":"#a1d99b"}
+{"from":79,"to":93,"name":"color","color":"repeating-linear-gradient(-45deg, rgba(253, 212, 158, 0.4), rgba(253, 212, 158, 0.4) 10px, rgba(161, 217, 155, 0.4) 10px, rgba(161, 217, 155, 0.4) 20px)"}
\ No newline at end of file
diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-main.js b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-main.js
new file mode 100644
index 000000000..e07ee7de9
--- /dev/null
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-main.js
@@ -0,0 +1,74 @@
+export default function({ types: t, template, traverse, }) {
+
+
+ /* Generic Signal Computation One Time per File */
+ var setup = template(`
+var aexprCallbacks = [],
+ signals = [],
+ solveSignals = false,
+ resolveSignals = function() {
+ if(!solveSignals) {
+ solveSignals = true;
+ signals.forEach(s => s());
+ solveSignals = false;
+ let nonSignalCB;
+ while(nonSignalCB = aexprCallbacks.pop()) {
+ nonSignalCB();
+ }
+}
+ },
+ newAExpr = function(axp) {
+ return {
+ onChange(cb) {
+ axp.onChange(val => {
+ if(solveSignals) {
+ aexprCallbacks.push(() => cb(axp.getCurrentValue()));
+ } else {
+ return cb(val);
+ }
+ });
+ }
+ }
+ }
+`);
+
+ /* Replace assignemnt with Signal */
+ var signal = template(`(aexpr(() => init).onChange(resolveSignals), signals.push(() => name = init), init)`);
+
+
+ /* Find Assginemnts and Instrument Assigments */
+ return {
+ visitor: {
+ Program(program) {
+ let aexprs = new Set();
+ program.traverse({
+ CallExpression(path) {
+ let callee = path.get("callee");
+ if (callee.isIdentifier() && callee.node.name === 'aexpr')
+ aexprs.add(path);
+ }
+ });
+ aexprs.forEach(path => path.replaceWith(template(`newAExpr(expr)`)({ expr: path.node })));
+
+ program.traverse({
+ Identifier(path) {
+ if (!path.parentPath.isVariableDeclarator()) { return; }
+
+ // const as substitute for 'signal' for now #TODO
+ var declaration = path.parentPath.parentPath.node;
+ if (declaration.kind !== 'const') { return; }
+ declaration.kind = 'let';
+
+ var init = path.parentPath.get('init');
+ init.replaceWith(signal({
+ init: init,
+ name: path.node
+ }).expression);
+ }
+ });
+
+ program.unshiftContainer("body", setup());
+ }
+ }
+ };
+}
diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-main.js.l4a b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-main.js.l4a
new file mode 100644
index 000000000..6c6d75072
--- /dev/null
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-main.js.l4a
@@ -0,0 +1,13 @@
+{"type":"Reference","version":"4336710bba85b744fcec03d4879016a596e53750","content":"export default function({ types: t, template, traverse, }) {\n\n\n /* Generic Signal Computation One Time per File */\n var setup = template(`\nvar aexprCallbacks = [],\n signals = [],\n solveSignals = false,\n resolveSignals = function() {\n if(!solveSignals) {\n solveSignals = true;\n signals.forEach(s => s());\n solveSignals = false;\n let nonSignalCB;\n while(nonSignalCB = aexprCallbacks.pop()) {\n nonSignalCB();\n }\n}\n },\n newAExpr = function(axp) {\n return {\n onChange(cb) {\n axp.onChange(val => {\n if(solveSignals) {\n aexprCallbacks.push(() => cb(axp.getCurrentValue()));\n } else {\n return cb(val);\n }\n });\n }\n }\n }\n`);\n\n /* Replace assignemnt with Signal */\n var signal = template(`(aexpr(() => init).onChange(resolveSignals), signals.push(() => name = init), init)`);\n\n\n /* Find Assginemnts and Instrument Assigments */\n return {\n visitor: {\n Program(program) {\n let aexprs = new Set();\n program.traverse({\n CallExpression(path) {\n let callee = path.get(\"callee\");\n if (callee.isIdentifier() && callee.node.name === 'aexpr')\n aexprs.add(path);\n }\n });\n aexprs.forEach(path => path.replaceWith(template(`newAExpr(expr)`)({ expr: path.node })));\n\n program.traverse({\n Identifier(path) {\n if (!path.parentPath.isVariableDeclarator()) { return; }\n\n // const as substitute for 'signal' for now #TODO\n var declaration = path.parentPath.parentPath.node;\n if (declaration.kind !== 'const') { return; }\n declaration.kind = 'let';\n\n var init = path.parentPath.get('init');\n init.replaceWith(signal({\n init: init,\n name: path.node\n }).expression);\n }\n });\n\n program.unshiftContainer(\"body\", setup());\n }\n }\n };\n}\n"}
+{"from":0,"to":139,"name":"color","color":"#fdd49e"}
+{"from":139,"to":170,"name":"color","color":"#a1d99b"}
+{"from":183,"to":889,"name":"color","color":"#a1d99b"}
+{"from":889,"to":1002,"name":"color","color":"#fdd49e"}
+{"from":1002,"to":1033,"name":"color","color":"#a1d99b"}
+{"from":1035,"to":1156,"name":"color","color":"#fdd49e"}
+{"from":1156,"to":1510,"name":"color","color":"#a1d99b"}
+{"from":1510,"to":2067,"name":"color","color":"#fdd49e"}
+{"from":170,"to":183,"name":"color","color":"repeating-linear-gradient(-45deg, rgba(253, 212, 158, 0.4), rgba(253, 212, 158, 0.4) 10px, rgba(161, 217, 155, 0.4) 10px, rgba(161, 217, 155, 0.4) 20px)"}
+{"from":2109,"to":2131,"name":"color","color":"#fdd49e"}
+{"from":2067,"to":2109,"name":"color","color":"repeating-linear-gradient(-45deg, rgba(253, 212, 158, 0.4), rgba(253, 212, 158, 0.4) 10px, rgba(161, 217, 155, 0.4) 10px, rgba(161, 217, 155, 0.4) 20px)"}
+{"from":1033,"to":1035,"name":"color","color":"#fdd49e"}
\ No newline at end of file
diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-setup.js b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-setup.js
new file mode 100644
index 000000000..17fb07c39
--- /dev/null
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-setup.js
@@ -0,0 +1,28 @@
+
+var aexprCallbacks = [],
+ signals = [],
+ solveSignals = false,
+ resolveSignals = function() {
+ if(!solveSignals) {
+ solveSignals = true;
+ signals.forEach(s => s());
+ solveSignals = false;
+ let nonSignalCB;
+ while(nonSignalCB = aexprCallbacks.pop()) {
+ nonSignalCB();
+ }
+ }
+ },
+ newAExpr = function(axp) {
+ return {
+ onChange(cb) {
+ axp.onChange(val => {
+ if(solveSignals) {
+ aexprCallbacks.push(() => cb(axp.getCurrentValue()));
+ } else {
+ return cb(val);
+ }
+ });
+ }
+ }
+ }
\ No newline at end of file
diff --git a/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-setup.js.l4a b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-setup.js.l4a
new file mode 100644
index 000000000..179e03dc8
--- /dev/null
+++ b/demos/stefan/aexpr-diss-inter-tagger-reliability/combined/task-setup.js.l4a
@@ -0,0 +1,5 @@
+{"type":"Reference","version":"145dfbcc92a2cec900d41835a4854f84b76810c9","content":"\nvar aexprCallbacks = [],\n signals = [],\n solveSignals = false,\n resolveSignals = function() {\n if(!solveSignals) {\n solveSignals = true;\n signals.forEach(s => s());\n solveSignals = false;\n let nonSignalCB;\n while(nonSignalCB = aexprCallbacks.pop()) {\n nonSignalCB();\n }\n }\n },\n newAExpr = function(axp) {\n return {\n onChange(cb) {\n axp.onChange(val => {\n if(solveSignals) {\n aexprCallbacks.push(() => cb(axp.getCurrentValue()));\n } else {\n return cb(val);\n }\n });\n }\n }\n }"}
+{"from":0,"to":30,"name":"color","color":"#a1d99b"}
+{"from":43,"to":755,"name":"color","color":"#a1d99b"}
+{"from":40,"to":40,"name":"color","color":"repeating-linear-gradient(-45deg, rgba(253, 212, 158, 0.4), rgba(253, 212, 158, 0.4) 10px, rgba(161, 217, 155, 0.4) 10px, rgba(161, 217, 155, 0.4) 20px)"}
+{"from":30,"to":43,"name":"color","color":"repeating-linear-gradient(-45deg, rgba(253, 212, 158, 0.4), rgba(253, 212, 158, 0.4) 10px, rgba(161, 217, 155, 0.4) 10px, rgba(161, 217, 155, 0.4) 20px)"}
\ No newline at end of file
diff --git a/src/client/annotations.js b/src/client/annotations.js
index 245b8fd7b..7b7651c15 100644
--- a/src/client/annotations.js
+++ b/src/client/annotations.js
@@ -9,7 +9,6 @@ import tinycolor from 'src/external/tinycolor.js';
-
export class Annotation {
constructor(config) {
this.from = 0, // starts here...
@@ -45,9 +44,11 @@ export class Annotation {
codeMirrorMark(cm) {
var color = this.color || "lightgray"
- color = tinycolor(color)
- color.setAlpha(0.4)
-
+ const isGradient = color && color.startsWith && color.startsWith('repeating-linear-gradient');
+ if (!isGradient) {
+ color = tinycolor(color)
+ color.setAlpha(0.4)
+ }
var fromPos = cm.posFromIndex(this.from)
var toPos = cm.posFromIndex(this.to)
@@ -58,7 +59,7 @@ export class Annotation {
attributes: {
"data-annotation": JSON.stringify(this)
},
- css: `background-color: ${color.toString()}`});
+ css: `background: ${color.toString()}`});
return marker
}
diff --git a/src/client/lively.js b/src/client/lively.js
index 6245b61e2..e0c9ca5da 100644
--- a/src/client/lively.js
+++ b/src/client/lively.js
@@ -2101,6 +2101,10 @@ export default class Lively {
static async onBodyPositionPreference(pos) {
lively.setPosition(document.body, pos);
}
+
+ static async onDisableAExpWorkspacePreference(workspaceDisabled) {
+ localStorage.setItem("DisableAExpWorkspace", workspaceDisabled)
+ }
static async onEnableAEDebuggingPreference(debuggingEnabled) {
if (self.lively4isLoading) return // no recompile needed
diff --git a/src/client/preferences.js b/src/client/preferences.js
index c75b6426c..2823a6f84 100644
--- a/src/client/preferences.js
+++ b/src/client/preferences.js
@@ -22,7 +22,7 @@ export default class Preferences {
InteractiveLayer: {default: false, short: "dev methods"},
ShowDocumentGrid: {default: true, short: "show grid"},
UseRP19JSX: {default: false, short: "use rp19 implementation for jsx"},
- /* DisableAExpWorkspace: {default: false, short: "disable AExp in workspace"}, */
+ DisableAExpWorkspace: {default: false, short: "disable AExp in workspace"},
UseProxiesForAExprs: {default: false, short: "proxy-based Active Expressions"},
EnableAEDebugging: {default: true, short: "enable Active Expression debugging"},
SmartAELogging: {default: true, short: "Only log events for interesting Active Expressions"},
diff --git a/src/components/tools/lively-editor.js b/src/components/tools/lively-editor.js
index 51bf7e99f..061fd832f 100644
--- a/src/components/tools/lively-editor.js
+++ b/src/components/tools/lively-editor.js
@@ -221,10 +221,12 @@ export default class Editor extends Morph {
["(Auto) Resolve Merge Conglicts", () => this.autoResolveMergeConflicts()],
])
} else if (this.annotatedText) {
+ const stripedColor = 'repeating-linear-gradient(-45deg, rgba(253, 212, 158, 0.4), rgba(253, 212, 158, 0.4) 10px, rgba(161, 217, 155, 0.4) 10px, rgba(161, 217, 155, 0.4) 20px)';
items.push(...[
[Annotations],
[mark orange, () => this.onAnnotationsMarkColor("#fdd49e")],
[mark green, () => this.onAnnotationsMarkColor("#a1d99b")],
+ [mark striped, () => this.onAnnotationsMarkColor(stripedColor)],
[mark blue, () => this.onAnnotationsMarkColor("#9ecae1")],
["clear", () => this.onAnnotationsClear()],
["delete all anntations", () => this.onDeleteAllAnnotations()],
diff --git a/src/components/widgets/ubg-cards-editor.html b/src/components/widgets/ubg-cards-editor.html
index 136d8dc34..104568384 100644
--- a/src/components/widgets/ubg-cards-editor.html
+++ b/src/components/widgets/ubg-cards-editor.html
@@ -128,7 +128,7 @@
#form-layout {
display: grid;
grid-template-columns: min-content auto 2.5in;
- grid-template-rows: repeat(7, auto) 1fr auto auto .5fr auto;
+ grid-template-rows: repeat(7, auto) 1fr auto auto .33fr auto;
grid-template-areas:
"isPrinted-key isPrinted-value preview"
"id-key id-value preview"
diff --git a/src/components/widgets/ubg-cards.js b/src/components/widgets/ubg-cards.js
index 8aed38301..74bc59084 100644
--- a/src/components/widgets/ubg-cards.js
+++ b/src/components/widgets/ubg-cards.js
@@ -8,6 +8,7 @@ import { shake } from 'utils';
import { Point } from 'src/client/graphics.js'
import paper from 'src/client/paperjs-wrapper.js'
+import 'https://lively-kernel.org/lively4/ubg-assets/load-assets.js';
import { serialize, deserialize } from 'src/client/serialize.js';
import Card from 'demos/stefan/untitled-board-game/ubg-card.js';
@@ -15,6 +16,35 @@ import Card from 'demos/stefan/untitled-board-game/ubg-card.js';
const POKER_CARD_SIZE_INCHES = lively.pt(2.5, 3.5);
const POKER_CARD_SIZE_MM = POKER_CARD_SIZE_INCHES.scaleBy(25.4);
+import BeaufortforLOLJaBold from 'https://lively-kernel.org/lively4/ubg-assets/fonts/runeterra/fonts/BeaufortforLOLJa-Bold-normal.js'
+import BeaufortforLOLJaRegular from 'https://lively-kernel.org/lively4/ubg-assets/fonts/runeterra/fonts/BeaufortforLOLJa-Regular-normal.js'
+import Univers59UltraCondensed from 'https://lively-kernel.org/lively4/ubg-assets/fonts/runeterra/fonts/Univers 59 Ultra Condensed-normal.js'
+import univers_55 from 'https://lively-kernel.org/lively4/ubg-assets/fonts/runeterra/fonts/univers_55-normal.js'
+
+const FONT_NAME_BEAUFORT_FOR_LOL_BOLD = 'BeaufortforLOLJa-Bold'
+const FONT_NAME_BEAUFORT_FOR_LOL_REGULAR = 'BeaufortforLOLJa-Regular'
+const FONT_NAME_UNIVERS_59 = 'Univers 59 Ultra Condensed'
+const FONT_NAME_UNIVERS_55 = 'univers_55'
+
+// Card group name (ELITE, SPIDER, YETI, etc.) -- Univers 59
+const FONT_NAME_CARD_TYPE = FONT_NAME_UNIVERS_59
+
+// Card name, card cost, card stats -- Beaufort for LOL Bold
+const FONT_NAME_CARD_NAME = FONT_NAME_BEAUFORT_FOR_LOL_BOLD
+const FONT_NAME_CARD_COST = FONT_NAME_BEAUFORT_FOR_LOL_BOLD
+const FONT_NAME_CARD_VP = FONT_NAME_BEAUFORT_FOR_LOL_BOLD
+
+// Card description -- Univers 55
+const FONT_NAME_CARD_TEXT = FONT_NAME_UNIVERS_55
+
+const RUNETERRA_FONT_ID = 'runeterra-fonts'
+lively.loadCSSThroughDOM(RUNETERRA_FONT_ID, 'https://lively-kernel.org/lively4/ubg-assets/fonts/runeterra/css/runeterra.css')
+
+const CSS_CLASS_BEAUFORT_FOR_LOL_BOLD = 'beaufort-for-lol-bold'
+const CSS_CLASS_BEAUFORT_FOR_LOL_REGULAR = 'beaufort-for-lol-regular'
+const CSS_CLASS_UNIVERS_59_ULTRA_CONDENSED = 'univers-59-ultra-condensed'
+const CSS_CLASS_UNIVERS_55 = 'univers-55'
+
function identity(value) {
return value;
}
@@ -183,7 +213,8 @@ const elementInfo = {
};
function forElement(element) {
- return elementInfo[element] || elementInfo.unknown;
+ const cleanElement = (element || '').toLowerCase();
+ return elementInfo[cleanElement] || elementInfo.unknown;
}
class SVG {
@@ -403,7 +434,6 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
});
printedRules = printedRules.replace(/blitz/gmi, '');
- printedRules = printedRules.replace(/\btap\b/gmi, '');
printedRules = printedRules.replace(/passive/gmi, '');
printedRules = printedRules.replace(/start of turn,?/gmi, '');
printedRules = printedRules.replace(/ignition/gmi, '');
@@ -429,6 +459,8 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
printedRules = this.renderKeywords(printedRules)
printedRules = this.renderHedronIcon(printedRules)
+ printedRules = `${printedRules}`
+
return this.renderToDoc(ruleBox, insetTextBy, printedRules, beforeRenderRules, doc)
}
@@ -494,8 +526,17 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
return 'Trash this after casting it.'
},
+ convokecast: (...args) => {
+ if (args.includes('all')) {
+ // keyword granted
+ return 'Increase their x by 1 for each other card sharing an element with them.'
+ }
+
+ return 'Increase this card\'s x by 1 for each other card sharing an element with it.'
+ },
+
countingquest: () => {
- return 'If you fulfill its condition (track with ()), as a free action you may trash this to create an Achievement Token.'
+ return 'If you fulfill its condition (track with []), as a free action you may trash this to create an Achievement Token.'
},
cycle: (...args) => {
@@ -514,6 +555,18 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
return `Passive As a free action, you may trash ${whoToPrint} to play a card of equal or lower cost.`
},
+ dash: (cost, who) => {
+ let thatCard = 'this'
+ let it = 'this'
+
+ if (who === 'one') {
+ thatCard = 'that card'
+ it = 'it'
+ }
+
+ return `Pay (${cost}) to play ${thatCard}, but trash ${it} at end of turn.`
+ },
+
discover: (howMany) => {
return `To discover ${howMany}, reveal top ${howMany} cards of any piles. Add 1 to your hand, trash the rest.`
},
@@ -542,8 +595,15 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
return `As a free action, pay (${cost}) and trash this from hand to exec its blitz effects.`
},
- flashback: (...args) => {
- return 'Passive As a free action, you may trash this to exec its blitz effects.'
+ flashback: (who) => {
+ let subject = 'this';
+ if (who === 'all') {
+ subject = 'a card';
+ }
+ if (who === 'one') {
+ subject = 'the card';
+ }
+ return `Passive As a free action, you may trash ${subject} to exec its blitz effects.`
},
instant: () => {
@@ -563,7 +623,7 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
},
postpone: (cost, delay) => {
- return `You may buy this for ${cost} instead of its normal cost. If you do, put this with (${delay}) in your suspend zone. Start of turn Remove (1) from here. Passive If last () is removed, play this.`
+ return `You may buy this for ${cost} instead of its normal cost. If you do, put this with [${delay}] in your suspend zone. Start of turn Remove [1] from here. Passive If last [] is removed, play this.`
},
quest: () => {
@@ -608,12 +668,17 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
},
saga: (...args) => {
- return 'Blitz and Start of Turn Put (1) here. Then, exec the corresponding chapter\'s effect.'
+ return 'Blitz and Start of Turn Put [1] here. Then, exec the corresponding chapter\'s effect.'
},
stuncounter: (...args) => {
return 'Casting a card with a stun counter removes the counter instead of the effect.'
},
+
+ tiny: () => {
+ return 'Tiny cards do not count for triggering the game end.'
+ },
+
upgrade: (diff, who) => {
let whoText = 'this'
if (who === 'one') {
@@ -638,7 +703,9 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
static renderKeywords(printedRules) {
function makeBold(text) {
- return `${text}`
+ // light highlight on dark background rgb(250 214 90)
+ 'rgb(226 175 0)'
+ return `${text}`
}
printedRules = printedRules.replace(/manaburst:?/gmi, (match, pElement, offset, string, groups) => makeBold(match));
@@ -652,7 +719,7 @@ ${SVG.elementSymbol(others[2], lively.pt(12.5, 8.5), 1.5)}`, lively.rect(0, 0, 1
return SVG.inlineSVG(SVG.elementSymbol(element, lively.pt(5, 5), 5));
}
- return printedRules.replace(/(fire|water|earth|wind|gray)/gmi, (match, pElement, offset, string, groups) => inlineElement(pElement));
+ return printedRules.replace(/\b(fire|water|earth|wind|gray)\b/gmi, (match, pElement, offset, string, groups) => inlineElement(pElement));
}
static renderHedronIcon(printedRules) {
@@ -720,7 +787,7 @@ ${SVG.inlineSVG(`
`;
}
- return printedRules.replace(/(\-?\+?(?:\d+|\*|d+\*|\d+(?:x|hedron)|(?:x|hedron)|\b)\-?\+?)VP\b/gmi, function replacer(match, vp, offset, string, groups) {
+ return printedRules.replace(/(\-?\+?(?:\d+|\*|d+\*|\d+(?:x|y|z|hedron)|(?:x|y|z|hedron)|\b)\-?\+?)VP\b/gmi, function replacer(match, vp, offset, string, groups) {
return printVP(vp);
});
}
@@ -737,7 +804,7 @@ ${SVG.circleRing(center, 4.75, 5, `fill="darkviolet"`)}
${textToPrint}`);
}
- return printedRules.replace(/\(((?:[*0-9xy+-]|hedron)*)\)/gmi, function replacer(match, p1, offset, string, groups) {
+ return printedRules.replace(/\(((?:[*0-9xyz+-]|hedron)*)\)/gmi, function replacer(match, p1, offset, string, groups) {
return coin(p1);
});
}
@@ -755,7 +822,7 @@ ${textToPrint}`);
${textToPrint}`, undefined, undefined, 'transform:scale(1);');
}
- return printedRules.replace(/\[((?:[*0-9x+-]|hedron)*)\]/gmi, function replacer(match, p1, offset, string, groups) {
+ return printedRules.replace(/\[((?:[*0-9xyz+-]|hedron)*)\]/gmi, function replacer(match, p1, offset, string, groups) {
return bracket(p1);
});
}
@@ -792,7 +859,8 @@ width: ${ruleTextBox.width}mm; min-height: ${ruleTextBox.height}mm;`}>;
if (!element) {
return true;
}
- return !(element === document.body || element === elementHTML || elementHTML.contains(element));
+
+ return !(element === document.head || element.id === RUNETERRA_FONT_ID || element === document.body || element === elementHTML || elementHTML.contains(element));
} catch (e) {}
}
});
@@ -1280,7 +1348,24 @@ export default class Cards extends Morph {
return (await this.assetsFolder.fetchStats()).contents;
}
+ /*MD #### Fonts MD*/
+ // convert fonts to jspdf-compatible format at https://peckconsulting.s3.amazonaws.com/fontconverter/fontconverter.html
+ addFonts(doc) {
+ this.addFont(doc, 'BeaufortforLOLJa-Bold-normal.ttf', 'BeaufortforLOLJa-Bold', BeaufortforLOLJaBold)
+ this.addFont(doc, 'BeaufortforLOLJa-Regular-normal.ttf', 'BeaufortforLOLJa-Regular', BeaufortforLOLJaRegular)
+ this.addFont(doc, 'Univers 59 Ultra Condensed-normal.ttf', 'Univers 59 Ultra Condensed', Univers59UltraCondensed)
+ this.addFont(doc, 'univers_55-normal.ttf', 'univers_55', univers_55);
+ }
+
+ addFont(doc, vfsName, fontName, fontDataBase64) {
+ const fontBase64 = "data:font/ttf;base64," + fontDataBase64;
+ doc.addFileToVFS(vfsName, fontBase64);
+ doc.addFont(vfsName, fontName, 'normal');
+ }
+
async buildCards(doc, cardsToPrint) {
+ this.addFonts(doc)
+
const GAP = lively.pt(.2, .2);
const rowsPerPage = Math.max(((doc.internal.pageSize.getHeight() + GAP.y) / (POKER_CARD_SIZE_MM.y + GAP.y)).floor(), 1);
@@ -1857,6 +1942,7 @@ export default class Cards extends Morph {
// card name
doc::withGraphicsState(() => {
+ // doc.setFont(FONT_NAME_CARD_NAME, "normal");
doc.setFontSize(.6 * titleBar.height::mmToPoint());
doc.setTextColor('#000000');
doc.text(this.getNameFromCard(cardDesc), ...titleBar.leftCenter().addX(2).toPair(), {
@@ -1985,6 +2071,8 @@ export default class Cards extends Morph {
// fullText = fullText::prepend(element::curate())
// }
doc.setFontSize(7);
+ // doc.setFont(FONT_NAME_UNIVERS_59, "normal");
+
const { w, h: textHeight } = doc.getTextDimensions(fullText);
const typeElementTextBox = anchorPt.subX(w/2).extent(lively.pt(w, textHeight))
diff --git a/src/plugin-babel.js b/src/plugin-babel.js
index 859726f24..36d25d1a4 100644
--- a/src/plugin-babel.js
+++ b/src/plugin-babel.js
@@ -486,24 +486,26 @@ async function workspacePlugins(options = {}) {
result.push(...await doitPlugins())
- result.push(...[
- await importDefaultOf('babel-plugin-var-recorder'),
- [await importDefaultOf('babel-plugin-ILA'), {
- executedIn: 'file'
- }],
- [await importDefaultOf('babel-plugin-databindings'), {
- executedIn: 'file'
- }],
- [await importDefaultOf('babel-plugin-active-expression-rewriting'), {
- executedIn: 'workspace'
- }],
- [await importDefaultOf('babel-plugin-databindings-post-process'), {
- executedIn: 'file'
- }],
- [await importDefaultOf('babel-plugin-active-expression-proxies'), {
+
+ result.push(await importDefaultOf('babel-plugin-var-recorder'))
+
+ if (!localStorage.getItem("DisableAExpWorkspace")) {
+ result.push(await importDefaultOf('babel-plugin-ILA'), {
+ executedIn: 'file'
+ })
+ result.push(await importDefaultOf('babel-plugin-databindings'), {
+ executedIn: 'file'
+ })
+ result.push(await importDefaultOf('babel-plugin-active-expression-rewriting'), {
+ executedIn: 'workspace'
+ })
+ result.push(await importDefaultOf('babel-plugin-databindings-post-process'), {
+ executedIn: 'file'
+ })
+ result.push(await importDefaultOf('babel-plugin-active-expression-proxies'), {
executedIn: 'workspace'
- }]
- ])
+ })
+ }
if (!options.fortesting) {
result.push(babel7.babelPluginProposalDynamicImport)
result.push([babel7.babelPluginTransformModulesSystemJS, {
diff --git a/test/stack-test.js b/test/stack-test.js
index 37767beae..6141cc526 100644
--- a/test/stack-test.js
+++ b/test/stack-test.js
@@ -171,7 +171,7 @@ stack;
};
const stack = o.myGetter;
- expect(stack.getFrame(0).func).to.equal('get myGetter [as myGetter]');
+ expect(stack.getFrame(0).func).to.equal('get myGetter');
});
it('static getter', () => {
@@ -183,7 +183,7 @@ stack;
}
const stack = AClass.myStaticGetter;
- expect(stack.getFrame(0).func).to.equal('get myStaticGetter [as myStaticGetter]');
+ expect(stack.getFrame(0).func).to.equal('get myStaticGetter');
});
it('new as property name', () => {