Update to new Bergamot version
Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
<script defer src="{{ .Site.Params.bergamotJsUrl }}"></script>
|
||||
<script defer src="{{ .Site.Params.bergamotObjectLanguageJsUrl }}"></script>
|
||||
{{ $style := resources.Get "scss/bergamot.scss" | resources.ToCSS | resources.Minify }}
|
||||
<link rel="stylesheet" href="{{ $style.Permalink }}">
|
||||
<script defer>
|
||||
@@ -95,11 +96,64 @@ const setRunning = (inputGroup, running) => {
|
||||
}
|
||||
}
|
||||
|
||||
// The object language parsing is handling by a separate standalone Elm
|
||||
// application in the ObjectLanguage module, which has two ports:
|
||||
//
|
||||
// * `parseString` requests a string to be parsed
|
||||
// * `parsedString` returns the parsed string, or null
|
||||
//
|
||||
// We want there to be a single global ObjectLanguage object, but it works
|
||||
// on a "subscription" model (we have to give a callback to its port).
|
||||
// Configure this callback to invoke `resolve` functions from a list,
|
||||
// so that callers can just get a promise. This way we aren't continuously
|
||||
// registering more and more handlers for each parsed string, and we can
|
||||
// use a convenient promise API.
|
||||
const parsingPromiseResolvers = {};
|
||||
const ensureObjectLanguage = () => {
|
||||
if (!window.Bergamot.ObjectLanguage) {
|
||||
window.Bergamot.ObjectLanguage = Elm.Bergamot.ObjectLanguage.init({});
|
||||
window.Bergamot.ObjectLanguage.ports.parsedString.subscribe(({ string, term }) => {
|
||||
if (string in parsingPromiseResolvers) {
|
||||
for (const resolver of parsingPromiseResolvers[string]) {
|
||||
resolver(term);
|
||||
}
|
||||
parsingPromiseResolvers[string] = [];
|
||||
}
|
||||
});
|
||||
}
|
||||
return window.Bergamot.ObjectLanguage;
|
||||
}
|
||||
const parseString = (str) => {
|
||||
if (!(str in parsingPromiseResolvers)) {
|
||||
parsingPromiseResolvers[str] = [];
|
||||
}
|
||||
|
||||
return new Promise(resolve => {
|
||||
parsingPromiseResolvers[str].push(resolve);
|
||||
ensureObjectLanguage().ports.parseString.send(str);
|
||||
});
|
||||
}
|
||||
|
||||
window.Bergamot = {};
|
||||
window.Bergamot.run = (inputGroup, nodeId, inputPrompt, rules, renderRules, query) => {
|
||||
window.Bergamot.run = (inputGroup, nodeId, inputPrompt, rules, renderRules, input) => {
|
||||
var app = Elm.Main.init({
|
||||
node: document.getElementById(nodeId),
|
||||
flags: { renderRules, inputRules: inputPrompt, rules , query }
|
||||
flags: {
|
||||
inputModes: {
|
||||
"Languge Term": { "custom": "Language Term" },
|
||||
"Query": "query"
|
||||
},
|
||||
renderRules, rules, input
|
||||
}
|
||||
});
|
||||
app.ports.convertInput.subscribe(async ({ mode, input }) => {
|
||||
let query = await parseString(input);
|
||||
if (query !== null) {
|
||||
query = inputPrompt.replace("TERM", query);
|
||||
app.ports.receiveConverted.send({ input, result: { query } });
|
||||
} else {
|
||||
app.ports.receiveConverted.send({ input, result: { error: "Unable to parse object language term" } });
|
||||
}
|
||||
});
|
||||
loadedWidgets[nodeId] = { app, parentNode: inputGroup ? inputGroup.parentElement : null };
|
||||
setRunning(inputGroup, true);
|
||||
|
||||
Reference in New Issue
Block a user