/**
* Nue.js Integration Module for PHP-WASM Builder
*
* This module provides seamless integration between PHP-WASM and Nue.js,
* allowing for automatic translation of PHP code to Nue.js compatible code.
*
* Features:
* - Toggle in navigation for enabling/disabling Nue.js integration
* - Dropdown to select mode: PHP-WASM only, Nue.js only, or hybrid mode
* - Automatic translation of PHP code to Nue.js
* - Preservation of all PHP-WASM Builder functionality
* - Maintains glassmorphic UI styling consistency
*/
const NueIntegration = (function() {
// Private variables
let _initialized = false;
let _active = false;
let _mode = 'php-wasm'; // 'php-wasm', 'nue', 'hybrid'
let _originalCode = '';
let _nueCode = '';
let _settings = {
autoTranslate: true,
preserveComments: true,
optimizeForPerformance: true,
useHtmlFirst: true,
generateWebComponents: true
};
// DOM Elements
let _nueNavItem;
let _nueToggle;
let _modeSelector;
let _settingsPanel;
// Component translations mapping (PHP to Nue.js)
const _componentTranslations = {
// PHP component patterns to their Nue.js equivalents
'form': {
pattern: /<\?php\s+.*?
${_translateContent(content, { [key]: key, [value]: value })}
))}`;
} else {
return `{${array}.map((${key}, index) => (
${_translateContent(content, { [key]: key })}
))}`;
}
}
},
'if': {
pattern: /<\?php\s+if\s*\((.*?)\)\s*:\s*\?>([\s\S]*?)(?:<\?php\s+else\s*:\s*\?>([\s\S]*?))?<\?php\s+endif;\s*\?>/g,
replacement: (match, condition, ifContent, elseContent) => {
const translatedCondition = _translateCondition(condition);
if (elseContent) {
return `{${translatedCondition} ? (
${_translateContent(ifContent)}
) : (
${_translateContent(elseContent)}
)}`;
} else {
return `{${translatedCondition} && (
${_translateContent(ifContent)}
)}`;
}
}
},
'echo': {
pattern: /<\?php\s+echo\s+(.*?);\s*\?>/g,
replacement: (match, variable) => {
return `{${_translateVariable(variable)}}`;
}
}
};
// Function translations (PHP to JavaScript)
const _functionTranslations = {
// PHP functions to their JavaScript equivalents
'strlen': 'length',
'substr': 'substring',
'strtolower': 'toLowerCase',
'strtoupper': 'toUpperCase',
'trim': 'trim',
'explode': 'split',
'implode': 'join',
'array_push': 'push',
'array_pop': 'pop',
'array_shift': 'shift',
'array_unshift': 'unshift',
'array_slice': 'slice',
'array_splice': 'splice',
'array_map': 'map',
'array_filter': 'filter',
'array_reduce': 'reduce',
'array_merge': '(a, b) => [...a, ...b]',
'count': 'length',
'var_dump': 'console.log',
'print_r': 'console.log',
'json_encode': 'JSON.stringify',
'json_decode': 'JSON.parse'
};
/**
* Initialize the Nue.js integration module
*/
function init() {
if (_initialized) return;
console.log('Initializing Nue.js Integration Module...');
// Create the UI components
_createUI();
// Load saved settings
_loadSettings();
// Register event listeners
_registerEventListeners();
// Add the Nue.js script if not already added
_addNueScript();
_initialized = true;
console.log('Nue.js Integration Module initialized successfully');
}
/**
* Create the UI components for the Nue.js integration
*/
function _createUI() {
// Create the Nue.js nav item with toggle
_createNavItem();
// Create the mode selector dropdown
_createModeSelector();
// Create the settings panel
_createSettingsPanel();
}
/**
* Create the navigation item with toggle switch
*/
function _createNavItem() {
// Try to find the navigation container with fallbacks
const navContainer = document.querySelector('.main-nav-container') ||
document.querySelector('.nav-container') ||
document.querySelector('nav') ||
document.querySelector('header');
if (!navContainer) {
console.error('Navigation container not found, creating one');
// Create a navigation container if none exists
const newNavContainer = document.createElement('div');
newNavContainer.className = 'nue-nav-container';
newNavContainer.style.position = 'fixed';
newNavContainer.style.top = '10px';
newNavContainer.style.right = '10px';
newNavContainer.style.zIndex = '1000';
document.body.appendChild(newNavContainer);
return newNavContainer;
}
_nueNavItem = document.createElement('div');
_nueNavItem.className = 'nav-item';
_nueNavItem.id = 'nue-nav-item';
// Create toggle switch
_nueToggle = document.createElement('label');
_nueToggle.className = 'toggle-switch';
_nueToggle.innerHTML = `
Code Preview
`;
mainContainer.appendChild(_settingsPanel);
}
/**
* Register event listeners for the Nue.js integration UI
*/
function _registerEventListeners() {
// Nue.js toggle
const nueToggle = document.getElementById('nue-toggle');
if (nueToggle) {
nueToggle.addEventListener('change', function() {
toggleNueIntegration(this.checked);
});
}
// Mode selector
if (_modeSelector) {
_modeSelector.addEventListener('change', function() {
setMode(this.value);
});
}
// Settings panel close button
const closeBtn = document.getElementById('nue-settings-close-btn');
if (closeBtn) {
closeBtn.addEventListener('click', function() {
toggleSettingsPanel(false);
});
}
// Settings toggles
const autoTranslateToggle = document.getElementById('auto-translate-toggle');
if (autoTranslateToggle) {
autoTranslateToggle.addEventListener('change', function() {
_settings.autoTranslate = this.checked;
_saveSettings();
});
}
const preserveCommentsToggle = document.getElementById('preserve-comments-toggle');
if (preserveCommentsToggle) {
preserveCommentsToggle.addEventListener('change', function() {
_settings.preserveComments = this.checked;
_saveSettings();
});
}
const optimizePerformanceToggle = document.getElementById('optimize-performance-toggle');
if (optimizePerformanceToggle) {
optimizePerformanceToggle.addEventListener('change', function() {
_settings.optimizeForPerformance = this.checked;
_saveSettings();
});
}
const htmlFirstToggle = document.getElementById('html-first-toggle');
if (htmlFirstToggle) {
htmlFirstToggle.addEventListener('change', function() {
_settings.useHtmlFirst = this.checked;
_saveSettings();
});
}
const webComponentsToggle = document.getElementById('web-components-toggle');
if (webComponentsToggle) {
webComponentsToggle.addEventListener('change', function() {
_settings.generateWebComponents = this.checked;
_saveSettings();
});
}
// Code tabs
const phpTab = document.getElementById('php-tab');
const nueTab = document.getElementById('nue-tab');
const phpPanel = document.getElementById('php-panel');
const nuePanel = document.getElementById('nue-panel');
if (phpTab && nueTab && phpPanel && nuePanel) {
phpTab.addEventListener('click', function() {
phpTab.classList.add('active');
nueTab.classList.remove('active');
phpPanel.classList.add('active');
nuePanel.classList.remove('active');
});
nueTab.addEventListener('click', function() {
nueTab.classList.add('active');
phpTab.classList.remove('active');
nuePanel.classList.add('active');
phpPanel.classList.remove('active');
});
}
// Action buttons
const translateBtn = document.getElementById('translate-btn');
if (translateBtn) {
translateBtn.addEventListener('click', function() {
translateCode();
});
}
const copyNueBtn = document.getElementById('copy-nue-btn');
if (copyNueBtn) {
copyNueBtn.addEventListener('click', function() {
copyNueCode();
});
}
const resetSettingsBtn = document.getElementById('reset-settings-btn');
if (resetSettingsBtn) {
resetSettingsBtn.addEventListener('click', function() {
resetSettings();
});
}
// Listen for code changes in the PHP-WASM editor
document.addEventListener('php-wasm-code-change', function(e) {
if (_active && _settings.autoTranslate) {
_originalCode = e.detail.code;
translateCode();
}
});
// Add settings gear button to nav item
const nueNavItem = document.getElementById('nue-nav-item');
if (nueNavItem) {
const settingsBtn = document.createElement('button');
settingsBtn.className = 'nue-settings-btn glass-button small';
settingsBtn.innerHTML = '