37 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			37 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const visit = require('unist-util-visit');
							 | 
						||
| 
								 | 
							
								const is = require('hast-util-is-element');
							 | 
						||
| 
								 | 
							
								const textContent = require('hast-util-to-string');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Automatically add in a link to the relevant document for simple
							 | 
						||
| 
								 | 
							
								 * code blocks, e.g. `<code>MyClass</code>` becomes
							 | 
						||
| 
								 | 
							
								 * `<code><a href="path/to/myclass">MyClass</a></code>`
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @property docTypes an array of strings. Only docs that have one of these docTypes
							 | 
						||
| 
								 | 
							
								 * will be linked to.
							 | 
						||
| 
								 | 
							
								 * Usually set to the API exported docTypes, e.g. "class", "function", "directive", etc.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								module.exports = function autoLinkCode(getDocFromAlias) {
							 | 
						||
| 
								 | 
							
								  autoLinkCodeImpl.docTypes = [];
							 | 
						||
| 
								 | 
							
								  return autoLinkCodeImpl;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function autoLinkCodeImpl()  {
							 | 
						||
| 
								 | 
							
								    return (ast) => {
							 | 
						||
| 
								 | 
							
								      visit(ast, node => {
							 | 
						||
| 
								 | 
							
								        if (is(node, 'code')) {
							 | 
						||
| 
								 | 
							
								          const docs = getDocFromAlias(textContent(node));
							 | 
						||
| 
								 | 
							
								          if (docs.length === 1 && autoLinkCodeImpl.docTypes.indexOf(docs[0].docType) !== -1) {
							 | 
						||
| 
								 | 
							
								            const link = {
							 | 
						||
| 
								 | 
							
								              type: 'element',
							 | 
						||
| 
								 | 
							
								              tagName: 'a',
							 | 
						||
| 
								 | 
							
								              properties: { href: docs[0].path },
							 | 
						||
| 
								 | 
							
								              children: node.children
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            node.children = [link];
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 |