880 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			880 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| class CrayonHTMLElement {
 | |
|     public $id;
 | |
|     public $class = '';
 | |
|     public $tag = 'div';
 | |
|     public $closed = FALSE;
 | |
|     public $contents = '';
 | |
|     public $attributes = array();
 | |
|     const CSS_INPUT_PREFIX = "crayon-theme-input-";
 | |
| 
 | |
|     public static $borderStyles = array(
 | |
|         'none',
 | |
|         'hidden',
 | |
|         'dotted',
 | |
|         'dashed',
 | |
|         'solid',
 | |
|         'double',
 | |
|         'groove',
 | |
|         'ridge',
 | |
|         'inset',
 | |
|         'outset',
 | |
|         'inherit'
 | |
|     );
 | |
| 
 | |
|     public function __construct($id) {
 | |
|         $this->id = $id;
 | |
|     }
 | |
| 
 | |
|     public function addClass($class) {
 | |
|         $this->class .= ' ' . self::CSS_INPUT_PREFIX . $class;
 | |
|     }
 | |
| 
 | |
|     public function addAttributes($atts) {
 | |
|         $this->attributes = array_merge($this->attributes, $atts);
 | |
|     }
 | |
| 
 | |
|     public function attributeString() {
 | |
|         $str = '';
 | |
|         foreach ($this->attributes as $k => $v) {
 | |
|             $str .= "$k=\"$v\" ";
 | |
|         }
 | |
|         return $str;
 | |
|     }
 | |
| 
 | |
|     public function __toString() {
 | |
|         return '<' . $this->tag . ' id="' . self::CSS_INPUT_PREFIX . $this->id . '" class="' . self::CSS_INPUT_PREFIX . $this->class . '" ' . $this->attributeString() . ($this->closed ? ' />' : ' >' . $this->contents . "</$this->tag>");
 | |
|     }
 | |
| }
 | |
| 
 | |
| class CrayonHTMLInput extends CrayonHTMLElement {
 | |
|     public $name;
 | |
|     public $type;
 | |
| 
 | |
|     public function __construct($id, $name = NULL, $value = '', $type = 'text') {
 | |
|         parent::__construct($id);
 | |
|         $this->tag = 'input';
 | |
|         $this->closed = TRUE;
 | |
|         if ($name === NULL) {
 | |
|             $name = CrayonUserResource::clean_name($id);
 | |
|         }
 | |
|         $this->name = $name;
 | |
|         $this->class .= $type;
 | |
|         $this->addAttributes(array(
 | |
|             'type' => $type,
 | |
|             'value' => $value
 | |
|         ));
 | |
|     }
 | |
| }
 | |
| 
 | |
