source: node_modules/react-syntax-highlighter/src/async-syntax-highlighter.js@ d24f17c

main
Last change on this file since d24f17c was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[d24f17c]1import React from 'react';
2import highlight from './highlight';
3
4export default options => {
5 const {
6 loader,
7 isLanguageRegistered,
8 registerLanguage,
9 languageLoaders,
10 noAsyncLoadingLanguages
11 } = options;
12
13 class ReactAsyncHighlighter extends React.PureComponent {
14 static astGenerator = null;
15 static highlightInstance = highlight(null, {});
16 static astGeneratorPromise = null;
17 static languages = new Map();
18 static supportedLanguages =
19 options.supportedLanguages || Object.keys(languageLoaders || {});
20
21 static preload() {
22 return ReactAsyncHighlighter.loadAstGenerator();
23 }
24
25 static async loadLanguage(language) {
26 const languageLoader = languageLoaders[language];
27
28 if (typeof languageLoader === 'function') {
29 return languageLoader(ReactAsyncHighlighter.registerLanguage);
30 } else {
31 throw new Error(`Language ${language} not supported`);
32 }
33 }
34
35 static isSupportedLanguage(language) {
36 return (
37 ReactAsyncHighlighter.isRegistered(language) ||
38 typeof languageLoaders[language] === 'function'
39 );
40 }
41
42 static isRegistered = language => {
43 if (noAsyncLoadingLanguages) {
44 return true;
45 }
46
47 if (!registerLanguage) {
48 throw new Error(
49 "Current syntax highlighter doesn't support registration of languages"
50 );
51 }
52
53 if (!ReactAsyncHighlighter.astGenerator) {
54 // Ast generator not available yet, but language will be registered once it is.
55 return ReactAsyncHighlighter.languages.has(language);
56 }
57
58 return isLanguageRegistered(ReactAsyncHighlighter.astGenerator, language);
59 };
60
61 static registerLanguage = (name, language) => {
62 if (!registerLanguage) {
63 throw new Error(
64 "Current syntax highlighter doesn't support registration of languages"
65 );
66 }
67
68 if (ReactAsyncHighlighter.astGenerator) {
69 return registerLanguage(
70 ReactAsyncHighlighter.astGenerator,
71 name,
72 language
73 );
74 } else {
75 ReactAsyncHighlighter.languages.set(name, language);
76 }
77 };
78
79 static loadAstGenerator() {
80 ReactAsyncHighlighter.astGeneratorPromise = loader().then(
81 astGenerator => {
82 ReactAsyncHighlighter.astGenerator = astGenerator;
83
84 if (registerLanguage) {
85 ReactAsyncHighlighter.languages.forEach((language, name) =>
86 registerLanguage(astGenerator, name, language)
87 );
88 }
89 }
90 );
91
92 return ReactAsyncHighlighter.astGeneratorPromise;
93 }
94
95 componentDidUpdate() {
96 if (
97 !ReactAsyncHighlighter.isRegistered(this.props.language) &&
98 languageLoaders
99 ) {
100 this.loadLanguage();
101 }
102 }
103
104 componentDidMount() {
105 if (!ReactAsyncHighlighter.astGeneratorPromise) {
106 ReactAsyncHighlighter.loadAstGenerator();
107 }
108
109 if (!ReactAsyncHighlighter.astGenerator) {
110 ReactAsyncHighlighter.astGeneratorPromise.then(() => {
111 this.forceUpdate();
112 });
113 }
114
115 if (
116 !ReactAsyncHighlighter.isRegistered(this.props.language) &&
117 languageLoaders
118 ) {
119 this.loadLanguage();
120 }
121 }
122
123 loadLanguage() {
124 const { language } = this.props;
125
126 if (language === 'text') {
127 return;
128 }
129
130 ReactAsyncHighlighter.loadLanguage(language)
131 .then(() => {
132 return this.forceUpdate();
133 })
134 .catch(() => {});
135 }
136
137 normalizeLanguage(language) {
138 return ReactAsyncHighlighter.isSupportedLanguage(language)
139 ? language
140 : 'text';
141 }
142
143 render() {
144 return (
145 <ReactAsyncHighlighter.highlightInstance
146 {...this.props}
147 language={this.normalizeLanguage(this.props.language)}
148 astGenerator={ReactAsyncHighlighter.astGenerator}
149 />
150 );
151 }
152 }
153
154 return ReactAsyncHighlighter;
155};
Note: See TracBrowser for help on using the repository browser.