| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | const moment = require('moment'); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | let data = { | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |     terms: '', | 
					
						
							|  |  |  |     termString : '', | 
					
						
							|  |  |  |     search: { | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |         type: { | 
					
						
							|  |  |  |             page: true, | 
					
						
							|  |  |  |             chapter: true, | 
					
						
							|  |  |  |             book: true | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |         }, | 
					
						
							|  |  |  |         exactTerms: [], | 
					
						
							|  |  |  |         tagTerms: [], | 
					
						
							|  |  |  |         option: {}, | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |         dates: { | 
					
						
							|  |  |  |             updated_after: false, | 
					
						
							|  |  |  |             updated_before: false, | 
					
						
							|  |  |  |             created_after: false, | 
					
						
							|  |  |  |             created_before: false, | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let computed = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let methods = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     appendTerm(term) { | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |         this.termString += ' ' + term; | 
					
						
							|  |  |  |         this.termString = this.termString.replace(/\s{2,}/g, ' '); | 
					
						
							|  |  |  |         this.termString = this.termString.replace(/^\s+/, ''); | 
					
						
							|  |  |  |         this.termString = this.termString.replace(/\s+$/, ''); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     exactParse(searchString) { | 
					
						
							|  |  |  |         this.search.exactTerms = []; | 
					
						
							|  |  |  |         let exactFilter = /"(.+?)"/g; | 
					
						
							|  |  |  |         let matches; | 
					
						
							|  |  |  |         while ((matches = exactFilter.exec(searchString)) !== null) { | 
					
						
							|  |  |  |             this.search.exactTerms.push(matches[1]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     exactChange() { | 
					
						
							|  |  |  |         let exactFilter = /"(.+?)"/g; | 
					
						
							|  |  |  |         this.termString = this.termString.replace(exactFilter, ''); | 
					
						
							|  |  |  |         let matchesTerm = this.search.exactTerms.filter(term => { | 
					
						
							|  |  |  |             return term.trim() !== ''; | 
					
						
							|  |  |  |         }).map(term => { | 
					
						
							|  |  |  |             return `"${term}"` | 
					
						
							|  |  |  |         }).join(' '); | 
					
						
							|  |  |  |         this.appendTerm(matchesTerm); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     addExact() { | 
					
						
							|  |  |  |         this.search.exactTerms.push(''); | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |             let exactInputs = document.querySelectorAll('.exact-input'); | 
					
						
							|  |  |  |             exactInputs[exactInputs.length - 1].focus(); | 
					
						
							|  |  |  |         }, 100); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     removeExact(index) { | 
					
						
							|  |  |  |         this.search.exactTerms.splice(index, 1); | 
					
						
							|  |  |  |         this.exactChange(); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tagParse(searchString) { | 
					
						
							|  |  |  |         this.search.tagTerms = []; | 
					
						
							|  |  |  |         let tagFilter = /\[(.+?)\]/g; | 
					
						
							|  |  |  |         let matches; | 
					
						
							|  |  |  |         while ((matches = tagFilter.exec(searchString)) !== null) { | 
					
						
							|  |  |  |             this.search.tagTerms.push(matches[1]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tagChange() { | 
					
						
							|  |  |  |         let tagFilter = /\[(.+?)\]/g; | 
					
						
							|  |  |  |         this.termString = this.termString.replace(tagFilter, ''); | 
					
						
							|  |  |  |         let matchesTerm = this.search.tagTerms.filter(term => { | 
					
						
							|  |  |  |             return term.trim() !== ''; | 
					
						
							|  |  |  |         }).map(term => { | 
					
						
							|  |  |  |             return `[${term}]` | 
					
						
							|  |  |  |         }).join(' '); | 
					
						
							|  |  |  |         this.appendTerm(matchesTerm); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     addTag() { | 
					
						
							|  |  |  |         this.search.tagTerms.push(''); | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |             let tagInputs = document.querySelectorAll('.tag-input'); | 
					
						
							|  |  |  |             tagInputs[tagInputs.length - 1].focus(); | 
					
						
							|  |  |  |         }, 100); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     removeTag(index) { | 
					
						
							|  |  |  |         this.search.tagTerms.splice(index, 1); | 
					
						
							|  |  |  |         this.tagChange(); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     typeParse(searchString) { | 
					
						
							|  |  |  |         let typeFilter = /{\s?type:\s?(.*?)\s?}/; | 
					
						
							|  |  |  |         let match = searchString.match(typeFilter); | 
					
						
							|  |  |  |         let type = this.search.type; | 
					
						
							|  |  |  |         if (!match) { | 
					
						
							|  |  |  |             type.page = type.book = type.chapter = true; | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let splitTypes = match[1].replace(/ /g, '').split('|'); | 
					
						
							|  |  |  |         type.page = (splitTypes.indexOf('page') !== -1); | 
					
						
							|  |  |  |         type.chapter = (splitTypes.indexOf('chapter') !== -1); | 
					
						
							|  |  |  |         type.book = (splitTypes.indexOf('book') !== -1); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     typeChange() { | 
					
						
							|  |  |  |         let typeFilter = /{\s?type:\s?(.*?)\s?}/; | 
					
						
							|  |  |  |         let type = this.search.type; | 
					
						
							|  |  |  |         if (type.page === type.chapter && type.page === type.book) { | 
					
						
							|  |  |  |             this.termString = this.termString.replace(typeFilter, ''); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let selectedTypes = Object.keys(type).filter(type => {return this.search.type[type];}).join('|'); | 
					
						
							|  |  |  |         let typeTerm = '{type:'+selectedTypes+'}'; | 
					
						
							|  |  |  |         if (this.termString.match(typeFilter)) { | 
					
						
							|  |  |  |             this.termString = this.termString.replace(typeFilter, typeTerm); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         this.appendTerm(typeTerm); | 
					
						
							| 
									
										
										
										
											2017-04-10 04:12:13 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |     optionParse(searchString) { | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |         let optionFilter = /{([a-z_\-:]+?)}/gi; | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |         let matches; | 
					
						
							|  |  |  |         while ((matches = optionFilter.exec(searchString)) !== null) { | 
					
						
							|  |  |  |             this.search.option[matches[1].toLowerCase()] = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     optionChange(optionName) { | 
					
						
							|  |  |  |         let isChecked = this.search.option[optionName]; | 
					
						
							|  |  |  |         if (isChecked) { | 
					
						
							|  |  |  |             this.appendTerm(`{${optionName}}`); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             this.termString = this.termString.replace(`{${optionName}}`, ''); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     updateSearch(e) { | 
					
						
							|  |  |  |         e.preventDefault(); | 
					
						
							| 
									
										
										
										
											2017-04-10 04:12:13 +08:00
										 |  |  |         window.location = '/search?term=' + encodeURIComponent(this.termString); | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enableDate(optionName) { | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |         this.search.dates[optionName.toLowerCase()] = moment().format('YYYY-MM-DD'); | 
					
						
							|  |  |  |         this.dateChange(optionName); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dateParse(searchString) { | 
					
						
							|  |  |  |         let dateFilter = /{([a-z_\-]+?):([a-z_\-0-9]+?)}/gi; | 
					
						
							|  |  |  |         let dateTags = Object.keys(this.search.dates); | 
					
						
							|  |  |  |         let matches; | 
					
						
							|  |  |  |         while ((matches = dateFilter.exec(searchString)) !== null) { | 
					
						
							|  |  |  |             if (dateTags.indexOf(matches[1]) === -1) continue; | 
					
						
							|  |  |  |             this.search.dates[matches[1].toLowerCase()] = matches[2]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dateChange(optionName) { | 
					
						
							|  |  |  |         let dateFilter = new RegExp('{\\s?'+optionName+'\\s?:([a-z_\\-0-9]+?)}', 'gi'); | 
					
						
							|  |  |  |         this.termString = this.termString.replace(dateFilter, ''); | 
					
						
							|  |  |  |         if (!this.search.dates[optionName]) return; | 
					
						
							|  |  |  |         this.appendTerm(`{${optionName}:${this.search.dates[optionName]}}`); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dateRemove(optionName) { | 
					
						
							|  |  |  |         this.search.dates[optionName] = false; | 
					
						
							|  |  |  |         this.dateChange(optionName); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function created() { | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |     this.termString = document.querySelector('[name=searchTerm]').value; | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |     this.typeParse(this.termString); | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  |     this.exactParse(this.termString); | 
					
						
							|  |  |  |     this.tagParse(this.termString); | 
					
						
							|  |  |  |     this.optionParse(this.termString); | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |     this.dateParse(this.termString); | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |     data, computed, methods, created | 
					
						
							|  |  |  | }; |