Files
zulip/static/js/realm_playground.js
Sumanth V Rao 9c4ed43d6b playgrounds: Add an option to select "Custom language" in typeahead.
Since we support hooking up code playgrounds for custom languages
outside of the list of languages supported by Pygments, we display
an option to select a "Custom language" in the typeahead.
2021-05-09 16:13:04 -07:00

73 lines
2.6 KiB
JavaScript

import * as typeahead from "../shared/js/typeahead";
import {$t} from "./i18n";
import * as typeahead_helper from "./typeahead_helper";
const map_language_to_playground_info = new Map();
const map_pygments_pretty_name_to_aliases = new Map();
export function update_playgrounds(playgrounds_data) {
map_language_to_playground_info.clear();
for (const data of Object.values(playgrounds_data)) {
const element_to_push = {
id: data.id,
name: data.name,
url_prefix: data.url_prefix,
};
if (map_language_to_playground_info.has(data.pygments_language)) {
map_language_to_playground_info.get(data.pygments_language).push(element_to_push);
} else {
map_language_to_playground_info.set(data.pygments_language, [element_to_push]);
}
}
}
export function get_playground_info_for_languages(lang) {
return map_language_to_playground_info.get(lang);
}
export function sort_pygments_pretty_names_by_priority(generated_pygments_data) {
const priority_sorted_pygments_data = Object.keys(generated_pygments_data.langs).sort(
typeahead_helper.compare_by_popularity,
);
for (const alias of priority_sorted_pygments_data) {
const pretty_name = generated_pygments_data.langs[alias].pretty_name;
// JS Map remembers the original order of insertion of keys.
if (map_pygments_pretty_name_to_aliases.has(pretty_name)) {
map_pygments_pretty_name_to_aliases.get(pretty_name).push(alias);
} else {
map_pygments_pretty_name_to_aliases.set(pretty_name, [alias]);
}
}
}
export function get_pygments_typeahead_list(query) {
const lookup_table = new Map();
const pygments_pretty_name_list = [];
// Adds a typeahead that allows selecting a custom language, by adding a
// "Custom language" label in the first position of the typeahead list.
const clean_query = typeahead.clean_query_lowercase(query);
pygments_pretty_name_list.push(clean_query);
lookup_table[clean_query] = $t(
{defaultMessage: "Custom language: {query}"},
{query: clean_query},
);
for (const [key, values] of map_pygments_pretty_name_to_aliases) {
lookup_table[key] = key + " (" + Array.from(values).join(", ") + ")";
pygments_pretty_name_list.push(key);
}
return {
pygments_pretty_name_list,
lookup_table,
};
}
export function initialize(playground_data, generated_pygments_data) {
update_playgrounds(playground_data);
sort_pygments_pretty_names_by_priority(generated_pygments_data);
}