104 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*jshint -W054 */
 | |
| ;(function (exports) {
 | |
|   'use strict';
 | |
| 
 | |
|   window.YAML = window.YAML || {};
 | |
|   window.YAML.parse = exports.jsyaml.load || require('jsyaml').load;
 | |
|   window.YAML.stringify = exports.jsyaml.dump || require('jsyaml').dump;
 | |
| 
 | |
|   function readFrontMatter(text) {
 | |
|     var lines
 | |
|       , line
 | |
|       , padIndent = ''
 | |
|       , ymllines = []
 | |
|       ;
 | |
| 
 | |
|     lines = text.split(/\n/);
 | |
|     line = lines.shift();
 | |
| 
 | |
|     if (!line.match(/^---\s*$/)) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     // our yaml parser can't handle objects
 | |
|     // that start without indentation, so
 | |
|     // we can add it if this is the case
 | |
|     if (lines[0] && lines[0].match(/^\S/)) {
 | |
|       padIndent = '';
 | |
|     }
 | |
| 
 | |
|     while (true) {
 | |
|       line = lines.shift();
 | |
| 
 | |
|       // premature end-of-file (unsupported yaml)
 | |
|       if (!line && '' !== line) {
 | |
|         ymllines = [];
 | |
|         break;
 | |
|       }
 | |
| 
 | |
|       // end-of-yaml front-matter
 | |
|       if (line.match(/^---\s*$/)) {
 | |
|         break;
 | |
|       }
 | |
| 
 | |
|       if (line) {
 | |
|         // supported yaml
 | |
|         ymllines.push(padIndent + line); 
 | |
|       }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     // XXX can't be sorted because arrays get messed up
 | |
|     //ymllines.sort();
 | |
|     if (ymllines) {
 | |
|       return '---\n' + ymllines.join('\n');
 | |
|     }
 | |
| 
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   function separateText(text, fm) {
 | |
|     var len
 | |
|       , yml
 | |
|       ;
 | |
| 
 | |
|     yml = readFrontMatter(fm);
 | |
|     // strip frontmatter from text, if any
 | |
|     // including trailing '---' (which is accounted for by the added '\n')
 | |
|     if (yml) {
 | |
|       len = fm.split(/\n/).length + 1;
 | |
|     } else {
 | |
|       len = 0;
 | |
|     }
 | |
| 
 | |
|     return text.split(/\n/).slice(len).join('\n');
 | |
|   }
 | |
| 
 | |
|   function parseText(text) {
 | |
|     var fm = readFrontMatter(text)
 | |
|       , body = fm && separateText(text, fm)
 | |
|       , yml
 | |
|       ;
 | |
| 
 | |
|     if (fm) {
 | |
|       try {
 | |
|         yml = window.YAML.parse(fm);
 | |
|       } catch(e) {
 | |
|         //
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return {
 | |
|       yml: yml
 | |
|     , frontmatter: fm
 | |
|     , body: body
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   exports.Frontmatter = exports.Frontmatter = {};
 | |
|   exports.Frontmatter.Frontmatter = exports.Frontmatter;
 | |
|   exports.Frontmatter.readText = readFrontMatter;
 | |
|   exports.Frontmatter.separateText = separateText;
 | |
|   exports.Frontmatter.parse = parseText;
 | |
| }('undefined' !== typeof exports && exports || window));
 |