internal PluginExtendedProperty(PluginElement owner, string name, PluginTreeNode valueNode, Plugin plugin) { if (owner == null) { throw new ArgumentNullException("owner"); } if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } if (valueNode == null) { throw new ArgumentNullException("valueNode"); } if (plugin == null) { throw new ArgumentNullException("plugin"); } _owner = owner; _name = name.Trim(); _valueNode = valueNode; _rawValue = valueNode.FullPath; _plugin = plugin; _syncRoot = new object(); }
public static IParser GetParser(string text, PluginElement element) { if (string.IsNullOrWhiteSpace(text)) { return(null); } Match match = _regex.Match(text); if (!match.Success) { return(null); } var scheme = match.Groups["scheme"].Value; if (string.IsNullOrWhiteSpace(scheme)) { return(null); } Plugin plugin = element.Plugin; if (plugin == null) { return(null); } //通过插件向上查找指定的解析器 return(plugin.GetParser(scheme)); }
public void Should_return_correct_type() { PluginElement pluginElement = new PluginElement(); pluginElement.TypeStr = "BuildScreen.Tests.Core.Plugin.Configuration.Dummyplugin, BuildScreen.Tests"; Assert.That(pluginElement.PluginType, Is.EqualTo(new Dummyplugin().GetType())); }
public void Should_not_be_able_to_create_type_from_invalid_type_string() { PluginElement pluginElement = new PluginElement(); pluginElement.TypeStr = "BuildScreen.Tests.Core.Plugin.Configuration.DummypluginNotExistingType, BuildScreen.Tests"; pluginElement.Name = "DummyName"; Assert.That(pluginElement.PluginType, Is.EqualTo(new Dummyplugin().GetType())); }
public PluginExtendedPropertyCollection(PluginElement owner) : base(StringComparer.OrdinalIgnoreCase) { if (owner == null) { throw new ArgumentNullException("owner"); } _owner = owner; }
public void Should_not_be_able_to_create_type_which_dont_implement_IBuildScreenPlugin() { PluginElement pluginElement = new PluginElement(); pluginElement.TypeStr = "BuildScreen.Tests.Core.Plugin.Configuration.Dummyplugin"; pluginElement.Name = "BuildScreen.Tests.dll"; //pluginElement.TypeStr = "BuildScreen.Tests.Core.Plugin.Configuration.PluginElementTests, BuildScreen.Tests"; Assert.That(pluginElement.PluginType, Is.EqualTo(new Dummyplugin().GetType())); }
private static object Parse(string text, PluginElement element, Func <string, string, PluginElement, ParserContext> createContext) { if (string.IsNullOrWhiteSpace(text)) { return(text); } string scheme, value, prefix, suffix; //解析输入的文本 ResolveText(text, out scheme, out value, out prefix, out suffix); if (string.IsNullOrWhiteSpace(scheme)) { return(value); } Plugin plugin = element.Plugin; if (plugin == null) { return(null); } //通过插件向上查找指定的解析器 IParser parser = plugin.GetParser(scheme); if (parser == null) { throw new PluginException(string.Format("This '{0}' parser no found, and use in this '{1}' plugin.", scheme, plugin.Name)); } //创建解析器上下文对象 var context = createContext(scheme, value, element); //调用解析器的解析方法,获取解析结果 var result = parser.Parse(context); //如果表达式文本中无前缀和后缀则直接返回解析结果 if (string.IsNullOrWhiteSpace(prefix) && string.IsNullOrWhiteSpace(suffix)) { return(result); } //注意:否则将对解析结果与前缀和后缀做文本连接并返回该文本 return(string.Format("{1}{0}{2}", result, prefix, suffix)); }
private static void ValidatePlugin(Type pluginType) { PluginConfigurationSection plugins = ConfigurationManager.GetSection("pluginConfiguration") as PluginConfigurationSection; if (plugins == null) { throw new ArgumentException( string.Format(InternalResources.PluginCouldNotFindConfigurationSection, "pluginConfiguration") ); } PluginElement plugin = plugins.Plugins.FirstOrDefault(p => pluginType.FullName.Equals(p.TypeStr, StringComparison.OrdinalIgnoreCase)); if (plugin == null) { throw new ArgumentException( string.Format(InternalResources.PluginCouldNotFindPluginByName, pluginType.Name) ); } }
internal static object ResolveValue(PluginElement element, string text, string memberName, Type memberType, object defaultValue) { if (element == null) { throw new ArgumentNullException("element"); } if (string.IsNullOrWhiteSpace(text)) { return(Tiandao.Common.Converter.ConvertValue(text, memberType, defaultValue)); } object result = text; //进行解析器处理,如果解析器无法处理将会返回传入的原始值 if (Parsers.Parser.CanParse(text)) { if (element is Builtin) { result = Parsers.Parser.Parse(text, (Builtin)element, memberName, memberType); } else if (element is PluginTreeNode) { result = Parsers.Parser.Parse(text, (PluginTreeNode)element, memberName, memberType); } else { throw new ArgumentException(string.Format("Can not support the '{0}' element type.", element.GetType())); } } //对最后的结果进行类型转换,如果指定的类型为空,该转换操作不会执行任何动作 if (memberType == null) { return(result); } else { return(Tiandao.Common.Converter.ConvertValue(result, memberType, defaultValue)); } }
public void Init() { _element = new PluginElement(); }
private Element _GetCreoleElementFrom(TokenRange <CreoleTokenCode> tokens, CreoleRichTextElementNodeData nodeData) { Element result = null; switch (nodeData.ElementType) { case CreoleRichTextElementType.Code: result = new CodeElement( _GetContentFrom(tokens, nodeData) ); break; case CreoleRichTextElementType.Hyperlink: result = new HyperlinkElement( _GetUrlFrom(tokens, nodeData), _GetCreoleElements(tokens, nodeData.ContentStartIndex, nodeData.ContentEndIndex, nodeData.ChildNodes) ); break; case CreoleRichTextElementType.Image: if (nodeData.UrlEndIndex < nodeData.ContentStartIndex) { result = new ImageElement( _GetUrlFrom(tokens, nodeData), _GetContentFrom(tokens, nodeData) ); } else { result = new ImageElement( _GetUrlFrom(tokens, nodeData) ); } break; case CreoleRichTextElementType.Plugin: result = new PluginElement( _GetContentFrom(tokens, nodeData) ); break; case CreoleRichTextElementType.LineBreak: result = _creoleLineBreakElement; break; case CreoleRichTextElementType.InlineHyperlink: var url = _GetUrlFrom(tokens, nodeData); result = new HyperlinkElement(url, new[] { new TextElement(url) }); break; case CreoleRichTextElementType.EscapedInlineHyperlink: result = new TextElement( _GetUrlFrom(tokens, nodeData) ); break; case CreoleRichTextElementType.Emphasis: result = new EmphasisElement( _GetCreoleElements(tokens, nodeData.ContentStartIndex, nodeData.ContentEndIndex, nodeData.ChildNodes) ); break; case CreoleRichTextElementType.Strong: result = new StrongElement( _GetCreoleElements(tokens, nodeData.ContentStartIndex, nodeData.ContentEndIndex, nodeData.ChildNodes) ); break; } return(result); }
/// <summary>Visits the provided <paramref name="plugin"/> element.</summary> /// <param name="plugin">The <see cref="PluginElement"/> to visit.</param> protected internal abstract void Visit(PluginElement plugin);
/// <summary>Visits the provided <paramref name="plugin"/> element.</summary> /// <param name="plugin">The <see cref="PluginElement"/> to visit.</param> protected internal override void Visit(PluginElement plugin) { WriteComment($" {plugin.PluginText} "); }