| |
| /******************************* |
| Summarize Docs |
| *******************************/ |
| |
| var |
| // node dependencies |
| console = require('better-console'), |
| fs = require('fs'), |
| YAML = require('yamljs') |
| ; |
| |
| var data = {}; |
| |
| /** |
| * Test for prefix in string. |
| * @param {string} str |
| * @param {string} prefix |
| * @return {boolean} |
| */ |
| function startsWith(str, prefix) { |
| return str.indexOf(prefix) === 0; |
| }; |
| |
| function inArray(needle, haystack) { |
| var length = haystack.length; |
| for(var i = 0; i < length; i++) { |
| if(haystack[i] == needle) return true; |
| } |
| return false; |
| } |
| |
| /** |
| * Parses a file for metadata and stores result in data object. |
| * @param {File} file - object provided by map-stream. |
| * @param {function(?,File)} - callback provided by map-stream to |
| * reply when done. |
| */ |
| function parser(file, callback) { |
| // file exit conditions |
| if(file.isNull()) { |
| return callback(null, file); // pass along |
| } |
| |
| if(file.isStream()) { |
| return callback(new Error('Streaming not supported')); |
| } |
| |
| try { |
| |
| var |
| /** @type {string} */ |
| text = String(file.contents.toString('utf8')), |
| lines = text.split('\n'), |
| filename = file.path.substring(0, file.path.length - 4), |
| key = 'server/documents', |
| position = filename.indexOf(key) |
| ; |
| |
| // exit conditions |
| if(!lines) { |
| return; |
| } |
| if(position < 0) { |
| return callback(null, file); |
| } |
| |
| filename = filename.substring(position + key.length + 1, filename.length); |
| |
| var |
| lineCount = lines.length, |
| active = false, |
| yaml = [], |
| categories = [ |
| 'UI Element', |
| 'UI Global', |
| 'UI Collection', |
| 'UI View', |
| 'UI Module', |
| 'UI Behavior' |
| ], |
| index, |
| meta, |
| line |
| ; |
| |
| for(index = 0; index < lineCount; index++) { |
| |
| line = lines[index]; |
| |
| // Wait for metadata block to begin |
| if(!active) { |
| if(startsWith(line, '---')) { |
| active = true; |
| } |
| continue; |
| } |
| // End of metadata block, stop parsing. |
| if(startsWith(line, '---')) { |
| break; |
| } |
| yaml.push(line); |
| } |
| |
| |
| // Parse yaml. |
| meta = YAML.parse(yaml.join('\n')); |
| if(meta && meta.type && meta.title && inArray(meta.type, categories) ) { |
| meta.category = meta.type; |
| meta.filename = filename; |
| meta.url = '/' + filename; |
| meta.title = meta.title; |
| // Primary key will by filepath |
| data[meta.element] = meta; |
| } |
| else { |
| // skip |
| // console.log(meta); |
| } |
| |
| |
| } |
| |
| catch(error) { |
| console.log(error, filename); |
| } |
| |
| callback(null, file); |
| |
| } |
| |
| /** |
| * Export function expected by map-stream. |
| */ |
| module.exports = { |
| result : data, |
| parser : parser |
| }; |