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'; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |