ConLite/conlite/external/codemirror/class.codemirror.php

310 Zeilen
10 KiB
PHP

<?php
/**
* This file defines the CodeMirror editor integration class.
*
* @package Core
* @subpackage Backend
* @author Unknown
* @copyright four for business AG <www.4fb.de>
* @license http://www.contenido.org/license/LIZENZ.txt
* @link http://www.4fb.de
* @link http://www.contenido.org
*/
defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
/**
* Class for handling and displaying CodeMirror
*
* @package Core
* @subpackage Backend
*/
class CodeMirror {
/**
* Properties which were used to init CodeMirror
*
* @var array
*/
private $_properties = array();
/**
* HTML-ID of textarea which is replaced by CodeMirror
*
* @var string
*/
private $_textareaId = '';
/**
* defines if textarea is used or not (by system/client/user property)
*
* @var boolean
*/
private $_activated = true;
/**
* defines if js-script for CodeMirror is included on rendering process
*
* @var boolean
*/
private $_addScript = true;
/**
* The CONTENIDO configuration array
*
* @var array
*/
private $_cfg = array();
/**
* Language of CodeMirror
*
* @var string
*/
private $_language = '';
/**
* Syntax of CodeMirror
*
* @var string
*/
private $_syntax = '';
/**
* Constructor of CodeMirror initializes class variables
*
* @param string $id - The id of textarea which is replaced by editor
* @param string $syntax - Name of syntax highlighting which is used (html,
* css, js, php, ...)
* @param string $lang - lang which is used into editor. Notice NOT
* CONTENIDO language id
* ex: de, en ... To get it from CONTENIDO language use:
* substr(strtolower($belang), 0, 2) in backend
* @param bool $addScript - defines if CodeMirror script is included or
* not
* interesting when there is more than only one editor on page
* @param array $cfg - The CONTENIDO configuration array
* @param bool $editable - Optional defines if content is editable or not
*/
public function __construct($id, $syntax, $lang, $addScript, $cfg, $editable = true) {
// init class variables
$this->_properties = array();
$this->_cfg = (array) $cfg;
$this->_addScript = (boolean) $addScript;
$this->_textareaId = (string) $id;
$this->_activated = true;
$this->_language = (string) $lang;
$this->_syntax = (string) $syntax;
// make content not editable if not allowed
if ($editable == false) {
$this->setProperty('readOnly', 'true', true);
}
$this->setProperty('lineNumbers', 'true', true);
$this->setProperty('lineWrapping', 'true', true);
$this->setProperty('matchBrackets', 'true', true);
$this->setProperty('indentUnit', 4, true);
$this->setProperty('indentWithTabs', 'true', true);
$this->setProperty('enterMode', 'keep', false);
$this->setProperty('tabMode', 'shift', false);
// internal function which appends more properties to $this->setProperty
// wich where defined
// by user or sysadmin in systemproperties / client settings / user
// settings ...
$this->_getSystemProperties();
}
/**
* Function gets properties from CONTENIDO for CodeMirror and stores it into
* $this->setProperty so user is able to overwride standard settings or
* append
* other settings.
* Function also checks if CodeMirror is activated or deactivated
* by user
*/
private function _getSystemProperties() {
// check if editor is disabled or enabled by user/admin
if (getEffectiveSetting('codemirror', 'activated', 'true') == 'false') {
$this->_activated = false;
}
$userSettings = getEffectiveSettingsByType('codemirror');
foreach ($userSettings as $key => $value) {
if ($key != 'activated') {
if ($value == 'true' || $value == 'false' || is_numeric($value)) {
$this->setProperty($key, $value, true);
} else {
$this->setProperty($key, $value, false);
}
}
}
}
/**
* Function for setting a property for CodeMirror to $this->setProperty
* existing properties were overwritten
*
* @param string $name - Name of CodeMirror property
* @param string $value - Value of CodeMirror property
* @param bool $isNumeric - Defines if value is numeric or not
* in case of a numeric value, there is no need to use
* quotes
*/
public function setProperty($name, $value, $isNumeric = false) {
// datatype check
$name = (string) $name;
$value = (string) $value;
$isNumeric = (boolean) $isNumeric;
// generate a new array for new property
$record = array();
$record['name'] = $name;
$record['value'] = $value;
$record['is_numeric'] = $isNumeric;
// append it to class variable $this->aProperties
// when key already exists, overwride it
$this->_properties[$name] = $record;
}
private function _getSyntaxScripts() {
$path = $this->_cfg['path']['contenido_fullhtml'] . 'external/codemirror';
$js = '';
$jsTemplate = '<script type="text/javascript" src="%s/mode/%s/%s.js"></script>';
$modes = array();
$syntax = $this->_syntax;
if ($syntax == 'js' || $syntax == 'html' || $syntax == 'php') {
$modes[] = 'javascript';
}
if ($syntax == 'css' || $syntax == 'html' || $syntax == 'php') {
$modes[] = 'css';
}
if ($syntax == 'html' || $syntax == 'php') {
$modes[] = 'xml';
}
if ($syntax == 'php') {
$modes[] = 'php';
$modes[] = 'clike';
}
if ($syntax == 'html') {
$modes[] = 'htmlmixed';
}
foreach ($modes as $mode) {
$js .= sprintf($jsTemplate, $path, $mode, $mode) . PHP_EOL;
}
return $js;
}
private function _getSyntaxName() {
if ($this->_syntax == 'php') {
return 'application/x-httpd-php';
}
if ($this->_syntax == 'html') {
return 'text/html';
}
if ($this->_syntax == 'css') {
return 'text/css';
}
if ($this->_syntax == 'js') {
return 'text/javascript';
}
}
/**
* Function renders js_script for inclusion into an header of a html file
*
* @return string - js_script for CodeMirror
*/
public function renderScript() {
// if editor is disabled, there is no need to render this script
if ($this->_activated == false) {
return '';
}
// if external js file for editor should be included, do this here
$js = '';
if ($this->_addScript) {
$conPath = $this->_cfg['path']['contenido_fullhtml'];
$path = $conPath . 'external/codemirror/';
$language = $this->_language;
if (!file_exists($this->_cfg['path']['contenido'] . 'external/codemirror/lib/lang/' . $language . '.js')) {
$language = 'en';
}
$js .= '<script type="text/javascript" src="' . $path . 'lib/lang/' . $language . '.js"></script>' . PHP_EOL;
$js .= '<script type="text/javascript" src="' . $path . 'lib/codemirror.js"></script>' . PHP_EOL;
$js .= '<script type="text/javascript" src="' . $path . 'lib/util/foldcode.js"></script>' . PHP_EOL;
$js .= '<script type="text/javascript" src="' . $path . 'lib/util/dialog.js"></script>' . PHP_EOL;
$js .= '<script type="text/javascript" src="' . $path . 'lib/util/searchcursor.js"></script>' . PHP_EOL;
$js .= '<script type="text/javascript" src="' . $path . 'lib/util/search.js"></script>' . PHP_EOL;
$js .= '<script type="text/javascript" src="' . $path . 'lib/contenido_integration.js"></script>' . PHP_EOL;
$js .= $this->_getSyntaxScripts();
$js .= '<link rel="stylesheet" href="' . $path . 'lib/codemirror.css">' . PHP_EOL;
$js .= '<link rel="stylesheet" href="' . $path . 'lib/util/dialog.css">' . PHP_EOL;
$js .= '<link rel="stylesheet" href="' . $path . 'lib/contenido_integration.css">' . PHP_EOL;
}
// define template for CodeMirror script
$js .= <<<JS
<script type="text/javascript">
(function(Con, $) {
$(function() {
if (!$('#{ID}')[0]) {
// Node is missing, nothing to initialize here...
return;
}
Con.CodeMirrorHelper.init('{ID}', {
extraKeys: {
'F11': function() {
Con.CodeMirrorHelper.toggleFullscreenEditor('{ID}');
},
'Esc': function() {
Con.CodeMirrorHelper.toggleFullscreenEditor('{ID}');
}
}
{PROPERTIES}
});
});
})(Con, Con.$);
</script>
JS;
$this->setProperty('mode', $this->_getSyntaxName(), false);
$this->setProperty('theme', 'default ' . $this->_textareaId, false);
// get all stored properties and convert it in order to insert it into
// CodeMirror js template
$properties = '';
foreach ($this->_properties as $property) {
if ($property['is_numeric'] == true) {
$properties .= ', ' . $property['name'] . ': ' . $property['value'];
} else {
$properties .= ', ' . $property['name'] . ': "' . $property['value'] . '"';
}
}
// fill js template
$textareaId = $this->_textareaId;
$jsResult = str_replace('{ID}', $textareaId, $js);
$jsResult = str_replace('{PROPERTIES}', $properties, $jsResult);
return $jsResult;
}
}