예제 #1
0
        public static void ImportAll(string directoryName)
        {
            var namespaces = HelpLogic.AllTypes().Select(a => a.Namespace !).Distinct().ToDictionary(a => a);

            var types = HelpLogic.AllTypes().ToDictionary(a => a.FullName !);

            foreach (var path in Directory.GetFiles(directoryName, "*.help", SearchOption.AllDirectories))
            {
                try
                {
                    XDocument doc = XDocument.Load(path);

                    ImportAction action =
                        doc.Root.Name == AppendixXml._Appendix ? AppendixXml.Load(doc):
                        doc.Root.Name == NamespaceXml._Namespace ? NamespaceXml.Load(doc, namespaces):
                        doc.Root.Name == EntityXml._Entity ? EntityXml.Load(doc, types):
                        doc.Root.Name == QueryXml._Query ? QueryXml.Load(doc) :
                        throw new InvalidOperationException("Unknown Xml root: " + doc.Root.Name);

                    ConsoleColor color =
                        action == ImportAction.Inserted ? ConsoleColor.Green :
                        action == ImportAction.Updated ? ConsoleColor.DarkGreen :
                        action == ImportAction.Skipped ? ConsoleColor.Yellow :
                        action == ImportAction.NoChanges ? ConsoleColor.DarkGray :
                        throw new InvalidOperationException("Unexpected action");

                    SafeConsole.WriteLineColor(color, " {0} {1}".FormatWith(action, path));
                }
                catch (Exception e)
                {
                    SafeConsole.WriteLineColor(ConsoleColor.Red, " Error {0}:\r\n\t".FormatWith(path) + e.Message);
                }
            }
        }
예제 #2
0
        public TypeHelpEntity GetEntity()
        {
            var result = new TypeHelpEntity
            {
                Culture     = this.Culture.ToCultureInfoEntity(),
                Type        = this.Type.ToTypeEntity(),
                Description = DBEntity?.Description,
                Info        = Info
            };

            result.Properties.AddRange(
                from pre in PropertyRouteLogic.RetrieveOrGenerateProperties(this.Type.ToTypeEntity())
                let pr = pre.ToPropertyRoute()
                         where !(pr.PropertyInfo != null && pr.PropertyInfo.SetMethod == null && ExpressionCleaner.HasExpansions(pr.PropertyInfo.DeclaringType !, pr.PropertyInfo))
                         let ph = Properties.GetOrThrow(pre.ToPropertyRoute())
                                  where ph.IsAllowed() == null
                                  select new PropertyRouteHelpEmbedded
            {
                Property    = pre,
                Info        = ph.Info,
                Description = ph.UserDescription,
            });

            result.Operations.AddRange(
                from oh in Operations.Values
                where oh.IsAllowed() == null
                select new OperationHelpEmbedded
            {
                Operation   = oh.OperationSymbol,
                Info        = oh.Info,
                Description = oh.UserDescription,
            });

            result.Queries.AddRange(
                from qn in QueryLogic.Queries.GetTypeQueries(this.Type).Keys
                let qh = HelpLogic.GetQueryHelp(qn)
                         where qh.IsAllowed() == null
                         select qh.GetEntity());

            if (DBEntity != null)
            {
                result.SetId(DBEntity.Id);
                result.SetIsNew(DBEntity.IsNew);
                result.Ticks = DBEntity.Ticks;
            }
            return(result);
        }
예제 #3
0
        public TypeHelp(Type type, CultureInfo culture, TypeHelpEntity?entity)
        {
            Type    = type;
            Culture = culture;
            Info    = HelpGenerator.GetEntityHelp(type);

            var props = DBEntity?.Properties.ToDictionaryEx(a => a.Property.ToPropertyRoute(), a => a.Info);
            var opers = DBEntity?.Operations.ToDictionaryEx(a => a.Operation, a => a.Info);

            Properties = PropertyRoute.GenerateRoutes(type)
                         .ToDictionary(pp => pp, pp => new PropertyHelp(pp, props?.TryGetC(pp)));

            Operations = OperationLogic.TypeOperations(type)
                         .ToDictionary(op => op.OperationSymbol, op => new OperationHelp(op.OperationSymbol, type, opers?.TryGetC(op.OperationSymbol)));


            var allQueries = HelpLogic.CachedQueriesHelp();

            Queries = HelpLogic.TypeToQuery.Value.TryGetC(this.Type).EmptyIfNull().Select(a => allQueries.GetOrThrow(a)).ToDictionary(qh => qh.QueryName);

            DBEntity = entity;
        }
