116 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*jshint -W054 */
 | |
| ;(function (exports) {
 | |
|   'use strict';
 | |
| 
 | |
|   function create(Desi) {
 | |
|     Desi.YAML           = {};
 | |
|     Desi.YAML.parse     = (exports.jsyaml || require('js-yaml')).load;
 | |
|     Desi.YAML.stringify = (exports.jsyaml || require('js-yaml')).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 = Desi.YAML.parse(fm);
 | |
|         } catch(e) {
 | |
|           //
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       return {
 | |
|         yml: yml
 | |
|       , frontmatter: fm
 | |
|       , body: body
 | |
|       };
 | |
|     }
 | |
| 
 | |
|     exports.Frontmatter = {};
 | |
|     exports.Frontmatter.Frontmatter = exports.Frontmatter;
 | |
|     exports.Frontmatter.readText = readFrontMatter;
 | |
|     exports.Frontmatter.separateText = separateText;
 | |
|     exports.Frontmatter.parse = parseText;
 | |
|     exports.Frontmatter.YAML = Desi.YAML;
 | |
|     Desi.Frontmatter = exports.Frontmatter;
 | |
| 
 | |
|     return exports;
 | |
|   }
 | |
| 
 | |
|   if (exports.Desirae) {
 | |
|     create(exports.Desirae);
 | |
|   } else {
 | |
|     exports.create = create;
 | |
|   }
 | |
| }('undefined' !== typeof exports && exports || window));
 |