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', () => {