'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: [ "path", "parseType" ], data: function() { return { highlightedLines: null }; }, computed: { token: function() { return Rails.csrfToken(); } }, components: { 'owned-plugin-form': OwnedPluginForm }, watch: { 'parse.expression': function() { console.log(`parse.expression: ${this.parse.expression}`); this.preview(); }, 'parse.time_format': function() { console.log(`parse.time_format: ${this.parse.time_format}`); this.preview(); }, 'parseType': function() { this.preview(); }, }, beforeMount: function() { this.path = this.$el.attributes.path.nodeValue; }, mounted: function() { this.parse = {}; this.$on("hook:updated", () => { this.$nextTick(() => { $("[data-toggle=tooltip]").tooltip("dispose"); $("[data-toggle=tooltip]").tooltip("enable"); }); }); }, methods: { onChangePluginName: function(name) { console.log("#in-tail-parse onChangePluginName", name); this.parseType = name; this.parse = {}; // clear parser plugin configuration }, onChangeParseConfig: function(data) { console.log("#in-tail-parse onChangeParseConfig", data); _.merge(this.parse, data); this.preview(); }, onChangeFormats: function(data) { console.log("in_tail_parse:onChangeFormats", data); _.merge(this.parse, data); this.preview(); }, 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": m.key, 'style': 'background-color:' + currentColor }); let highlightedHtml = $highlighted.wrap("
").parent().html(); let pos = { start: m.pos[0], end: m.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(); this.$emit("hook:updated"); }, preview: function() { console.log("preview!!!!"); if (this.previewAjax && this.previewAjax.state() === "pending") { this.previewAjax.abort(); } this.previewAjax = $.ajax({ method: "POST", url: "/api/regexp_preview", headers: { 'X-CSRF-Token': this.token }, data: { parse_type: _.isEmpty(this.parseType) ? "regexp" : this.parseType, file: this.path, plugin_config: this.parse } }).then( (result) => { if (result.matches) { this.updateHighlightedLines(result.matches); } else { console.error(result.error); this.previewError = result.error; } }, (error) => { this.highlightedLines = null; // console.error(error.responseText) if (error.stack) { console.error(error.stack); } }); } } }); });