all files / keystone/fields/types/markdown/ MarkdownType.js

83.87% Statements 52/62
65.12% Branches 28/43
62.5% Functions 5/8
83.87% Lines 52/62
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135                                                                                                                                                                      
var FieldType = require('../Type');
var marked = require('marked');
var util = require('util');
var TextType = require('../text/TextType');
var utils = require('keystone-utils');
 
/**
 * Markdown FieldType Constructor
 * @extends Field
 * @api public
 */
function markdown (list, path, options) {
	this._defaultSize = 'full';
 
	this.toolbarOptions = options.toolbarOptions || {};
	this.markedOptions = options.markedOptions || {};
	this.height = options.height || 90;
	this.wysiwyg = ('wysiwyg' in options) ? options.wysiwyg : true;
 
	this._properties = ['wysiwyg', 'height', 'toolbarOptions'];
	markdown.super_.call(this, list, path, options);
}
util.inherits(markdown, FieldType);
 
 
markdown.prototype.validateInput = TextType.prototype.validateInput;
markdown.prototype.validateRequiredInput = TextType.prototype.validateRequiredInput;
 
 
/**
 * Registers the field on the List's Mongoose Schema.
 *
 * Adds String properties for .md and .html markdown, and a setter for .md
 * that generates html when it is updated.
 */
markdown.prototype.addToSchema = function () {
 
	var schema = this.list.schema;
 
	var paths = this.paths = {
		md: this._path.append('.md'),
		html: this._path.append('.html'),
	};
 
	var markedOptions = this.markedOptions;
 
	var setMarkdown = function (value) {
		Iif (value === this.get(paths.md)) {
			return value;
		}
		Eif (typeof value === 'string') {
			this.set(paths.html, marked(value, markedOptions));
			return value;
		} else {
			this.set(paths.html, undefined);
			return undefined;
		}
	};
 
	schema.nested[this.path] = true;
	schema.add({
		html: { type: String },
		md: { type: String, set: setMarkdown },
	}, this.path + '.');
 
	this.bindUnderscoreMethods();
};
 
/**
 * Add filters to a query (this is copy & pasted from the text field, with
 * the only difference being that the path isn't this.path but this.paths.md)
 */
markdown.prototype.addFilterToQuery = function (filter, query) {
	query = query || {};
	if (filter.mode === 'exactly' && !filter.value) {
		query[this.paths.md] = filter.inverted ? { $nin: ['', null] } : { $in: ['', null] };
		return query;
	}
	var value = utils.escapeRegExp(filter.value);
	if (filter.mode === 'startsWith') {
		value = '^' + value;
	} else if (filter.mode === 'endsWith') {
		value = value + '$';
	} else if (filter.mode === 'exactly') {
		value = '^' + value + '$';
	}
	value = new RegExp(value, filter.caseSensitive ? '' : 'i');
	query[this.paths.md] = filter.inverted ? { $not: value } : value;
	return query;
};
 
/**
 * Formats the field value
 */
markdown.prototype.format = function (item) {
	return item.get(this.paths.html);
};
 
/**
 * Validates that a value for this field has been provided in a data object
 *
 * Deprecated
 */
markdown.prototype.inputIsValid = function (data, required, item) {
	if (!(this.path in data) && item && item.get(this.paths.md)) {
		return true;
	}
	return (!required || data[this.path]) ? true : false;
};
 
/**
 * Detects whether the field has been modified
 */
markdown.prototype.isModified = function (item) {
	return item.isModified(this.paths.md);
};
 
/**
 * Updates the value for this field in the item from a data object
 *
 * Will accept either the field path, or paths.md
 */
markdown.prototype.updateItem = function (item, data, callback) {
	var value = this.getValueFromData(data);
	Eif (value !== undefined) {
		item.set(this.paths.md, value);
	}	else if (this.paths.md in data) {
		item.set(this.paths.md, data[this.paths.md]);
	}
	process.nextTick(callback);
};
 
/* Export Field Type */
module.exports = markdown;