From 0e7bd75b8683c97ecb096a8f6420ee8724a2394e Mon Sep 17 00:00:00 2001 From: Gleb Kemarsky Date: Sun, 3 Oct 2021 00:23:15 +0200 Subject: [PATCH] Set up development environment --- .eslintrc.json | 10 +++ .jshintrc | 19 +++++ .../js/jquery-search-among.js | 0 dist/jquery-search-among.js | 44 ++++++++++ dist/jquery-search-among.min.js | 10 +++ gulpfile.js | 84 +++++++++++++++++++ package.json | 60 +++++++++++++ tasks/css-min.js | 29 +++++++ tasks/css.js | 22 +++++ tasks/js-build.js | 28 +++++++ tasks/js-hint.js | 20 +++++ tasks/js-lint.js | 58 +++++++++++++ tasks/js-min.js | 23 +++++ tasks/js.js | 17 ++++ tasks/serve.js | 17 ++++ tests/index.html | 78 +++++++++++++++++ 16 files changed, 519 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .jshintrc rename jquery-search-among.js => app/js/jquery-search-among.js (100%) create mode 100644 dist/jquery-search-among.js create mode 100644 dist/jquery-search-among.min.js create mode 100644 gulpfile.js create mode 100644 package.json create mode 100644 tasks/css-min.js create mode 100644 tasks/css.js create mode 100644 tasks/js-build.js create mode 100644 tasks/js-hint.js create mode 100644 tasks/js-lint.js create mode 100644 tasks/js-min.js create mode 100644 tasks/js.js create mode 100644 tasks/serve.js create mode 100644 tests/index.html diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..d0a4832 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "env": { + "browser": true, + "jquery": true + }, + "extends": "jquery", + "rules": { + "no-console": "off" + } +} \ No newline at end of file diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..5d94e4b --- /dev/null +++ b/.jshintrc @@ -0,0 +1,19 @@ +{ + "boss": true, + "curly": true, + "eqeqeq": true, + "eqnull": true, + "expr": true, + "immed": true, + "noarg": true, + "quotmark": "double", + "smarttabs": true, + "trailing": true, + "undef": true, + "unused": true, + + "browser": true, + "devel": true, + "jquery": true, + "esversion": 6 +} \ No newline at end of file diff --git a/jquery-search-among.js b/app/js/jquery-search-among.js similarity index 100% rename from jquery-search-among.js rename to app/js/jquery-search-among.js diff --git a/dist/jquery-search-among.js b/dist/jquery-search-among.js new file mode 100644 index 0000000..71bc008 --- /dev/null +++ b/dist/jquery-search-among.js @@ -0,0 +1,44 @@ +/*! + * jQuery Search Among Plugin + * https://github.com/glebkema/jquery-search-among + * + * Version: 0.2.1 + * + * Copyright Gleb Kemarsky + * Released under the MIT license. + */ + +(function ($) { + + $.fn.searchAmong = function($items) { + let oldSearch = ""; + + $(this).on("input", function() { + let newSearch = this.value.trim().toLowerCase(); + if (newSearch !== oldSearch) { + oldSearch = newSearch; + if (newSearch) { + let words = newSearch.split(/\s+/); + let count = words.length; + for (let item of $items) { + let text = $(item).text().toLowerCase(); + let is_visible = true; + for (let i = 0; i < count; i++) { + if (-1 === text.indexOf(words[i])) { + is_visible = false; + break; + } + } + $(item).toggle(is_visible); + } + } + else { + $items.show(); + } + } + }); + + return this; + }; + +}(jQuery)); \ No newline at end of file diff --git a/dist/jquery-search-among.min.js b/dist/jquery-search-among.min.js new file mode 100644 index 0000000..0dc04e6 --- /dev/null +++ b/dist/jquery-search-among.min.js @@ -0,0 +1,10 @@ +/*! + * jQuery Search Among Plugin + * https://github.com/glebkema/jquery-search-among + * + * Version: 0.2.1 + * + * Copyright Gleb Kemarsky + * Released under the MIT license. + */ +!function(r){r.fn.searchAmong=function(e){let o="";return r(this).on("input",function(){let t=this.value.trim().toLowerCase();if(t!==o)if(o=t,t){var i,n=t.split(/\s+/),f=n.length;for(i of e){let e=r(i).text().toLowerCase(),o=!0;for(let t=0;t 1%", + "last 2 versions", + "IE >= 9" + ], + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "jquery plugin", + "search" + ], + "author": "glebkema ", + "license": "MIT", + "devDependencies": { + "autoprefixer": "^9.6.4", + "browser-sync": "^2.26.7", + "del": "^5.1.0", + "eslint-config-standard": "^14.1.0", + "eslint-config-wordpress": "^2.0.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-node": "^10.0.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "fs": "0.0.2", + "gulp": "^4.0.2", + "gulp-cssnano": "^2.1.3", + "gulp-debug": "^4.0.0", + "gulp-eslint": "^6.0.0", + "gulp-if": "^3.0.0", + "gulp-jshint": "^2.1.0", + "gulp-load-plugins": "^2.0.1", + "gulp-newer": "^1.4.0", + "gulp-notify": "^3.2.0", + "gulp-postcss": "^8.0.0", + "gulp-rename": "^1.4.0", + "gulp-replace": "^1.1.3", + "gulp-sass": "^5.0.0", + "gulp-sourcemaps": "^2.6.5", + "gulp-uglify": "^3.0.2", + "jshint": "^2.10.2", + "jshint-stylish": "^2.2.1", + "multipipe": "^3.0.1", + "pump": "^3.0.0", + "through2": "^3.0.1" + }, + "dependencies": { + "npm": "^6.11.3" + }, + "optionalDependencies": {} +} diff --git a/tasks/css-min.js b/tasks/css-min.js new file mode 100644 index 0000000..017ff91 --- /dev/null +++ b/tasks/css-min.js @@ -0,0 +1,29 @@ +'use strict'; + +const $ = require('gulp-load-plugins')(); +const gulp = require('gulp'); +const pump = require('pump'); // https://github.com/gulpjs/gulp/tree/master/docs/why-use-pump +const package_json = require('../package.json'); // https://stackoverflow.com/a/22646149/6263942 + +module.exports = function(options) { + + return function(callback) { + pump([ + gulp.src(options.src), + $.if(options.isDevelopment, $.sourcemaps.init()), + $.sass(), + //gulp.dest('app/css'), + $.cssnano({ + // autoprefixer: {browsers: ['> 1%', 'last 2 versions', 'ie >= 9'], add: true}, + autoprefixer: {browsers: package_json.browserslist, add: true}, + }), + $.debug({title: options.taskName}), + $.if(options.isDevelopment, $.sourcemaps.write('.')), + $.rename({suffix: '.min'}), + gulp.dest(options.dest), + ], + callback + ); + }; + +}; diff --git a/tasks/css.js b/tasks/css.js new file mode 100644 index 0000000..40625c8 --- /dev/null +++ b/tasks/css.js @@ -0,0 +1,22 @@ +'use strict'; + +const $ = require('gulp-load-plugins')(); +const gulp = require('gulp'); +const autoprefixer = require('autoprefixer'); +const multipipe = require('multipipe'); + +module.exports = function(options) { + + return function() { + return multipipe( + gulp.src(options.src), + $.if(options.isDevelopment, $.sourcemaps.init()), + $.sass(), + $.postcss([ autoprefixer() ]), + $.debug({title: options.taskName}), + $.if(options.isDevelopment, $.sourcemaps.write('.')), + gulp.dest(options.dest) + ).on('error', $.notify.onError()); + }; + +}; diff --git a/tasks/js-build.js b/tasks/js-build.js new file mode 100644 index 0000000..5f5367f --- /dev/null +++ b/tasks/js-build.js @@ -0,0 +1,28 @@ +'use strict'; + +const $ = require('gulp-load-plugins')(); +const gulp = require('gulp'); +const pump = require('pump'); // https://github.com/gulpjs/gulp/tree/master/docs/why-use-pump +const replace = require('gulp-replace'); // ??? why does not work "$.replace" + +module.exports = function(options) { + + return function(callback) { + pump([ + gulp.src(options.src, {since: gulp.lastRun(options.taskName)}), + replace('\'', '"'), // https://www.npmjs.com/package/gulp-replace + $.debug({title: options.taskName}), // ????? + gulp.dest(options.dest), + $.jshint(), + $.jshint.reporter('jshint-stylish'), + $.jshint.reporter('fail'), // https://www.npmjs.com/package/gulp-jshint + $.uglify({output: {comments: /^!/}}), + $.debug({title: options.taskName}), // ????? + $.rename({suffix: '.min'}), + gulp.dest(options.dest), + ], + callback + ); + }; + +}; diff --git a/tasks/js-hint.js b/tasks/js-hint.js new file mode 100644 index 0000000..ea6b439 --- /dev/null +++ b/tasks/js-hint.js @@ -0,0 +1,20 @@ +'use strict'; + +const $ = require('gulp-load-plugins')(); +const gulp = require('gulp'); +const multipipe = require('multipipe'); + +module.exports = function(options) { + + return function() { + return multipipe( + gulp.src(options.src, {since: gulp.lastRun(options.taskName)}), + $.jshint(), + // $.jshint.reporter('jshint-stylish'), + $.jshint.reporter('jshint-stylish', {beep: true}), // https://www.npmjs.com/package/jshint-stylish + // $.jshint.reporter('fail'), // https://www.npmjs.com/package/gulp-jshint + $.debug({title: options.taskName}) + ).on('error', $.notify.onError()); + }; + +}; diff --git a/tasks/js-lint.js b/tasks/js-lint.js new file mode 100644 index 0000000..ce9fea6 --- /dev/null +++ b/tasks/js-lint.js @@ -0,0 +1,58 @@ +'use strict'; + +const gulp = require('gulp'); +const $ = require('gulp-load-plugins')(); +const through2 = require('through2').obj; +const fs = require('fs'); +const multipipe = require('multipipe'); + +// function isFixed(file) { +// return file.eslint != null && file.eslint.fixed; // has ESLint fixed the file contents? +// } + +module.exports = function(options) { + + return function() { + + let eslintResults = {}; + let cacheFilePath = options.cacheFilePath; + + try { + eslintResults = JSON.parse(fs.readFileSync(cacheFilePath)); + } catch (e) { + } + + return gulp.src(options.src, {read: false}) + .pipe($.if( + function(file) { + return eslintResults[file.path] && eslintResults[file.path].mtime == file.stat.mtime.toJSON(); + }, + through2(function(file, enc, callback) { + file.eslint = eslintResults[file.path].eslint; + callback(null, file); + }), + multipipe( + through2(function(file, enc, callback) { + file.contents = fs.readFileSync(file.path); + callback(null, file); + }), + $.eslint({ fix: true }), // https://stackoverflow.com/a/37108027/6263942 +// how to use? $.eslint.format(), +// how to use? $.if(isFixed, gulp.dest(options.dest)), + $.eslint.failAfterError(), + through2(function(file, enc, callback) { + eslintResults[file.path] = { + eslint: file.eslint, + mtime: file.stat.mtime, + }; + callback(null, file); + }) + ) + )) + .on('end', function() { + fs.writeFileSync(cacheFilePath, JSON.stringify((eslintResults))); + }) + .pipe($.eslint.format()); + }; + +}; diff --git a/tasks/js-min.js b/tasks/js-min.js new file mode 100644 index 0000000..7b1d737 --- /dev/null +++ b/tasks/js-min.js @@ -0,0 +1,23 @@ +'use strict'; + +const $ = require('gulp-load-plugins')(); +const gulp = require('gulp'); +const pump = require('pump'); // https://github.com/gulpjs/gulp/tree/master/docs/why-use-pump + +module.exports = function(options) { + + return function(callback) { + pump([ + gulp.src(options.src), + $.if(options.isDevelopment, $.sourcemaps.init()), + $.uglify({output: {comments: /^!/}}), + $.debug({title: options.taskName}), + $.if(options.isDevelopment, $.sourcemaps.write('.')), + $.rename({suffix: '.min'}), + gulp.dest(options.dest), + ], + callback + ); + }; + +}; diff --git a/tasks/js.js b/tasks/js.js new file mode 100644 index 0000000..9840271 --- /dev/null +++ b/tasks/js.js @@ -0,0 +1,17 @@ +'use strict'; + +const $ = require('gulp-load-plugins')(); +const gulp = require('gulp'); +const multipipe = require('multipipe'); + +module.exports = function(options) { + + return function() { + return multipipe( + gulp.src(options.src, {since: gulp.lastRun(options.taskName)}), + $.debug({title: options.taskName}), + gulp.dest(options.dest) + ).on('error', $.notify.onError()); + }; + +}; diff --git a/tasks/serve.js b/tasks/serve.js new file mode 100644 index 0000000..c919372 --- /dev/null +++ b/tasks/serve.js @@ -0,0 +1,17 @@ +'use strict'; + +const browserSync = require('browser-sync').create(); + +module.exports = function(options) { + + return function() { + + browserSync.init({ // https://browsersync.io/docs/options#option-server + // browser: ["google chrome", "firefox"], + server: options.server, + }); + + browserSync.watch(`${options.src}/**/*.*`).on('change', browserSync.reload); + }; + +}; diff --git a/tests/index.html b/tests/index.html new file mode 100644 index 0000000..e96ca67 --- /dev/null +++ b/tests/index.html @@ -0,0 +1,78 @@ + + + + + + jQuery Search Among Plugin + + + +
+
+

+ Use input field to provide a quick search among list items, text paragraphs or another blocks of the web-page content. +
Specify multiple search terms, separated by spaces. +
As you enter characters, inappropriate items disappear. +

+ +
+
+
+

Among paragraphs of the text

+

Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos facere mollitia quidem laudantium illo cum officiis recusandae! Quisquam accusantium reiciendis expedita odio enim reprehenderit tempora, fuga soluta, nemo autem quam.

+

Earum ab, nisi velit minus tenetur repudiandae eum iusto repellat, nulla culpa eius ad voluptas temporibus excepturi sapiente omnis maiores ea aut beatae quas dolore quibusdam dicta corporis vel. Eos.

+

Velit fugit architecto nam vero ad, accusamus consectetur error nihil quibusdam quam deleniti voluptates ab obcaecati cum explicabo iste aliquid sapiente dolore illo! Ullam aspernatur nulla deleniti quaerat sapiente illum.

+

Officiis quos consequuntur modi at nobis voluptatem perspiciatis aut odio quia laborum, exercitationem minima cupiditate dolorum qui cum beatae veritatis illum soluta, esse voluptatibus aliquid natus? Omnis accusamus vel quibusdam.

+

Nesciunt vitae eius perferendis nihil minima sint eos sit! Eveniet nam eum totam optio asperiores fugiat eligendi, voluptate aliquam numquam nemo. Beatae, ducimus iure non ipsa laborum reprehenderit explicabo dolor.

+

Blanditiis neque itaque rerum cumque, adipisci quia nam praesentium animi vero impedit dolores inventore nisi perferendis vitae unde maxime placeat porro! Maiores, quas? Labore non dolorem fugiat voluptas, nobis cumque?

+

Molestias commodi rem excepturi quam molestiae culpa odit, tempora aut nisi quasi repudiandae facilis iste similique! Enim, quis nesciunt. Odit laudantium quas veritatis doloribus assumenda quibusdam quasi ullam quaerat amet.

+

Aperiam eum non cupiditate dolorum dolores corrupti eligendi? Maiores nemo sed enim corporis nam, alias, ut labore laborum dignissimos tenetur aliquid dolorum voluptatum, aperiam veritatis praesentium illum eaque. Adipisci, autem.

+

Ratione illo accusamus cumque dolores ut magni velit cum, ex, libero veniam minima in ab dicta odio. Animi quis officiis, minima ratione ducimus blanditiis accusamus quam perspiciatis assumenda impedit nulla.

+

Dolorem laudantium enim voluptatibus? Nesciunt similique distinctio placeat ut id quaerat velit, officia maxime, illum vel, magni obcaecati non accusamus ipsam debitis. Voluptatem ipsa aliquam accusantium beatae atque quaerat ratione.

+

Nesciunt libero exercitationem pariatur ea iure nisi dolorem maiores blanditiis, eius rerum perspiciatis dicta assumenda, facilis molestias incidunt? Temporibus libero natus facere. Eum, aut. Ducimus iste rem assumenda blanditiis aspernatur.

+

Eum ullam quam aliquid non sapiente molestias, blanditiis repellat corrupti inventore, assumenda aperiam reprehenderit deserunt nulla reiciendis dignissimos eius consequatur cupiditate exercitationem perferendis! Sapiente reiciendis autem dolorum itaque impedit dolore!

+

Tenetur, dolor. Perspiciatis harum debitis illum optio explicabo incidunt id cupiditate pariatur quis voluptatum consequuntur, quae odio, quia expedita similique nobis, quaerat labore accusamus? Nesciunt doloremque ullam blanditiis fugit dolore!

+

Praesentium pariatur iusto fugit officia maxime sequi accusamus, rem sint aliquam voluptatibus iste ducimus eaque rerum facere saepe. Est ut beatae expedita autem quae asperiores quam, repellendus cum aut ea.

+

Est, harum! Incidunt, impedit placeat nulla dolor voluptatum eaque quaerat ducimus sapiente! Corrupti esse dolore possimus repellendus eos fuga, animi laboriosam inventore temporibus quidem deserunt, labore dolor! Veritatis, sint harum?

+

Earum magnam nam in repellendus corrupti aperiam mollitia repudiandae! Voluptatem id vero deleniti at. Nostrum nesciunt vitae necessitatibus incidunt ut, totam laborum fugit, officia delectus a nulla repellat voluptatum assumenda?

+

Quis nisi ipsum quas error natus ut tempora nulla harum dolorem magnam vero recusandae unde est, animi laborum minus repellendus vel enim rerum impedit accusamus fugit sunt? Cumque, numquam delectus!

+

Repellendus iste molestiae sunt perferendis temporibus amet possimus numquam eius ipsam, tempora, praesentium aliquam nisi ducimus eos qui vitae minus et totam excepturi libero expedita. Odit itaque aut ipsa saepe.

+

Dolore fugiat, iure iusto fuga excepturi magnam, temporibus ipsa eos reiciendis atque aliquam asperiores officiis fugit unde corrupti vero nemo maxime, odio impedit sit. Aut dolores labore eum iste impedit.

+

Ratione quis necessitatibus tenetur iusto! Inventore, dolores deleniti. Delectus inventore neque, quisquam facere voluptas pariatur dolore quia quam facilis doloribus placeat odit vitae expedita odio similique deleniti, minus veniam consequatur.

+
+
+
+

Among list items

+
    +
  • An item
  • +
  • A second item
  • +
  • A third item
  • +
+
+
+
+
+ + + + + + + + + \ No newline at end of file