예제 #1
0
        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();
        }
예제 #2
0
        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));
        }
예제 #3
0
        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()));
        }
예제 #4
0
        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()));
        }
예제 #5
0
        public PluginExtendedPropertyCollection(PluginElement owner) : base(StringComparer.OrdinalIgnoreCase)
        {
            if (owner == null)
            {
                throw new ArgumentNullException("owner");
            }

            _owner = owner;
        }
예제 #6
0
        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()));
        }
예제 #7
0
        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));
        }
예제 #8
0
        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)
                          );
            }
        }
예제 #9
0
        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));
            }
        }
예제 #10
0
 public void Init()
 {
     _element = new PluginElement();
 }
예제 #11
0
 public void Init()
 {
     _element = new PluginElement();
 }
예제 #12
0
        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);
        }
예제 #13
0
 /// <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);
예제 #14
0
 /// <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} ");
 }