UNPKG

cu-mongoose-troop

Version:
73 lines (61 loc) 2.05 kB
// (c) 2012 Beau Sorensen // MIT Licensed // For all details and documentation: // https://github.com/tblobaum/mongoose-troop // Slugify // ------- // Plugin function slugify (schema, options) { options || (options = {}) // Options var target = options.target || 'slug' // Slug destination , source = options.source || 'title' // Slug content field , maxLength = options.maxLength || 50 // Max slug length , spaceChar = options.spaceChar || '-' // Space replacement , invalidChar = options.invalidChar || '' // Invalid char replacement , override = options.override || false // Override slug on set , fr = 'àáâãäåçèéêëìíîïñðóòôõöøùúûüýÿ' // Accent chars to find , to = 'aaaaaaceeeeiiiinooooooouuuuyy' // Accent replacement , fields = {} // Add paths to schema if not present if (!schema.paths[target]) { fields[target] = { type: String , unique: true , sparse: true } } if (!schema.paths[source]) { fields[source] = String } schema.add(fields) // Add slugify method to both model and instance ;['static' , 'method' ].forEach(function (method) { schema[method]('slugify', function (str) { if (!str) return str = str .replace(/^\s+|\s+$/g, '') .toLowerCase() // Convert all accent characters for (var i=0; i<fr.length; i++) { str = str.replace(new RegExp(fr.charAt(i), 'g'), to.charAt(i)) } // Replace all invalid characters and spaces, truncating to the max length return str .replace(/[^a-z0-9 -]/g, invalidChar) .replace(new RegExp('['+invalidChar+']'+'+', 'g'), invalidChar) .replace(/\s+/g, spaceChar) .substr(0, maxLength) }) }) // Extract the slug on save, optionally overriding a previous value schema.pre('save', function (next) { if (!this[target] || override) { this[target] = this.slugify(this[source]) } next() }) } module.exports = slugify