45 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const components = require(`prismjs/components`);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {
							 | 
						||
| 
								 | 
							
								  names: ['prism-langs'],
							 | 
						||
| 
								 | 
							
								  description: 'Code block languages should be supported by PrismJS',
							 | 
						||
| 
								 | 
							
								  tags: ['prism'],
							 | 
						||
| 
								 | 
							
								  function: function rule(params, onError) {
							 | 
						||
| 
								 | 
							
								    params.tokens
							 | 
						||
| 
								 | 
							
								      .filter(param => param.type === 'fence')
							 | 
						||
| 
								 | 
							
								      .forEach(codeBlock => {
							 | 
						||
| 
								 | 
							
								        // whitespace around the language is ignored by the parser, as is case:
							 | 
						||
| 
								 | 
							
								        const baseLang = codeBlock.info.trim().toLowerCase();
							 | 
						||
| 
								 | 
							
								        const lang = getBaseLanguageName(baseLang);
							 | 
						||
| 
								 | 
							
								        // Rule MD040 checks if the block has a language, so this rule only
							 | 
						||
| 
								 | 
							
								        // comes into play if a language has been specified.
							 | 
						||
| 
								 | 
							
								        if (baseLang && !lang) {
							 | 
						||
| 
								 | 
							
								          onError({
							 | 
						||
| 
								 | 
							
								            lineNumber: codeBlock.lineNumber,
							 | 
						||
| 
								 | 
							
								            detail: `\'${baseLang}\' is not recognised.`
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * This is the method used by https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-remark-prismjs/src/load-prism-language.js
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Get the real name of a language given it or an alias
							 | 
						||
| 
								 | 
							
								const getBaseLanguageName = nameOrAlias => {
							 | 
						||
| 
								 | 
							
								  if (components.languages[nameOrAlias]) {
							 | 
						||
| 
								 | 
							
								    return nameOrAlias;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return Object.keys(components.languages).find(language => {
							 | 
						||
| 
								 | 
							
								    const { alias } = components.languages[language];
							 | 
						||
| 
								 | 
							
								    if (!alias) return false;
							 | 
						||
| 
								 | 
							
								    if (Array.isArray(alias)) {
							 | 
						||
| 
								 | 
							
								      return alias.includes(nameOrAlias);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return alias === nameOrAlias;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								};
							 |