Skip to content

Commit

Permalink
Merge pull request accordproject#19 from muskanbararia/muskanbararia/…
Browse files Browse the repository at this point in the history
…syntaxHighlighting

feat(editor): Added syntax highlighting for concerto and json editors
  • Loading branch information
mttrbrts authored Nov 22, 2023
2 parents 696347c + da9e94b commit 9cdbc32
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/AgreementData.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import MarkdownEditor from './MarkdownEditor';
import JSONEditor from './JSONEditor';
import useAppStore from './store';

function AgreementData() {
Expand All @@ -15,7 +15,7 @@ function AgreementData() {
<div className="tooltip"><h3>Data</h3>
<span className="tooltiptext">JSON data (an instance of the Concerto model) used to preview output from the template.</span>
</div>
<MarkdownEditor value={agreementData} onChange={onChange}/>
<JSONEditor value={agreementData} onChange={onChange}/>
</div>;
}

Expand Down
76 changes: 76 additions & 0 deletions src/ConcertoEditor.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import * as monaco from '@monaco-editor/react';
import { editor } from 'monaco-editor';

const options:editor.IStandaloneEditorConstructionOptions = {
minimap: { enabled: false },
wordWrap: "on"
}
const concertoKeywords = ['map','concept','from','optional','default','range','regex','length','abstract','namespace','import', 'enum', 'scalar', 'extends', 'default', 'participant','asset', 'o','identified by','transaction','event'];
const concertoTypes = ['String','Integer','Double','DateTime','Long','Boolean']

export default function ConcertoEditor( {value, onChange} : {value: string, onChange?: (value:string|undefined) => void} ) {

function handleEditorWillMount(monaco:monaco.Monaco) {
monaco.languages.register({
id: 'concerto',
extensions: ['.cto'],
aliases: ['Concerto', 'concerto'],
mimetypes: ['application/vnd.accordproject.concerto'],
});

monaco.languages.setMonarchTokensProvider('concerto', {
keywords: concertoKeywords,
typeKeywords: concertoTypes,
operators: ['=', '{', '}', '@', '"'],
symbols: /[=}{@"]+/,
escapes: /\\(?:[btnfru"'\\]|\\u[0-9A-Fa-f]{4})/,
tokenizer: {
root: [
{ include: '@whitespace' },
[/[a-zA-Z_]\w*/, {
cases: {
'@keywords': 'keyword',
'@typeKeywords': 'type',
'@default': 'identifier',
},
}],
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-terminated string
[/"/, 'string', '@string'],
],
string: [
[/[^\\"]+/, 'string'],
[/@escapes/, 'string.escape'],
[/\\./, 'string.escape.invalid'],
[/"/, 'string', '@pop'],
],
whitespace: [
[/\s+/, 'white'],
[/(\/\/.*)/, 'comment'],
],
},
});
monaco.editor.defineTheme('concertoTheme', {
base: 'vs',
inherit: true,
rules: [
{ token: 'keyword', foreground: 'cd2184' },
{ token: 'type', foreground: '008080' },
{ token: 'identifier', foreground: '000000' },
{ token: 'string', foreground: '008000' },
{ token: 'string.escape', foreground: '800000' },
{ token: 'comment', foreground: '808080' },
{ token: 'white', foreground: 'FFFFFF' },
],
colors: {},
});

monaco.editor.setTheme('concertoTheme');
}

return (
<div className="editorwrapper">
<monaco.Editor options={ options }
language='concerto' height="60vh" value={value} onChange={onChange} beforeMount={handleEditorWillMount}/>
</div>
);
}
18 changes: 18 additions & 0 deletions src/JSONEditor.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import * as monaco from '@monaco-editor/react';
import { editor } from 'monaco-editor';

const options:editor.IStandaloneEditorConstructionOptions = {
minimap: { enabled: false },
wordWrap: "on",
automaticLayout:true
}

export default function JSONEditor( {value, onChange} : {value: string, onChange?: (value:string|undefined) => void} ) {

return (
<div className="editorwrapper">
<monaco.Editor options={ options }
language='json' height="60vh" value={value} onChange={onChange} />
</div>
);
}
4 changes: 2 additions & 2 deletions src/TemplateModel.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import MarkdownEditor from './MarkdownEditor';
import ConcertoEditor from './ConcertoEditor';
import useAppStore from './store';

function TemplateModel() {
Expand All @@ -15,7 +15,7 @@ function TemplateModel() {
<div className="tooltip"><h3>Concerto Model</h3>
<span className="tooltiptext">Defines the data model for the template and its logic.</span>
</div>
<MarkdownEditor value={model} onChange={onChange}/>
<ConcertoEditor value={model} onChange={onChange}/>
</div>;
}

Expand Down

0 comments on commit 9cdbc32

Please sign in to comment.