| class CrayonHTMLSelect extends CrayonHTMLInput {
 | |
|     public $options;
 | |
|     public $selected = NULL;
 | |
| 
 | |
|     public function __construct($id, $name = NULL, $value = '', $options = array()) {
 | |
|         parent::__construct($id, $name, 'select');
 | |
|         $this->tag = 'select';
 | |
|         $this->closed = FALSE;
 | |
|         $this->addOptions($options);
 | |
|     }
 | |
| 
 | |
|     public function addOptions($options, $default = NULL) {
 | |
|         for ($i = 0; $i < count($options); $i++) {
 | |
|             $key = $options[$i];
 | |
|             $value = isset($options[$key]) ? $options[$key] : $key;
 | |
|             $this->options[$key] = $value;
 | |
|         }
 | |
|         if ($default === NULL && count($options) > 1) {
 | |
|             $this->attributes['data-default'] = $options[0];
 | |
|         } else {
 | |
|             $this->attributes['data-default'] = $default;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function getOptionsString() {
 | |
|         $str = '';
 | |
|         foreach ($this->options as $k => $v) {
 | |
|             $selected = $this->selected == $k ? 'selected="selected"' : '';
 | |
|             $str .= "<option value=\"$k\" $selected>$v</option>";
 | |
|         }
 | |
|         return $str;
 | |
|     }
 | |
| 
 | |
|     public function __toString() {
 | |
|         $this->contents = $this->getOptionsString();
 | |
|         return parent::__toString();
 | |
|     }
 | |
| }
 | |
| 
 | |
| class CrayonHTMLSeparator extends CrayonHTMLElement {
 | |
|     public $name = '';
 | |
| 
 | |
|     public function __construct($name) {
 | |
|         parent::__construct($name);
 | |
|         $this->name = $name;
 | |
|     }
 | |
| }
 | |
| 
 | |
| class CrayonHTMLTitle extends CrayonHTMLSeparator {
 | |
| 
 | |
| }
 | |
| 
 | |
| class CrayonThemeEditorWP {
 | |
| 
 | |
|     public static $attributes = NULL;
 | |
|     public static $attributeGroups = NULL;
 | |
|     public static $attributeGroupsInverse = NULL;
 | |
|     public static $attributeTypes = NULL;
 | |
|     public static $attributeTypesInverse = NULL;
 | |
|     public static $infoFields = NULL;
 | |
|     public static $infoFieldsInverse = NULL;
 | |
|     public static $settings = NULL;
 | |
|     public static $strings = NULL;
 | |
| 
 | |
|     const ATTRIBUTE = 'attribute';
 | |
| 
 | |
|     const RE_COMMENT = '#^\s*\/\*[\s\S]*?\*\/#msi';
 | |
| 
 | |
|     public static function initFields() {
 | |
|         if (self::$infoFields === NULL) {
 | |
|             self::$infoFields = array(
 | |
|                 // These are canonical and can't be translated, since they appear in the comments of the CSS
 | |
|                 'name' => 'Name',
 | |
|                 'description' => 'Description',
 | |
|                 'version' => 'Version',
 | |
|                 'author' => 'Author',
 | |
|                 'url' => 'URL',
 | |
|                 'original-author' => 'Original Author',
 | |
|                 'notes' => 'Notes',
 | |
|                 'maintainer' => 'Maintainer',
 | |
|                 'maintainer-url' => 'Maintainer URL'
 | |
|             );
 | |
|             self::$infoFieldsInverse = CrayonUtil::array_flip(self::$infoFields);
 | |
|             // A map of CSS element name and property to name
 | |
|             self::$attributes = array();
 | |
|             // A map of CSS attribute to input type
 | |
|             self::$attributeGroups = array(
 | |
|                 'color' => array('background', 'background-color', 'border-color', 'color', 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color'),
 | |
|                 'size' => array('border-width'),
 | |
|                 'border-style' => array('border-style', 'border-bottom-style', 'border-top-style', 'border-left-style', 'border-right-style')
 | |
|             );
 | |
|             self::$attributeGroupsInverse = CrayonUtil::array_flip(self::$attributeGroups);
 | |
|             // Mapping of input type to attribute group
 | |
|             self::$attributeTypes = array(
 | |
|                 'select' => array('border-style', 'font-style', 'font-weight', 'text-decoration')
 | |
|             );
 | |
|             self::$attributeTypesInverse = CrayonUtil::array_flip(self::$attributeTypes);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function initSettings() {
 | |
|         CrayonSettingsWP::load_settings();
 | |
|         self::initFields();
 | |
|         self::initStrings();
 | |
|         if (self::$settings === NULL) {
 | |
|             self::$settings = array(
 | |
|                 // Only things the theme editor needs
 | |
|                 'cssThemePrefix' => CrayonThemes::CSS_PREFIX,
 | |
|                 'cssInputPrefix' => CrayonHTMLElement::CSS_INPUT_PREFIX,
 | |
|                 'attribute' => self::ATTRIBUTE,
 | |
|                 'fields' => self::$infoFields,
 | |
|                 'fieldsInverse' => self::$infoFieldsInverse,
 | |
|                 'prefix' => 'crayon-theme-editor'
 | |
|             );
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function initStrings() {
 | |
|         if (self::$strings === NULL) {
 | |
|             self::$strings = array(
 | |
|                 // These appear only in the UI and can be translated
 | |
|                 'userTheme' => crayon__("User-Defined Theme"),
 | |
|                 'stockTheme' => crayon__("Stock Theme"),
 | |
|                 'success' => crayon__("Success!"),
 | |
|                 'fail' => crayon__("Failed!"),
 | |
|                 'delete' => crayon__("Delete"),
 | |
|                 'deleteThemeConfirm' => crayon__("Are you sure you want to delete the \"%s\" theme?"),
 | |
|                 'deleteFail' => crayon__("Delete failed!"),
 | |
|                 'duplicate' => crayon__("Duplicate"),
 | |
|                 'newName' => crayon__("New Name"),
 | |
|                 'duplicateFail' => crayon__("Duplicate failed!"),
 | |
|                 'checkLog' => crayon__("Please check the log for details."),
 | |
|                 'discardConfirm' => crayon__("Are you sure you want to discard all changes?"),
 | |
|                 'editingTheme' => crayon__("Editing Theme: %s"),
 | |
|                 'creatingTheme' => crayon__("Creating Theme: %s"),
 | |
|                 'submit' => crayon__("Submit Your Theme"),
 | |
|                 'submitText' => crayon__("Submit your User Theme for inclusion as a Stock Theme in Crayon! This will email me your theme - make sure it's considerably different from the stock themes :)"),
 | |
|                 'message' => crayon__("Message"),
 | |
|                 'submitMessage' => crayon__("Please include this theme in Crayon!"),
 | |
|                 'submitSucceed' => crayon__("Submit was successful."),
 | |
|                 'submitFail' => crayon__("Submit failed!"),
 | |
|                 'borderStyles' => CrayonHTMLElement::$borderStyles
 | |
|             );
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function admin_resources() {
 | |
|         global $CRAYON_VERSION;
 | |
|         self::initSettings();
 | |
|         $path = dirname(dirname(__FILE__));
 | |
| 
 | |
|         wp_enqueue_script('cssjson_js', plugins_url(CRAYON_CSSJSON_JS, $path), $CRAYON_VERSION);
 | |
|         wp_enqueue_script('jquery_colorpicker_js', plugins_url(CRAYON_JS_JQUERY_COLORPICKER, $path), array('jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-tabs', 'jquery-ui-draggable', 'jquery-ui-dialog', 'jquery-ui-position', 'jquery-ui-mouse', 'jquery-ui-slider', 'jquery-ui-droppable', 'jquery-ui-selectable', 'jquery-ui-resizable'), $CRAYON_VERSION);
 | |
|         wp_enqueue_script('jquery_tinycolor_js', plugins_url(CRAYON_JS_TINYCOLOR, $path), array(), $CRAYON_VERSION);
 | |
| 
 | |
|         if (CRAYON_MINIFY) {
 | |
|             wp_enqueue_script('crayon_theme_editor', plugins_url(CRAYON_THEME_EDITOR_JS, $path), array('jquery', 'crayon_js', 'crayon_admin_js', 'cssjson_js', 'jquery_colorpicker_js', 'jquery_tinycolor_js'), $CRAYON_VERSION);
 | |
|         } else {
 | |
|             wp_enqueue_script('crayon_theme_editor', plugins_url(CRAYON_THEME_EDITOR_JS, $path), array('jquery', 'crayon_util_js', 'crayon_admin_js', 'cssjson_js', 'jquery_colorpicker_js', 'jquery_tinycolor_js'), $CRAYON_VERSION);
 | |
|         }
 | |
| 
 | |
|         wp_localize_script('crayon_theme_editor', 'CrayonThemeEditorSettings', self::$settings);
 | |
|         wp_localize_script('crayon_theme_editor', 'CrayonThemeEditorStrings', self::$strings);
 | |
| 
 | |
|         wp_enqueue_style('crayon_theme_editor', plugins_url(CRAYON_THEME_EDITOR_STYLE, $path), array('wp-jquery-ui-dialog'), $CRAYON_VERSION);
 | |
|         wp_enqueue_style('jquery_colorpicker', plugins_url(CRAYON_CSS_JQUERY_COLORPICKER, $path), array(), $CRAYON_VERSION);
 | |
|     }
 | |
| 
 | |
|     public static function form($inputs) {
 | |
|         $str = '<form class="' . self::$settings['prefix'] . '-form"><table>';
 | |
|         $sepCount = 0;
 | |
|         foreach ($inputs as $input) {
 | |
|             if ($input instanceof CrayonHTMLInput) {
 | |
|                 $str .= self::formField($input->name, $input);
 | |
|             } else if ($input instanceof CrayonHTMLSeparator) {
 | |
|                 $sepClass = '';
 | |
|                 if ($input instanceof CrayonHTMLTitle) {
 | |
|                     $sepClass .= ' title';
 | |
|                 }
 | |
|                 if ($sepCount == 0) {
 | |
|                     $sepClass .= ' first';
 | |
|                 }
 | |
|                 $str .= '<tr class="separator' . $sepClass . '"><td colspan="2"><div class="content">' . $input->name . '</div></td></tr>';
 | |
|                 $sepCount++;
 | |
|             } else if (is_array($input) && count($input) > 1) {
 | |
|                 $name = $input[0];
 | |
|                 $fields = '<table class="split-field"><tr>';
 | |
|                 $percent = 100 / count($input);
 | |
|                 for ($i = 1; $i < count($input); $i++) {
 | |
|                     $class = $i == count($input) - 1 ? 'class="last"' : '';
 | |
|                     $fields .= '<td ' . $class . ' style="width: ' . $percent . '%">' . $input[$i] . '</td>';
 | |
|                 }
 | |
|                 $fields .= '</tr></table>';
 | |
|                 $str .= self::formField($name, $fields, 'split');
 | |
|             }
 | |
|         }
 | |
|         $str .= '</table></form>';
 | |
|         return $str;
 | |
|     }
 | |
| 
 | |
|     public static function formField($name, $field, $class = '') {
 | |
|         return '<tr><td class="field ' . $class . '">' . $name . '</td><td class="value ' . $class . '">' . $field . '</td></tr>';
 | |
|     }
 | |
| 
 | |
|     public static function content() {
 | |
|         self::initSettings();
 | |
|         $theme = CrayonResources::themes()->get_default();
 | |
|         $editing = false;
 | |
| 
 | |
|         if (isset($_GET['curr_theme'])) {
 | |
|             $currTheme = CrayonResources::themes()->get($_GET['curr_theme']);
 | |
|             if ($currTheme) {
 | |
|                 $theme = $currTheme;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (isset($_GET['editing'])) {
 | |
|             $editing = CrayonUtil::str_to_bool($_GET['editing'], FALSE);
 | |
|         }
 | |
| 
 | |
|         $tInformation = crayon__("Information");
 | |
|         $tHighlighting = crayon__("Highlighting");
 | |
|         $tFrame = crayon__("Frame");
 | |
|         $tLines = crayon__("Lines");
 | |
|         $tNumbers = crayon__("Line Numbers");
 | |
|         $tToolbar = crayon__("Toolbar");
 | |
| 
 | |
|         $tBackground = crayon__("Background");
 | |
|         $tText = crayon__("Text");
 | |
|         $tBorder = crayon__("Border");
 | |
|         $tTopBorder = crayon__("Top Border");
 | |
|         $tBottomBorder = crayon__("Bottom Border");
 | |
|         $tBorderRight = crayon__("Right Border");
 | |
| 
 | |
|         $tHover = crayon__("Hover");
 | |
|         $tActive = crayon__("Active");
 | |
|         $tPressed = crayon__("Pressed");
 | |
|         $tHoverPressed = crayon__("Pressed & Hover");
 | |
|         $tActivePressed = crayon__("Pressed & Active");
 | |
| 
 | |
|         $tTitle = crayon__("Title");
 | |
|         $tButtons = crayon__("Buttons");
 | |
| 
 | |
|         $tNormal = crayon__("Normal");
 | |
|         $tInline = crayon__("Inline");
 | |
|         $tStriped = crayon__("Striped");
 | |
|         $tMarked = crayon__("Marked");
 | |
|         $tStripedMarked = crayon__("Striped & Marked");
 | |
|         $tLanguage = crayon__("Language");
 | |
| 
 | |
|         $top = '.crayon-top';
 | |
|         $bottom = '.crayon-bottom';
 | |
|         $hover = ':hover';
 | |
|         $active = ':active';
 | |
|         $pressed = '.crayon-pressed';
 | |
| 
 | |
|         ?>
 | |
| 
 | |
|     <div
 | |
|             id="icon-options-general" class="icon32"></div>
 | |
|     <h2>
 | |
|         Crayon Syntax Highlighter
 | |
|         <?php crayon_e('Theme Editor'); ?>
 | |
|     </h2>
 | |
| 
 | |
|     <h3 id="<?php echo self::$settings['prefix'] ?>-name">
 | |
|         <?php
 | |
| //			if ($editing) {
 | |
| //				echo sprintf(crayon__('Editing "%s" Theme'), $theme->name());
 | |
| //			} else {
 | |
| //				echo sprintf(crayon__('Creating Theme From "%s"'), $theme->name());
 | |
| //			}
 | |
|         ?>
 | |
|     </h3>
 | |
|     <div id="<?php echo self::$settings['prefix'] ?>-info"></div>
 | |
| 
 | |
|     <p>
 | |
|         <a id="crayon-editor-back" class="button-primary"><?php crayon_e("Back To Settings"); ?></a>
 | |
|         <a id="crayon-editor-save" class="button-primary"><?php crayon_e("Save"); ?></a>
 | |
|         <span id="crayon-editor-status"></span>
 | |
|     </p>
 | |
| 
 | |
|     <?php //crayon_e('Use the Sidebar on the right to change the Theme of the Preview window.') ?>
 | |
| 
 | |
|     <div id="crayon-editor-top-controls"></div>
 | |
| 
 | |
|     <table id="crayon-editor-table" style="width: 100%;" cellspacing="5"
 | |
|            cellpadding="0">
 | |
|         <tr>
 | |
|             <td id="crayon-editor-preview-wrapper">
 | |
|                 <div id="crayon-editor-preview"></div>
 | |
|             </td>
 | |
|             <div id="crayon-editor-preview-css"></div>
 | |
|             <td id="crayon-editor-control-wrapper">
 | |
|                 <div id="crayon-editor-controls">
 | |
|                     <ul>
 | |
|                         <li title="<?php echo $tInformation ?>"><a class="crayon-tab-information" href="#tabs-1"></a></li>
 | |
|                         <li title="<?php echo $tHighlighting ?>"><a class="crayon-tab-highlighting" href="#tabs-2"></a></li>
 | |
|                         <li title="<?php echo $tFrame ?>"><a class="crayon-tab-frame" href="#tabs-3"></a></li>
 | |
|                         <li title="<?php echo $tLines ?>"><a class="crayon-tab-lines" href="#tabs-4"></a></li>
 | |
|                         <li title="<?php echo $tNumbers ?>"><a class="crayon-tab-numbers" href="#tabs-5"></a></li>
 | |
|                         <li title="<?php echo $tToolbar ?>"><a class="crayon-tab-toolbar" href="#tabs-6"></a></li>
 | |
|                     </ul>
 | |
|                     <div id="tabs-1">
 | |
|                         <?php
 | |
|                         self::createAttributesForm(array(
 | |
|                             new CrayonHTMLTitle($tInformation)
 | |
|                         ));
 | |
|                         ?>
 | |
|                         <div id="tabs-1-contents"></div>
 | |
|                         <!-- Auto-filled by theme_editor.js -->
 | |
|                     </div>
 | |
|                     <div id="tabs-2">
 | |
|                         <?php
 | |
|                         $highlight = ' .crayon-pre';
 | |
|                         $elems = array(
 | |
|                             'c' => crayon__("Comment"),
 | |
|                             's' => crayon__("String"),
 | |
|                             'p' => crayon__("Preprocessor"),
 | |
|                             'ta' => crayon__("Tag"),
 | |
|                             'k' => crayon__("Keyword"),
 | |
|                             'st' => crayon__("Statement"),
 | |
|                             'r' => crayon__("Reserved"),
 | |
|                             't' => crayon__("Type"),
 | |
|                             'm' => crayon__("Modifier"),
 | |
|                             'i' => crayon__("Identifier"),
 | |
|                             'e' => crayon__("Entity"),
 | |
|                             'v' => crayon__("Variable"),
 | |
|                             'cn' => crayon__("Constant"),
 | |
|                             'o' => crayon__("Operator"),
 | |
|                             'sy' => crayon__("Symbol"),
 | |
|                             'n' => crayon__("Notation"),
 | |
|                             'f' => crayon__("Faded"),
 | |
|                             'h' => crayon__("HTML"),
 | |
|                             '' => crayon__("Unhighlighted")
 | |
|                         );
 | |
|                         $atts = array(new CrayonHTMLTitle($tHighlighting));
 | |
|                         foreach ($elems as $class => $name) {
 | |
|                             $fullClass = $class != '' ? $highlight . ' .crayon-' . $class : $highlight;
 | |
|                             $atts[] = array(
 | |
|                                 $name,
 | |
|                                 self::createAttribute($fullClass, 'color'),
 | |
|                                 self::createAttribute($fullClass, 'font-weight'),
 | |
|                                 self::createAttribute($fullClass, 'font-style'),
 | |
|                                 self::createAttribute($fullClass, 'text-decoration')
 | |
|                             );
 | |
|                         }
 | |
|                         self::createAttributesForm($atts);
 | |
|                         ?>
 | |
|                     </div>
 | |
|                     <div id="tabs-3">
 | |
|                         <?php
 | |
|                         $inline = '-inline';
 | |
|                         self::createAttributesForm(array(
 | |
|                             new CrayonHTMLTitle($tFrame),
 | |
|                             new CrayonHTMLSeparator($tNormal),
 | |
| //                            self::createAttribute('', 'background', $tBackground),
 | |
|                             array(
 | |
|                                 $tBorder,
 | |
|                                 self::createAttribute('', 'border-width'),
 | |
|                                 self::createAttribute('', 'border-color'),
 | |
|                                 self::createAttribute('', 'border-style')
 | |
|                             ),
 | |
|                             new CrayonHTMLSeparator($tInline),
 | |
|                             self::createAttribute($inline, 'background', $tBackground),
 | |
|                             array(
 | |
|                                 $tBorder,
 | |
|                                 self::createAttribute($inline, 'border-width'),
 | |
|                                 self::createAttribute($inline, 'border-color'),
 | |
|                                 self::createAttribute($inline, 'border-style')
 | |
|                             ),
 | |
|                         ));
 | |
|                         ?>
 | |
|                     </div>
 | |
|                     <div id="tabs-4">
 | |
|                         <?php
 | |
|                         $stripedLine = ' .crayon-striped-line';
 | |
|                         $markedLine = ' .crayon-marked-line';
 | |
|                         $stripedMarkedLine = ' .crayon-marked-line.crayon-striped-line';
 | |
|                         self::createAttributesForm(array(
 | |
|                             new CrayonHTMLTitle($tLines),
 | |
|                             new CrayonHTMLSeparator($tNormal),
 | |
|                             self::createAttribute('', 'background', $tBackground),
 | |
|                             new CrayonHTMLSeparator($tStriped),
 | |
|                             self::createAttribute($stripedLine, 'background', $tBackground),
 | |
|                             new CrayonHTMLSeparator($tMarked),
 | |
|                             self::createAttribute($markedLine, 'background', $tBackground),
 | |
|                             array(
 | |
|                                 $tBorder,
 | |
|                                 self::createAttribute($markedLine, 'border-width'),
 | |
|                                 self::createAttribute($markedLine, 'border-color'),
 | |
|                                 self::createAttribute($markedLine, 'border-style'),
 | |
|                             ),
 | |
|                             self::createAttribute($markedLine . $top, 'border-top-style', $tTopBorder),
 | |
|                             self::createAttribute($markedLine . $bottom, 'border-bottom-style', $tBottomBorder),
 | |
|                             new CrayonHTMLSeparator($tStripedMarked),
 | |
|                             self::createAttribute($stripedMarkedLine, 'background', $tBackground),
 | |
|                         ));
 | |
|                         ?>
 | |
|                     </div>
 | |
|                     <div id="tabs-5">
 | |
|                         <?php
 | |
|                         $nums = ' .crayon-table .crayon-nums';
 | |
|                         $stripedNum = ' .crayon-striped-num';
 | |
|                         $markedNum = ' .crayon-marked-num';
 | |
|                         $stripedMarkedNum = ' .crayon-marked-num.crayon-striped-num';
 | |
|                         self::createAttributesForm(array(
 | |
|                             new CrayonHTMLTitle($tNumbers),
 | |
|                             array(
 | |
|                                 $tBorderRight,
 | |
|                                 self::createAttribute($nums, 'border-right-width'),
 | |
|                                 self::createAttribute($nums, 'border-right-color'),
 | |
|                                 self::createAttribute($nums, 'border-right-style'),
 | |
|                             ),
 | |
|                             new CrayonHTMLSeparator($tNormal),
 | |
|                             self::createAttribute($nums, 'background', $tBackground),
 | |
|                             self::createAttribute($nums, 'color', $tText),
 | |
|                             new CrayonHTMLSeparator($tStriped),
 | |
|                             self::createAttribute($stripedNum, 'background', $tBackground),
 | |
|                             self::createAttribute($stripedNum, 'color', $tText),
 | |
|                             new CrayonHTMLSeparator($tMarked),
 | |
|                             self::createAttribute($markedNum, 'background', $tBackground),
 | |
|                             self::createAttribute($markedNum, 'color', $tText),
 | |
|                             array(
 | |
|                                 $tBorder,
 | |
|                                 self::createAttribute($markedNum, 'border-width'),
 | |
|                                 self::createAttribute($markedNum, 'border-color'),
 | |
|                                 self::createAttribute($markedNum, 'border-style'),
 | |
|                             ),
 | |
|                             self::createAttribute($markedNum.$top, 'border-top-style', $tTopBorder),
 | |
|                             self::createAttribute($markedNum.$bottom, 'border-bottom-style', $tBottomBorder),
 | |
|                             new CrayonHTMLSeparator($tStripedMarked),
 | |
|                             self::createAttribute($stripedMarkedNum, 'background', $tBackground),
 | |
|                             self::createAttribute($stripedMarkedNum, 'color', $tText),
 | |
|                         ));
 | |
|                         ?>
 | |
|                     </div>
 | |
|                     <div id="tabs-6">
 | |
|                         <?php
 | |
|                         $toolbar = ' .crayon-toolbar';
 | |
|                         $title = ' .crayon-title';
 | |
|                         $button = ' .crayon-button';
 | |
|                         $info = ' .crayon-info';
 | |
|                         $language = ' .crayon-language';
 | |
|                         self::createAttributesForm(array(
 | |
|                             new CrayonHTMLTitle($tToolbar),
 | |
|                             new CrayonHTMLSeparator($tFrame),
 | |
|                             self::createAttribute($toolbar, 'background', $tBackground),
 | |
|                             array(
 | |
|                                 $tBottomBorder,
 | |
|                                 self::createAttribute($toolbar, 'border-bottom-width'),
 | |
|                                 self::createAttribute($toolbar, 'border-bottom-color'),
 | |
|                                 self::createAttribute($toolbar, 'border-bottom-style'),
 | |
|                             ),
 | |
|                             array(
 | |
|                                 $tTitle,
 | |
|                                 self::createAttribute($title, 'color'),
 | |
|                                 self::createAttribute($title, 'font-weight'),
 | |
|                                 self::createAttribute($title, 'font-style'),
 | |
|                                 self::createAttribute($title, 'text-decoration')
 | |
|                             ),
 | |
|                             new CrayonHTMLSeparator($tButtons),
 | |
|                             self::createAttribute($button, 'background-color', $tBackground),
 | |
|                             self::createAttribute($button.$hover, 'background-color', $tHover),
 | |
|                             self::createAttribute($button.$active, 'background-color', $tActive),
 | |
|                             self::createAttribute($button.$pressed, 'background-color', $tPressed),
 | |
|                             self::createAttribute($button.$pressed.$hover, 'background-color', $tHoverPressed),
 | |
|                             self::createAttribute($button.$pressed.$active, 'background-color', $tActivePressed),
 | |
|                             new CrayonHTMLSeparator($tInformation . ' ' . crayon__("(Used for Copy/Paste)")),
 | |
|                             self::createAttribute($info, 'background', $tBackground),
 | |
|                             array(
 | |
|                                 $tText,
 | |
|                                 self::createAttribute($info, 'color'),
 | |
|                                 self::createAttribute($info, 'font-weight'),
 | |
|                                 self::createAttribute($info, 'font-style'),
 | |
|                                 self::createAttribute($info, 'text-decoration')
 | |
|                             ),
 | |
|                             array(
 | |
|                                 $tBottomBorder,
 | |
|                                 self::createAttribute($info, 'border-bottom-width'),
 | |
|                                 self::createAttribute($info, 'border-bottom-color'),
 | |
|                                 self::createAttribute($info, 'border-bottom-style'),
 | |
|                             ),
 | |
|                             new CrayonHTMLSeparator($tLanguage),
 | |
|                             array(
 | |
|                                 $tText,
 | |
|                                 self::createAttribute($language, 'color'),
 | |
|                                 self::createAttribute($language, 'font-weight'),
 | |
|                                 self::createAttribute($language, 'font-style'),
 | |
|                                 self::createAttribute($language, 'text-decoration')
 | |
|                             ),
 | |
|                             self::createAttribute($language, 'background-color', $tBackground)
 | |
|                         ));
 | |
|                         ?>
 | |
|                     </div>
 | |
|                 </div>
 | |
|             </td>
 | |
|         </tr>
 | |
| 
 | |
|     </table>
 | |
| 
 | |
|     <?php
 | |
|         exit();
 | |
|     }
 | |
| 
 | |
|     public static function createAttribute($element, $attribute, $name = NULL) {
 | |
|         $group = self::getAttributeGroup($attribute);
 | |
|         $type = self::getAttributeType($group);
 | |
|         if ($type == 'select') {
 | |
|             $input = new CrayonHTMLSelect($element . '_' . $attribute, $name);
 | |
|             if ($group == 'border-style') {
 | |
|                 $input->addOptions(CrayonHTMLElement::$borderStyles);
 | |
|             } else if ($group == 'float') {
 | |
|                 $input->addOptions(array(
 | |
|                     'left',
 | |
|                     'right',
 | |
|                     'both',
 | |
|                     'none',
 | |
|                     'inherit'
 | |
|                 ));
 | |
|             } else if ($group == 'font-style') {
 | |
|                 $input->addOptions(array(
 | |
|                     'normal',
 | |
|                     'italic',
 | |
|                     'oblique',
 | |
|                     'inherit'
 | |
|                 ));
 | |
|             } else if ($group == 'font-weight') {
 | |
|                 $input->addOptions(array(
 | |
|                     'normal',
 | |
|                     'bold',
 | |
|                     'bolder',
 | |
|                     'lighter',
 | |
|                     '100',
 | |
|                     '200',
 | |
|                     '300',
 | |
|                     '400',
 | |
|                     '500',
 | |
|                     '600',
 | |
|                     '700',
 | |
|                     '800',
 | |
|                     '900',
 | |
|                     'inherit'
 | |
|                 ));
 | |
|             } else if ($group == 'text-decoration') {
 | |
|                 $input->addOptions(array(
 | |
|                     'none',
 | |
|                     'underline',
 | |
|                     'overline',
 | |
|                     'line-through',
 | |
|                     'blink',
 | |
|                     'inherit'
 | |
|                 ));
 | |
|             }
 | |
|         } else {
 | |
|             $input = new CrayonHTMLInput($element . '_' . $attribute, $name);
 | |
|         }
 | |
|         $input->addClass(self::ATTRIBUTE);
 | |
|         $input->addAttributes(array(
 | |
|             'data-element' => $element,
 | |
|             'data-attribute' => $attribute,
 | |
|             'data-group' => $group
 | |
|         ));
 | |
|         return $input;
 | |
|     }
 | |
| 
 | |
|     public static function createAttributesForm($atts) {
 | |
|         echo self::form($atts);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Saves the given theme id and css, making any necessary path and id changes to ensure the new theme is valid.
 | |
|      * Echos 0 on failure, 1 on success and 2 on success and if paths have changed.
 | |
|      */
 | |
|     public static function save() {
 | |
|         CrayonSettingsWP::load_settings();
 | |
|         $oldID = stripslashes($_POST['id']);
 | |
|         $name = stripslashes($_POST['name']);
 | |
|         $css = stripslashes($_POST['css']);
 | |
|         $change_settings = CrayonUtil::set_default($_POST['change_settings'], TRUE);
 | |
|         $allow_edit = CrayonUtil::set_default($_POST['allow_edit'], TRUE);
 | |
|         $allow_edit_stock_theme = CrayonUtil::set_default($_POST['allow_edit_stock_theme'], CRAYON_DEBUG);
 | |
|         $delete = CrayonUtil::set_default($_POST['delete'], TRUE);
 | |
|         $oldTheme = CrayonResources::themes()->get($oldID);
 | |
| 
 | |
|         if (!empty($oldID) && !empty($css) && !empty($name)) {
 | |
|             // By default, expect a user theme to be saved - prevents editing stock themes
 | |
|             // If in DEBUG mode, then allow editing stock themes.
 | |
|             $user = $oldTheme !== NULL && $allow_edit_stock_theme ? $oldTheme->user() : TRUE;
 | |
|             $oldPath = CrayonResources::themes()->path($oldID);
 | |
|             $oldDir = CrayonResources::themes()->dirpath_for_id($oldID);
 | |
|             // Create an instance to use functions, since late static binding is only available in 5.3 (PHP kinda sucks)
 | |
|             $theme = CrayonResources::themes()->resource_instance('');
 | |
|             $newID = $theme->clean_id($name);
 | |
|             $name = CrayonResource::clean_name($newID);
 | |
|             $newPath = CrayonResources::themes()->path($newID, $user);
 | |
|             $newDir = CrayonResources::themes()->dirpath_for_id($newID, $user);
 | |
| 
 | |
|             $exists = CrayonResources::themes()->is_loaded($newID) || (is_file($newPath) && is_file($oldPath));
 | |
|             if ($exists && $oldPath != $newPath) {
 | |
|                 // Never allow overwriting a theme with a different id!
 | |
|                 echo -3;
 | |
|                 exit();
 | |
|             }
 | |
| 
 | |
|             if ($oldPath == $newPath && $allow_edit === FALSE) {
 | |
|                 // Don't allow editing
 | |
|                 echo -4;
 | |
|                 exit();
 | |
|             }
 | |
| 
 | |
|             // Create the new path if needed
 | |
|             if (!is_dir($newDir)) {
 | |
|                 wp_mkdir_p($newDir);
 | |
|                 $imageSrc = $oldDir . 'images';
 | |
|                 if (is_dir($imageSrc)) {
 | |
|                     try {
 | |
|                         // Copy image folder
 | |
|                         CrayonUtil::copyDir($imageSrc, $newDir . 'images', 'wp_mkdir_p');
 | |
|                     } catch (Exception $e) {
 | |
|                         CrayonLog::syslog($e->getMessage(), "THEME SAVE");
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $refresh = FALSE;
 | |
|             $replaceID = $oldID;
 | |
|             // Replace ids in the CSS
 | |
|             if (!is_file($oldPath) || strpos($css, CrayonThemes::CSS_PREFIX . $oldID) === FALSE) {
 | |
|                 // The old path/id is no longer valid - something has gone wrong - we should refresh afterwards
 | |
|                 $refresh = TRUE;
 | |
|             }
 | |
|             // XXX This is case sensitive to avoid modifying text, but it means that CSS must be in lowercase
 | |
|             $css = preg_replace('#(?<=' . CrayonThemes::CSS_PREFIX . ')' . $replaceID . '\b#ms', $newID, $css);
 | |
| 
 | |
|             // Replace the name with the new one
 | |
|             $info = self::getCSSInfo($css);
 | |
|             $info['name'] = $name;
 | |
|             $css = self::setCSSInfo($css, $info);
 | |
| 
 | |
|             $result = @file_put_contents($newPath, $css);
 | |
|             $success = $result !== FALSE;
 | |
|             if ($success && $oldPath !== $newPath) {
 | |
|                 if ($oldID !== CrayonThemes::DEFAULT_THEME && $delete) {
 | |
|                     // Only delete the old path if it isn't the default theme
 | |
|                     try {
 | |
|                         // Delete the old path
 | |
|                         CrayonUtil::deleteDir($oldDir);
 | |
|                     } catch (Exception $e) {
 | |
|                         CrayonLog::syslog($e->getMessage(), "THEME SAVE");
 | |
|                     }
 | |
|                 }
 | |
|                 // Refresh
 | |
|                 echo 2;
 | |
|             } else {
 | |
|                 if ($refresh) {
 | |
|                     echo 2;
 | |
|                 } else {
 | |
|                     if ($success) {
 | |
|                         echo 1;
 | |
|                     } else {
 | |
|                         echo -2;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             // Set the new theme in settings
 | |
|             if ($change_settings) {
 | |
|                 CrayonGlobalSettings::set(CrayonSettings::THEME, $newID);
 | |
|                 CrayonSettingsWP::save_settings();
 | |
|             }
 | |
|         } else {
 | |
|             CrayonLog::syslog("$oldID=$oldID\n\n$name=$name", "THEME SAVE");
 | |
|             echo -1;
 | |
|         }
 | |
|         exit();
 | |
|     }
 | |
| 
 | |
|     public static function duplicate() {
 | |
|         CrayonSettingsWP::load_settings();
 | |
|         $oldID = $_POST['id'];
 | |
|         $oldPath = CrayonResources::themes()->path($oldID);
 | |
|         $_POST['css'] = file_get_contents($oldPath);
 | |
|         $_POST['delete'] = FALSE;
 | |
|         $_POST['allow_edit'] = FALSE;
 | |
|         $_POST['allow_edit_stock_theme'] = FALSE;
 | |
|         self::save();
 | |
|     }
 | |
| 
 | |
|     public static function delete() {
 | |
|         CrayonSettingsWP::load_settings();
 | |
|         $id = $_POST['id'];
 | |
|         $dir = CrayonResources::themes()->dirpath_for_id($id);
 | |
|         if (is_dir($dir) && CrayonResources::themes()->exists($id)) {
 | |
|             try {
 | |
|                 CrayonUtil::deleteDir($dir);
 | |
|                 CrayonGlobalSettings::set(CrayonSettings::THEME, CrayonThemes::DEFAULT_THEME);
 | |
|                 CrayonSettingsWP::save_settings();
 | |
|                 echo 1;
 | |
|             } catch (Exception $e) {
 | |
|                 CrayonLog::syslog($e->getMessage(), "THEME SAVE");
 | |
|                 echo -2;
 | |
|             }
 | |
|         } else {
 | |
|             echo -1;
 | |
|         }
 | |
|         exit();
 | |
|     }
 | |
| 
 | |
|     public static function submit() {
 | |
|         global $CRAYON_EMAIL;
 | |
|         CrayonSettingsWP::load_settings();
 | |
|         $id = $_POST['id'];
 | |
|         $message = $_POST['message'];
 | |
|         $dir = CrayonResources::themes()->dirpath_for_id($id);
 | |
|         $dest = $dir . 'tmp';
 | |
|         wp_mkdir_p($dest);
 | |
| 
 | |
|         if (is_dir($dir) && CrayonResources::themes()->exists($id)) {
 | |
|             try {
 | |
|                 $zipFile = CrayonUtil::createZip($dir, $dest, TRUE);
 | |
|                 $result = CrayonUtil::emailFile(array(
 | |
|                     'to' => $CRAYON_EMAIL,
 | |
|                     'from' => get_bloginfo('admin_email'),
 | |
|                     'subject' => 'Theme Editor Submission',
 | |
|                     'message' => $message,
 | |
|                     'file' => $zipFile
 | |
|                 ));
 | |
|                 CrayonUtil::deleteDir($dest);
 | |
|                 if ($result) {
 | |
|                     echo 1;
 | |
|                 } else {
 | |
|                     echo -3;
 | |
|                 }
 | |
|             } catch (Exception $e) {
 | |
|                 CrayonLog::syslog($e->getMessage(), "THEME SUBMIT");
 | |
|                 echo -2;
 | |
|             }
 | |
|         } else {
 | |
|             echo -1;
 | |
|         }
 | |
|         exit();
 | |
|     }
 | |
| 
 | |
|     public static function getCSSInfo($css) {
 | |
|         $info = array();
 | |
|         preg_match(self::RE_COMMENT, $css, $matches);
 | |
|         if (count($matches)) {
 | |
|             $comment = $matches[0];
 | |
|             preg_match_all('#([^\r\n:]*[^\r\n\s:])\s*:\s*([^\r\n]+)#msi', $comment, $matches);
 | |
|             if (count($matches)) {
 | |
|                 for ($i = 0; $i < count($matches[1]); $i++) {
 | |
|                     $name = $matches[1][$i];
 | |
|                     $value = $matches[2][$i];
 | |
|                     $info[self::getFieldID($name)] = $value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         return $info;
 | |
|     }
 | |
| 
 | |
|     public static function cssInfoToString($info) {
 | |
|         $str = "/*\n";
 | |
|         foreach ($info as $id => $value) {
 | |
|             $str .= self::getFieldName($id) . ': ' . $value . "\n";
 | |
|         }
 | |
|         $str .= "*/";
 | |
|         return $str;
 | |
|     }
 | |
| 
 | |
|     public static function setCSSInfo($css, $info) {
 | |
|         return preg_replace(self::RE_COMMENT, self::cssInfoToString($info), $css);
 | |
|     }
 | |
| 
 | |
|     public static function getFieldID($name) {
 | |
|         if (isset(self::$infoFieldsInverse[$name])) {
 | |
|             return self::$infoFieldsInverse[$name];
 | |
|         } else {
 | |
|             return CrayonUserResource::clean_id($name);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function getFieldName($id) {
 | |
|         self::initFields();
 | |
|         if (isset(self::$infoFields[$id])) {
 | |
|             return self::$infoFields[$id];
 | |
|         } else {
 | |
|             return CrayonUserResource::clean_name($id);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function getAttributeGroup($attribute) {
 | |
|         if (isset(self::$attributeGroupsInverse[$attribute])) {
 | |
|             return self::$attributeGroupsInverse[$attribute];
 | |
|         } else {
 | |
|             return $attribute;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function getAttributeType($group) {
 | |
|         if (isset(self::$attributeTypesInverse[$group])) {
 | |
|             return self::$attributeTypesInverse[$group];
 | |
|         } else {
 | |
|             return 'text';
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| ?>
 | 
