@ks89/ngx-codemirror6
Version:
Codemirror 6 library for Angular
118 lines • 13.1 kB
JavaScript
/**
* The MIT License (MIT)
*
* Copyright (c) 2023 Stefano Cappa (Ks89)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import { Component, Input, ViewChild, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { EditorView, lineNumbers } from '@codemirror/view';
import { EditorState } from '@codemirror/state';
import { html } from '@codemirror/lang-html';
import { css } from '@codemirror/lang-css';
import { javascript } from '@codemirror/lang-javascript';
import { sass } from '@codemirror/lang-sass';
import { basicSetup } from 'codemirror';
import * as i0 from "@angular/core";
/**
* CodeMirror component
*/
export class CodemirrorComponent {
constructor() {
this.content = '';
this.appendExtensions = [];
this.language = '';
}
ngAfterViewInit() {
let lang;
switch (this.language) {
case 'html':
lang = html();
break;
case 'javascript':
lang = javascript({ typescript: false, jsx: false });
break;
case 'typescript':
lang = javascript({ typescript: true, jsx: false });
break;
case 'jsx':
lang = javascript({ typescript: false, jsx: true });
break;
case 'css':
lang = css();
break;
case 'scss':
lang = sass();
break;
case 'sass':
lang = sass({ indented: true });
break;
default:
throw new Error('Internal ngx-codemirror6 error - unrecognized language');
}
const extensions = [lineNumbers(), lang, basicSetup, EditorState.readOnly.of(true), ...this.appendExtensions];
const config = {
doc: this.content,
extensions: extensions
};
this.codemirrorInit(config);
}
codemirrorInit(config) {
if (!this.host) {
throw new Error('Internal ngx-codemirror6 error - host must be defined');
}
new EditorView({
parent: this.host.nativeElement,
state: EditorState.create(config)
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CodemirrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: CodemirrorComponent, selector: "ks-codemirror", inputs: { content: "content", appendExtensions: "appendExtensions", language: "language" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CodemirrorComponent),
multi: true
}
], viewQueries: [{ propertyName: "host", first: true, predicate: ["host"], descendants: true }], ngImport: i0, template: `<div #host></div>`, isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CodemirrorComponent, decorators: [{
type: Component,
args: [{
selector: 'ks-codemirror',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CodemirrorComponent),
multi: true
}
],
template: `<div #host></div>`
}]
}], propDecorators: { content: [{
type: Input
}], appendExtensions: [{
type: Input
}], language: [{
type: Input
}], host: [{
type: ViewChild,
args: ['host']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvZGVtaXJyb3I2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tzODkvbmd4LWNvZGVtaXJyb3I2L3NyYy9saWIvbmd4LWNvZGVtaXJyb3I2LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBZ0MsTUFBTSxtQkFBbUIsQ0FBQztBQUU5RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFeEM7O0dBRUc7QUFZSCxNQUFNLE9BQU8sbUJBQW1CO0lBWGhDO1FBWVcsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixxQkFBZ0IsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLGFBQVEsR0FBVyxFQUFFLENBQUM7S0FpRGhDO0lBN0NDLGVBQWU7UUFDYixJQUFJLElBQXFCLENBQUM7UUFDMUIsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNO2dCQUNULElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLElBQUksR0FBRyxVQUFVLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLElBQUksR0FBRyxVQUFVLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksR0FBRyxVQUFVLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDaEMsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNILE1BQU0sTUFBTSxHQUFzQjtZQUNoQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDakIsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUF5QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQztZQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFDL0IsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBbkRVLG1CQUFtQjtrR0FBbkIsbUJBQW1CLG9JQVRuQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2xELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRix3SEFDUyxtQkFBbUI7OzJGQUVsQixtQkFBbUI7a0JBWC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b0JBQ0QsUUFBUSxFQUFFLG1CQUFtQjtpQkFDOUI7OEJBRVUsT0FBTztzQkFBZixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVhLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIFN0ZWZhbm8gQ2FwcGEgKEtzODkpXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04gSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRWRpdG9yVmlldywgbGluZU51bWJlcnMgfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7IEVkaXRvclN0YXRlLCBFZGl0b3JTdGF0ZUNvbmZpZywgRXh0ZW5zaW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTdXBwb3J0IH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmctaHRtbCc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLWNzcyc7XG5pbXBvcnQgeyBqYXZhc2NyaXB0IH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZy1qYXZhc2NyaXB0JztcbmltcG9ydCB7IHNhc3MgfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLXNhc3MnO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3InO1xuXG4vKipcbiAqIENvZGVNaXJyb3IgY29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tzLWNvZGVtaXJyb3InLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvZGVtaXJyb3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlOiBgPGRpdiAjaG9zdD48L2Rpdj5gXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgY29udGVudDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGFwcGVuZEV4dGVuc2lvbnM6IEV4dGVuc2lvbltdID0gW107XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgPSAnJztcblxuICBAVmlld0NoaWxkKCdob3N0JykgaG9zdDogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgbGV0IGxhbmc6IExhbmd1YWdlU3VwcG9ydDtcbiAgICBzd2l0Y2ggKHRoaXMubGFuZ3VhZ2UpIHtcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICBsYW5nID0gaHRtbCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2phdmFzY3JpcHQnOlxuICAgICAgICBsYW5nID0gamF2YXNjcmlwdCh7IHR5cGVzY3JpcHQ6IGZhbHNlLCBqc3g6IGZhbHNlIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3R5cGVzY3JpcHQnOlxuICAgICAgICBsYW5nID0gamF2YXNjcmlwdCh7IHR5cGVzY3JpcHQ6IHRydWUsIGpzeDogZmFsc2UgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnanN4JzpcbiAgICAgICAgbGFuZyA9IGphdmFzY3JpcHQoeyB0eXBlc2NyaXB0OiBmYWxzZSwganN4OiB0cnVlIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Nzcyc6XG4gICAgICAgIGxhbmcgPSBjc3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzY3NzJzpcbiAgICAgICAgbGFuZyA9IHNhc3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzYXNzJzpcbiAgICAgICAgbGFuZyA9IHNhc3MoeyBpbmRlbnRlZDogdHJ1ZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIG5neC1jb2RlbWlycm9yNiBlcnJvciAtIHVucmVjb2duaXplZCBsYW5ndWFnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbnM6IEV4dGVuc2lvbltdID0gW2xpbmVOdW1iZXJzKCksIGxhbmcsIGJhc2ljU2V0dXAsIEVkaXRvclN0YXRlLnJlYWRPbmx5Lm9mKHRydWUpLCAuLi50aGlzLmFwcGVuZEV4dGVuc2lvbnNdO1xuICAgIGNvbnN0IGNvbmZpZzogRWRpdG9yU3RhdGVDb25maWcgPSB7XG4gICAgICBkb2M6IHRoaXMuY29udGVudCxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnNcbiAgICB9O1xuICAgIHRoaXMuY29kZW1pcnJvckluaXQoY29uZmlnKTtcbiAgfVxuXG4gIGNvZGVtaXJyb3JJbml0KGNvbmZpZzogRWRpdG9yU3RhdGVDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaG9zdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBuZ3gtY29kZW1pcnJvcjYgZXJyb3IgLSBob3N0IG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cbiAgICBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBwYXJlbnQ6IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LFxuICAgICAgc3RhdGU6IEVkaXRvclN0YXRlLmNyZWF0ZShjb25maWcpXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==