|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- // Copyright 2014 Mark Cavage, Inc. All rights reserved.
- // Copyright 2014 Patrick Mooney. All rights reserved.
-
- var util = require('util');
-
- var assert = require('assert-plus');
-
- var helpers = require('./helpers');
-
-
- ///--- Helpers
-
- function escapeRegExp(str) {
- /* JSSTYLED */
- return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
- }
-
-
- ///--- API
-
- function SubstringFilter(options) {
- if (typeof (options) === 'object') {
- assert.string(options.attribute, 'options.attribute');
-
- this.attribute = options.attribute;
- this.initial = options.initial;
- this.any = options.any ? options.any.slice(0) : [];
- this.final = options.final;
- } else {
- this.any = [];
- }
-
- var self = this;
- this.__defineGetter__('type', function () { return 'substring'; });
- this.__defineGetter__('json', function () {
- return {
- type: 'SubstringMatch',
- initial: self.initial,
- any: self.any,
- final: self.final
- };
- });
- }
- util.inherits(SubstringFilter, helpers.Filter);
-
-
- SubstringFilter.prototype.toString = function () {
- var str = '(' + helpers.escape(this.attribute) + '=';
-
- if (this.initial)
- str += helpers.escape(this.initial);
-
- str += '*';
-
- this.any.forEach(function (s) {
- str += helpers.escape(s) + '*';
- });
-
- if (this.final)
- str += helpers.escape(this.final);
-
- str += ')';
-
- return str;
- };
-
-
- SubstringFilter.prototype.matches = function (target, strictAttrCase) {
- assert.object(target, 'target');
-
- var tv = helpers.getAttrValue(target, this.attribute, strictAttrCase);
-
- if (tv !== undefined && tv !== null) {
- var re = '';
-
- if (this.initial)
- re += '^' + escapeRegExp(this.initial) + '.*';
- this.any.forEach(function (s) {
- re += escapeRegExp(s) + '.*';
- });
- if (this.final)
- re += escapeRegExp(this.final) + '$';
-
- var matcher = new RegExp(re);
- return helpers.testValues(function (v) {
- return matcher.test(v);
- }, tv);
- }
-
- return false;
- };
-
-
- ///--- Exports
-
- module.exports = SubstringFilter;
|