1// Copyright 1999-2022. Parallels IP Holdings GmbH. All Rights Reserved. 2 3(() => { 4class ModuleHtaccessToNginxEvent { 5 constructor() { 6 this.eventList = []; 7 } 8 9 on(event, callback) { 10 if (!this.eventList[event]) { 11 this.eventList[event] = []; 12 } 13 14 this.eventList[event].push(callback); 15 return this; 16 } 17 18 emit(event) { 19 if (!this.eventList[event]) return; 20 21 this.eventList[event].forEach(cb => cb.call(null)) 22 } 23} 24 25const elementObserver = selector => { 26 const event = new ModuleHtaccessToNginxEvent(); 27 28 let elementExistBefore = false; 29 30 const observer = new MutationObserver(() => { 31 const el = document.querySelector(selector) 32 33 if (!elementExistBefore && el) { 34 elementExistBefore = true; 35 event.emit('added'); 36 } else if (elementExistBefore && !el) { 37 elementExistBefore = false; 38 event.emit('removed'); 39 } 40 }); 41 42 const container = document.documentElement || document.body; 43 observer.observe(container, { 44 childList: true, 45 subtree: true, 46 }); 47 48 return event; 49} 50 51const http2Nginx = () => { 52 let settingsField = $('additionalNginx-additionalNginxSettings'); 53 if (null == settingsField) { 54 return; 55 } 56 57 $$("head").first().insert( 58 new Element("script", {type: "text/javascript", src: "/modules/htaccess-to-nginx/rewrite-conf.js"}) 59 ); 60 61 var htaccessField = new Element('textarea', { 62 'class': 'code pul-textarea pul-textarea--size-fill', 63 'name': 'htaccess', 64 'id': 'htaccess', 65 'rows': 6, 66 'cols': 80 67 }); 68 69 var convertBtn = new Element('span', {'class': 'btn action'}).insert( 70 new Element('button').update('Convert to nginx') 71 ); 72 convertBtn.observe('click', function(event) { 73 Event.stop(event);
74 let htaccess = htaccessField.getValue(); 75 let nginx = RewriteConf.convert(htaccess); 76 let nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, "value").set; 77 nativeInputValueSetter.call(settingsField, nginx); 78 let event1 = new Event('input', {bubbles: true}); 79 settingsField.dispatchEvent(event1); 80 }); 81 82 var htaccessRow = new Element('div', {'class': 'pul-section-item pul-form-field pul-form-field-text pul-form-field-text--multiline'}).insert( 83 new Element('div', {'class': 'pul-section-item__title'}).insert( 84 new Element('label', {'for': 'htaccess'}).insert('.htaccess content ') 85 ) 86 ).insert( 87 new Element('div', {'class': 'pul-section-item__value'}).insert(htaccessField) 88 .insert(new Element('p', {'class': 'hint'}).update('Attention: .htaccess converter is an experimental feature. Always check conversion results for possible issues.')) 89 .insert(convertBtn) 90 ); 91 92 var settingsRow = settingsField.up('.pul-form-field'); 93 94 var toggleLink = new Element("a", {'href': '#', 'class': "toggler"}); 95 toggleLink.setStyle({'float': 'right'}); 96 var showLink = toggleLink.clone().update('Show .htaccess converter'); 97 var hideLink = toggleLink.clone().update('Hide .htaccess converter'); 98 99 var toggleFunc = function(event, show) { 100 event && event.preventDefault(); 101 showLink.toggle(!show); 102 hideLink.toggle(show); 103 htaccessRow.toggle(show); 104 }; 105 showLink.observe('click', function(event) { toggleFunc(event, true); }); 106 settingsRow.insert({before: showLink}); 107 hideLink.observe('click', function(event) { toggleFunc(event, false); }); 108 settingsRow.insert({before: hideLink}); 109 settingsRow.insert({before: new Element('div', {'class': 'clearfix'})}); 110 settingsRow.insert({before: htaccessRow}); 111 toggleFunc(null, false); 112}; 113 114 115elementObserver('#additionalNginx-additionalNginxSettings') 116 .on('added', http2Nginx); 117 118})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.