'use strict' import 'lodash/lodash' import 'popper.js/dist/popper' import 'bootstrap/dist/js/bootstrap' import OwnedPluginForm from './owned_plugin_form' $(document).ready(() => { new Vue({ el: '#in-tail-parse', props: [ "targetFile", "parseType", ], data: () => { return { highlightedLines: null } }, computed: { token: function() { return Rails.csrfToken() } }, components: { 'owned-plugin-form': OwnedPluginForm }, watch: { 'params.setting.regexp': function() { this.preview(); }, 'parseType': function() { this.preview(); }, }, methods: { updateHighlightedLines: function(matches) { if (!matches) { this.highlightedLines = null return } let $container = $('
') _.each(matches, (match) => { const colors = ["#ff9", "#cff", "#fcf", "#dfd"] const whole = match.whole let html = "" let _matches = [] let lastPos = 0 _.each(match.matches, (m) => { let matched = m.matched if (!matched) { return } // Ignore empty matched with "foobar".match(/foo(.*?)bar/)[1] #=> "" if (matched.length === 0) { return } // rotate color let currentColor = colors.shift() colors.push(currentColor) // create highlighted range HTML let $highlighted = $("").text(matched) $highlighted.attr({ "class": "regexp-preview", "data-toggle": "tooltip", "data-placement": "top", "title": match.key, 'style': 'background-color:' + currentColor }) let highlightedHtml = $highlighted.wrap("
").parent().html() let pos = { start: match.pos[0], ent: match.pos[1] } if (pos.start > 0) { html += _.escape(whole.substring(lastPos, pos.start)) } html += highlightedHtml lastPos = pos.end }) html += whole.substring(lastPos) $container.append(html) $container.append("
") }) this.highlightedLines = $container.html() }, preview: function() { $.ajax({ method: "POST", url: "/api/regexp_preview", headers: { 'X-CSRF-Token': token }, data: { regexp: this.params.setting.regexp, time_format: this.params.setting.time_format, format: _.isEmpty(this.parseType) ? "regexp" : this.parseType, params: this.params.setting, file: this.targetFile } }).then( (result) => { this.params = _merge(this.params, result.params) this.updateHighlightedLines(result.matches) }, (error) => { if (error.stack) { console.error(error.stack) } }) } } }) })