예제 #4
0
        public static WikiLink LinkParser(string content)
        {
            Match m = HelpLogic.HelpLinkRegex.Match(content);

            if (m.Success)
            {
                string letter = m.Groups["letter"].ToString();
                string link   = m.Groups["link"].ToString();
                string text   = m.Groups["text"].ToString();

                switch (letter)
                {
                case WikiFormat.EntityLink:
                    Type t = TypeLogic.TryGetType(link);
                    return(new WikiLink(
                               HelpUrls.EntityUrl(t),
                               text.HasText() ? text : t.NiceName()));

                case WikiFormat.Hyperlink:
                    return(new WikiLink(link, text));

                case WikiFormat.OperationLink:
                    OperationSymbol operation = SymbolLogic <OperationSymbol> .TryToSymbol(link);

                    List <Type> types = OperationLogic.FindTypes(operation).Where(TypeLogic.TypeToEntity.ContainsKey).ToList();
                    if (types.Count == 1)
                    {
                        return(new WikiLink(
                                   HelpUrls.OperationUrl(types[0], operation),
                                   text.HasText() ? text : operation.NiceToString()));
                    }
                    else
                    {
                        return(new MultiWikiLink(operation.NiceToString())
                        {
                            Links = types.Select(currentType =>
                                                 new WikiLink(
                                                     HelpUrls.OperationUrl(currentType, operation),
                                                     currentType.NiceName(), operation.NiceToString())).ToList()
                        });
                    }

                case WikiFormat.PropertyLink:
                    PropertyRoute route = PropertyRoute.Parse(TypeLogic.TryGetType(link.Before('.')), link.After('.'));

                    while (route.PropertyRouteType == PropertyRouteType.LiteEntity ||
                           route.PropertyRouteType == PropertyRouteType.Mixin ||
                           route.PropertyRouteType == PropertyRouteType.MListItems)
                    {
                        route = route.Parent;
                    }

                    return(new WikiLink(HelpUrls.PropertyUrl(route), route.PropertyInfo.NiceName()));

                case WikiFormat.QueryLink:
                    object o = QueryLogic.TryToQueryName(link);
                    if (o as Enum != null)
                    {
                        Enum query = (Enum)o;
                        return(new WikiLink(
                                   HelpUrls.QueryUrl(query),
                                   text.HasText() ? text : QueryUtils.GetNiceName(query)));
                    }
                    else
                    {
                        Type query = (Type)o;
                        return(new WikiLink(
                                   HelpUrls.QueryUrl(query),
                                   text.HasText() ? text : QueryUtils.GetNiceName(query)));
                    }

                case WikiFormat.NamespaceLink:
                    NamespaceHelp nameSpace = HelpLogic.GetNamespaceHelp(link);
                    return(new WikiLink(
                               HelpUrls.NamespaceUrl(link),
                               text.HasText() ? text : link,
                               nameSpace != null ? "" : "unavailable"));

                case WikiFormat.AppendixLink:
                    AppendixHelp appendix = HelpLogic.GetAppendixHelp(link);
                    return(new WikiLink(
                               HelpUrls.AppendixUrl(link),
                               text.HasText() ? text : link,
                               appendix != null ? "" : "unavailable"));
                }
            }
            return(null);
        }
예제 #5
0
 public EntityItem(Type t)
 {
     CleanName      = TypeLogic.GetCleanName(t);
     HasDescription = HelpLogic.GetTypeHelp(t).HasEntity;
 }
예제 #6
0
        public EntityHelp(Type type, CultureInfo culture, EntityHelpEntity entity)
        {
            Type    = type;
            Culture = culture;
            Info    = HelpGenerator.GetEntityHelp(type);

            Properties = PropertyRoute.GenerateRoutes(type)
                         .ToDictionary(
                pp => pp,
                pp => new PropertyHelp(pp, HelpGenerator.GetPropertyHelp(pp)));


            var allOperations = HelpLogic.CachedOperationsHelp();

            Operations = OperationLogic.GetAllOperationInfos(type).Select(oi => allOperations.GetOrThrow(oi.OperationSymbol)).ToDictionary(a => a.OperationSymbol);

            var allQueries = HelpLogic.CachedQueriesHelp();

            Queries = HelpLogic.TypeToQuery.Value.TryGetC(this.Type).EmptyIfNull().Select(a => allQueries.GetOrThrow(a)).ToDictionary(qh => qh.QueryName);

            if (entity != null)
            {
                HasEntity = true;

                Description = entity.Description;

                foreach (var tranProp in entity.Properties)
                {
                    Properties.GetOrThrow(tranProp.Property.ToPropertyRoute()).UserDescription = tranProp.Description;
                }

                foreach (var transOper in entity.Operations)
                {
                    Operations.GetOrThrow(transOper.Operation).UserDescription = transOper.Description;
                }
            }

            Entity = new Lazy <EntityHelpEntity>(() => HelpLogic.GlobalContext(() =>
            {
                if (entity == null)
                {
                    entity = new EntityHelpEntity
                    {
                        Culture = this.Culture.ToCultureInfoEntity(),
                        Type    = this.Type.ToTypeEntity(),
                    }
                }
                ;

                entity.Properties.AddRange(
                    PropertyRouteLogic.RetrieveOrGenerateProperties(this.Type.ToTypeEntity())
                    .Except(entity.Properties.Select(a => a.Property))
                    .Select(pr => new PropertyRouteHelpEmbedded
                {
                    Property    = pr,
                    Description = null,
                }));

                entity.Operations.AddRange(this.Operations.Values.Select(o => o.Entity.Value).ToList());

                entity.Queries.AddRange(this.Queries.Values.Select(a => a.Entity.Value).ToList());

                return(entity);
            }));
        }