Improve language selection
This commit is contained in:
@@ -5,7 +5,7 @@ import history from 'history/browser';
|
|||||||
import copy from 'copy-to-clipboard';
|
import copy from 'copy-to-clipboard';
|
||||||
|
|
||||||
import { MenuButton, Button } from './Menu';
|
import { MenuButton, Button } from './Menu';
|
||||||
import { languageIds } from '../util/highlighting';
|
import { languages } from '../util/highlighting';
|
||||||
import themes from '../style/themes';
|
import themes from '../style/themes';
|
||||||
import { postUrl } from '../util/constants';
|
import { postUrl } from '../util/constants';
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ export default function EditorControls({
|
|||||||
label="language"
|
label="language"
|
||||||
value={language}
|
value={language}
|
||||||
setValue={setLanguage}
|
setValue={setLanguage}
|
||||||
ids={languageIds}
|
ids={languages}
|
||||||
/>
|
/>
|
||||||
</Section>
|
</Section>
|
||||||
<Section>
|
<Section>
|
||||||
|
|||||||
@@ -31,8 +31,29 @@ const Menu = styled.ul`
|
|||||||
max-height: calc(100vh - 2em);
|
max-height: calc(100vh - 2em);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
|
> li.title {
|
||||||
|
text-align: center;
|
||||||
|
padding: 0.7em 0 0.3em 0;
|
||||||
|
cursor: initial;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
> li.title:hover {
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
> li.selected {
|
||||||
|
::before {
|
||||||
|
content: '*';
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
padding-left: calc(1em - 1ch);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
> li {
|
> li {
|
||||||
padding: 0.15em 0.5em;
|
padding: 0em 1em 0.05em 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
> li:hover {
|
> li:hover {
|
||||||
@@ -63,19 +84,37 @@ export const MenuButton = ({ label, ids, value, setValue }) => {
|
|||||||
setValue(id);
|
setValue(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function make(ids) {
|
||||||
|
return ids.map(id => (
|
||||||
|
<li
|
||||||
|
key={id}
|
||||||
|
className={id === value ? 'selected' : undefined}
|
||||||
|
onClick={e => select(e, id)}
|
||||||
|
>
|
||||||
|
{id}
|
||||||
|
</li>
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let items;
|
||||||
|
if (Array.isArray(ids)) {
|
||||||
|
items = make(ids);
|
||||||
|
} else {
|
||||||
|
items = Object.entries(ids).map(([title, values]) =>
|
||||||
|
[
|
||||||
|
<li className="title" key={title} onClick={e => e.stopPropagation()}>
|
||||||
|
[{title}]
|
||||||
|
</li>,
|
||||||
|
]
|
||||||
|
.concat(make(values))
|
||||||
|
.flat()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Button onClick={toggleOpen}>
|
<Button onClick={toggleOpen}>
|
||||||
[<span>{label}: </span>
|
[<span>{label}: </span>
|
||||||
{value}]
|
{value}]{open && <Menu>{items}</Menu>}
|
||||||
{open && (
|
|
||||||
<Menu>
|
|
||||||
{ids.map(id => (
|
|
||||||
<li key={id} onClick={e => select(e, id)}>
|
|
||||||
{id}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</Menu>
|
|
||||||
)}
|
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
import { highlight, languages } from 'prismjs/components/prism-core';
|
import {
|
||||||
|
highlight,
|
||||||
|
languages as prismLanguages,
|
||||||
|
} from 'prismjs/components/prism-core';
|
||||||
|
|
||||||
import 'prismjs/components/prism-markup';
|
import 'prismjs/components/prism-markup';
|
||||||
import 'prismjs/components/prism-css';
|
import 'prismjs/components/prism-css';
|
||||||
@@ -21,47 +24,43 @@ import 'prismjs/components/prism-log';
|
|||||||
import 'prismjs/components/prism-markdown';
|
import 'prismjs/components/prism-markdown';
|
||||||
import 'prismjs/components/prism-php';
|
import 'prismjs/components/prism-php';
|
||||||
import 'prismjs/components/prism-markup-templating';
|
import 'prismjs/components/prism-markup-templating';
|
||||||
|
import 'prismjs/components/prism-properties';
|
||||||
import 'prismjs/components/prism-protobuf';
|
import 'prismjs/components/prism-protobuf';
|
||||||
import 'prismjs/components/prism-python';
|
import 'prismjs/components/prism-python';
|
||||||
import 'prismjs/components/prism-jsx';
|
import 'prismjs/components/prism-jsx';
|
||||||
import 'prismjs/components/prism-typescript';
|
import 'prismjs/components/prism-typescript';
|
||||||
|
import 'prismjs/components/prism-tsx';
|
||||||
import 'prismjs/components/prism-ruby';
|
import 'prismjs/components/prism-ruby';
|
||||||
import 'prismjs/components/prism-rust';
|
import 'prismjs/components/prism-rust';
|
||||||
import 'prismjs/components/prism-sql';
|
import 'prismjs/components/prism-sql';
|
||||||
import 'prismjs/components/prism-toml';
|
import 'prismjs/components/prism-toml';
|
||||||
import 'prismjs/components/prism-yaml';
|
import 'prismjs/components/prism-yaml';
|
||||||
|
|
||||||
export const languageIds = [
|
export const languages = {
|
||||||
'plain',
|
config: ['yaml', 'json', 'toml', 'properties'],
|
||||||
'markup',
|
logs: ['log', 'javastacktrace'],
|
||||||
'css',
|
code: [
|
||||||
'clike',
|
'java',
|
||||||
'bash',
|
'javascript',
|
||||||
'diff',
|
'typescript',
|
||||||
'docker',
|
'python',
|
||||||
'go',
|
'kotlin',
|
||||||
'groovy',
|
'clike',
|
||||||
'haskell',
|
'bash',
|
||||||
'java',
|
'ruby',
|
||||||
'javastacktrace',
|
'rust',
|
||||||
'javascript',
|
'sql',
|
||||||
'json',
|
'go',
|
||||||
'kotlin',
|
'groovy',
|
||||||
'log',
|
'haskell',
|
||||||
'markdown',
|
],
|
||||||
'php',
|
web: ['markup', 'css', 'php', 'jsx', 'tsx'],
|
||||||
'protobuf',
|
misc: ['plain', 'docker', 'diff', 'markdown', 'protobuf'],
|
||||||
'python',
|
};
|
||||||
'jsx',
|
|
||||||
'typescript',
|
export const languageIds = Object.values(languages).flat(1);
|
||||||
'ruby',
|
|
||||||
'rust',
|
|
||||||
'sql',
|
|
||||||
'toml',
|
|
||||||
'yaml',
|
|
||||||
];
|
|
||||||
|
|
||||||
export function getHighlighter(language) {
|
export function getHighlighter(language) {
|
||||||
const grammar = languages[language] || {};
|
const grammar = prismLanguages[language] || {};
|
||||||
return input => highlight(input, grammar);
|
return input => highlight(input, grammar);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user