using System; using System.Collections; using System.Text.RegularExpressions; using System.Web; using System.Web.UI; using umbraco.BasePages; using umbraco.BusinessLogic; using umbraco.cms.businesslogic.web; using umbraco.editorControls.tinymce; using umbraco.editorControls.tinyMCE3.webcontrol; using umbraco.editorControls.wysiwyg; using umbraco.interfaces; using umbraco.IO; using umbraco.presentation; using umbraco.uicontrols; namespace umbraco.editorControls.tinyMCE3 { public class TinyMCE : TinyMCEWebControl, IDataEditor, IMenuElement, ILiveEditingDataEditor { private readonly string _activateButtons = ""; private readonly string _advancedUsers = ""; private readonly SortedList _buttons = new SortedList(); private readonly IData _data; private readonly string _disableButtons = "help,visualaid,"; private readonly string _editorButtons = ""; private readonly bool _enableContextMenu; private readonly bool _fullWidth; private readonly int _height; private readonly SortedList _mceButtons = new SortedList(); private readonly ArrayList _menuIcons = new ArrayList(); private readonly bool _showLabel; private readonly ArrayList _stylesheets = new ArrayList(); private readonly int _width; private readonly int m_maxImageWidth = 500; private bool _isInitialized; private string _plugins = ""; private bool m_isInLiveEditingMode; public TinyMCE(IData Data, string Configuration) { _data = Data; try { string[] configSettings = Configuration.Split("|".ToCharArray()); if (configSettings.Length > 0) { _editorButtons = configSettings[0]; if (configSettings.Length > 1) if (configSettings[1] == "1") _enableContextMenu = true; if (configSettings.Length > 2) _advancedUsers = configSettings[2]; if (configSettings.Length > 3) { if (configSettings[3] == "1") _fullWidth = true; else if (configSettings[4].Split(',').Length > 1) { _width = int.Parse(configSettings[4].Split(',')[0]); _height = int.Parse(configSettings[4].Split(',')[1]); } } // default width/height if (_width < 1) _width = 500; if (_height < 1) _height = 400; // add stylesheets if (configSettings.Length > 4) { foreach (string s in configSettings[5].Split(",".ToCharArray())) _stylesheets.Add(s); } if (configSettings.Length > 6 && configSettings[6] != "") _showLabel = bool.Parse(configSettings[6]); if (configSettings.Length > 7 && configSettings[7] != "") m_maxImageWidth = int.Parse(configSettings[7]); // sizing if (!_fullWidth) { config.Add("width", _width.ToString()); config.Add("height", _height.ToString()); } if (_enableContextMenu) _plugins += ",contextmenu"; // safari compatibility if (HttpContext.Current.Request.Browser.Browser.ToLower().Contains("safari")) { _plugins += ",safari"; } // If the editor is used in umbraco, use umbraco's own toolbar bool onFront = false; if (GlobalSettings.RequestIsInUmbracoApplication(HttpContext.Current) || UmbracoContext.Current.LiveEditingContext.Enabled) { config.Add("theme_umbraco_toolbar_location", "external"); config.Add("skin", "umbraco"); config.Add("inlinepopups_skin ", "umbraco"); } else { onFront = true; config.Add("theme_umbraco_toolbar_location", "top"); } // load plugins IDictionaryEnumerator pluginEnum = tinyMCEConfiguration.Plugins.GetEnumerator(); while (pluginEnum.MoveNext()) { var plugin = (tinyMCEPlugin)pluginEnum.Value; if (plugin.UseOnFrontend || (!onFront && !plugin.UseOnFrontend)) _plugins += "," + plugin.Name; } if (_plugins.StartsWith(",")) _plugins = _plugins.Substring(1, _plugins.Length - 1); if (_plugins.EndsWith(",")) _plugins = _plugins.Substring(0, _plugins.Length - 1); config.Add("plugins", _plugins); // Check advanced settings if (UmbracoEnsuredPage.CurrentUser != null && ("," + _advancedUsers + ",").IndexOf("," + UmbracoEnsuredPage.CurrentUser.UserType.Id + ",") > -1) config.Add("umbraco_advancedMode", "true"); else config.Add("umbraco_advancedMode", "false"); // Check maximum image width config.Add("umbraco_maximumDefaultImageWidth", m_maxImageWidth.ToString()); // Styles string cssFiles = String.Empty; string styles = string.Empty; foreach (string styleSheetId in _stylesheets) { if (styleSheetId.Trim() != "") try { var s = new StyleSheet(int.Parse(styleSheetId)); if (s.nodeObjectType == StyleSheet.ModuleObjectType) { cssFiles += IOHelper.ResolveUrl(SystemDirectories.Css + "/" + s.Text + ".css"); foreach (StylesheetProperty p in s.Properties) { if (styles != string.Empty) { styles += ";"; } if (p.Alias.StartsWith(".")) styles += p.Text + "=" + p.Alias; else styles += p.Text + "=" + p.Alias; } cssFiles += ","; } } catch (Exception ee) { Log.Add(LogTypes.Error, -1, string.Format( string.Format("Error adding stylesheet to tinymce (id: {{0}}). {0}", ee), styleSheetId)); } } // remove any ending comma (,) if (!string.IsNullOrEmpty(cssFiles)) { cssFiles = cssFiles.TrimEnd(','); } // language string userLang = (UmbracoEnsuredPage.CurrentUser != null) ? (User.GetCurrent().Language.Contains("-") ? User.GetCurrent().Language.Substring(0, User.GetCurrent().Language.IndexOf("-")) : User.GetCurrent().Language) : "en"; config.Add("language", userLang); config.Add("content_css", cssFiles); config.Add("theme_umbraco_styles", styles); // Add buttons IDictionaryEnumerator ide = tinyMCEConfiguration.Commands.GetEnumerator(); while (ide.MoveNext()) { var cmd = (tinyMCECommand)ide.Value; if (_editorButtons.IndexOf("," + cmd.Alias + ",") > -1) _activateButtons += cmd.Alias + ","; else _disableButtons += cmd.Alias + ","; } if (_activateButtons.Length > 0) _activateButtons = _activateButtons.Substring(0, _activateButtons.Length - 1); if (_disableButtons.Length > 0) _disableButtons = _disableButtons.Substring(0, _disableButtons.Length - 1); // Add buttons initButtons(); _activateButtons = ""; int separatorPriority = 0; ide = _mceButtons.GetEnumerator(); while (ide.MoveNext()) { string mceCommand = ide.Value.ToString(); var curPriority = (int)ide.Key; // Check priority if (separatorPriority > 0 && Math.Floor(decimal.Parse(curPriority.ToString()) / 10) > Math.Floor(decimal.Parse(separatorPriority.ToString()) / 10)) _activateButtons += "separator,"; _activateButtons += mceCommand + ","; separatorPriority = curPriority; } config.Add("theme_umbraco_buttons1", _activateButtons); config.Add("theme_umbraco_buttons2", ""); config.Add("theme_umbraco_buttons3", ""); config.Add("theme_umbraco_toolbar_align", "left"); config.Add("theme_umbraco_disable", _disableButtons); config.Add("theme_umbraco_path ", "true"); config.Add("extended_valid_elements", "div[*]"); config.Add("document_base_url", "/"); config.Add("relative_urls", "false"); config.Add("remove_script_host", "true"); config.Add("event_elements", "div"); config.Add("paste_auto_cleanup_on_paste", "true"); config.Add("valid_elements", tinyMCEConfiguration.ValidElements.Substring(1, tinyMCEConfiguration.ValidElements.Length - 2)); config.Add("invalid_elements", tinyMCEConfiguration.InvalidElements); // custom commands if (tinyMCEConfiguration.ConfigOptions.Count > 0) { ide = tinyMCEConfiguration.ConfigOptions.GetEnumerator(); while (ide.MoveNext()) { config.Add(ide.Key.ToString(), ide.Value.ToString()); } } //if (HttpContext.Current.Request.Path.IndexOf(umbraco.IO.SystemDirectories.Umbraco) > -1) // config.Add("language", User.GetUser(BasePage.GetUserId(BasePage.umbracoUserContextID)).Language); //else // config.Add("language", System.Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName); if (_fullWidth) { config.Add("auto_resize", "true"); base.Columns = 30; base.Rows = 30; } else { base.Columns = 0; base.Rows = 0; } EnableViewState = false; } } catch (Exception ex) { throw new ArgumentException("Incorrect TinyMCE configuration.", "Configuration", ex); } } #region TreatAsRichTextEditor public virtual bool TreatAsRichTextEditor { get { return false; } } #endregion #region ShowLabel public virtual bool ShowLabel { get { return _showLabel; } } #endregion #region Editor public Control Editor { get { return this; } } #endregion #region Save() public virtual void Save() { string parsedString = base.Text.Trim(); if (parsedString != string.Empty) { parsedString = replaceMacroTags(parsedString).Trim(); // tidy html - refactored, see #30534 if (UmbracoSettings.TidyEditorContent) { // always wrap in a
was a bad idea parsedString = "