public metaDocScriptBlock AddIndex(metaDocumentSet indexSource, metaDocScriptBlock output = null)
        {
            if (output == null)
            {
                output = new metaDocScriptBlock();
            }

            output.instructions.open("menu", "Documents", "");

            foreach (metaDocument indexDoc in indexSource.documents)
            {
                output.instructions.c_link(indexDoc.documentTitle, indexDoc.name.add("index.html", "/"), indexDoc.name, indexDoc.documentDescription, appendLinkType.link);

                foreach (metaPage indexPage in indexDoc.pages)
                {
                    string filepath = "{{{document_relpath}}}/" + indexPage.name + ".html"; //.t(templateFieldBasic.path_ext);
                    output.instructions.open("page", indexPage.pageTitle, indexPage.pageDescription);

                    output.instructions.c_link(indexPage.pageTitle, filepath, indexPage.name, indexPage.pageDescription, appendLinkType.link);

                    output.instructions.close();
                }
            }

            output.instructions.close();

            if (!blocks.Contains(output))
            {
                blocks.Add(output);
            }

            output.parent = this;

            return(output);
        }
        /// <summary>
        /// Creates datatemplate for all Enum type members
        /// </summary>
        /// <param name="enumType">Type of an Enum to use as shemata</param>
        /// <param name="title">The title.</param>
        /// <param name="description">The description.</param>
        /// <returns></returns>
        public metaDocScriptBlock AddDataTemplate(Type enumType, string title = "", string description = "")
        {
            metaDocScriptBlock output = new metaDocScriptBlock();

            if (imbSciStringExtensions.isNullOrEmpty(title))
            {
                title = enumType.Name.imbTitleCamelOperation(true);
            }

            if (imbSciStringExtensions.isNullOrEmpty(description))
            {
                description = "Showing all data mapped to enumeration (" + enumType.Name + ") members";//  enumType.Name
            }

            output.instructions.open("data", title, description);

            var keys = enumType.GetEnumValues();

            foreach (Enum key in keys)
            {
                string str_key   = key.toStringSafe();
                string str_value = "{{{" + key + "}}}";
                output.instructions.AppendPair(str_key, str_value, " = ", false);
            }

            output.instructions.close();

            blocks.Add(output);
            output.parent = this;
            return(output);
        }
        /// <summary>
        /// Adds and returns customizable subscript block
        /// </summary>
        /// <returns></returns>
        public metaDocScriptBlock AddScriptBlock()
        {
            metaDocScriptBlock output = new metaDocScriptBlock();

            blocks.Add(output);
            output.parent = this;

            return(output);
        }
        /// <summary>
        /// Adds another block
        /// </summary>
        /// <param name="title">The title.</param>
        /// <param name="description">The description.</param>
        /// <param name="lines">The lines.</param>
        /// <returns></returns>
        public metaDocScriptBlock AddBlock(string title, string description, IEnumerable <string> lines)
        {
            metaDocScriptBlock output = new metaDocScriptBlock();

            output.instructions.open("block", title, description);

            foreach (string ln in lines)
            {
                output.instructions.AppendLine(ln);
            }

            output.instructions.close();

            blocks.Add(output);
            output.parent = this;

            return(output);
        }
        public metaDocScriptBlock AddPropertyCollection(PropertyCollection properties, string title, string description)
        {
            metaDocScriptBlock output = new metaDocScriptBlock();

            output.instructions.open("data", title, description);

            foreach (object key in properties.Keys)
            {
                object val = properties[key];

                string str_key   = key.toStringSafe();
                string str_value = properties[key].toStringSafe();

                if (str_value == "(..)")
                {
                    if (val != null)
                    {
                        PropertyCollection pc = val.buildPropertyCollection <PropertyCollection>(true, false, "obj");
                        if (pc.Keys.Count > 0)
                        {
                            output.instructions.open("subdata", str_key + " : " + val.GetType().Name, "Object properties");

                            foreach (object objkey in pc.Keys)
                            {
                                string obj_key   = objkey.toStringSafe();
                                string obj_value = pc[key].toStringSafe();
                                output.instructions.AppendPair(obj_key, str_value, " = ", false);
                            }

                            output.instructions.close();
                        }
                    }
                }

                output.instructions.AppendPair(str_key, str_value, " = ", false);
            }

            output.instructions.close();

            blocks.Add(output);
            output.parent = this;
            return(output);
        }
        /// <summary>
        /// Adds the index skip this.
        /// </summary>
        /// <param name="indexSource">The index source.</param>
        /// <param name="skipThis">The skip this.</param>
        /// <param name="output">The output.</param>
        /// <returns></returns>
        public metaDocScriptBlock AddIndexSkipThis(metaDocument indexSource, metaPage skipThis, string customTitle = "", metaDocScriptBlock output = null)
        {
            if (output == null)
            {
                output = new metaDocScriptBlock();
            }

            if (imbSciStringExtensions.isNullOrEmpty(customTitle))
            {
                customTitle = "Pages";
            }

            output.instructions.open("menu", customTitle, "");

            foreach (metaPage indexPage in indexSource.pages)
            {
                if (indexPage != null)
                {
                    if (indexPage != skipThis)
                    {
                        string filepath = "" + indexPage.name + ".html"; //.t(templateFieldBasic.path_ext);

                        output.instructions.open("page", indexPage.pageTitle, indexPage.pageDescription);

                        output.instructions.c_link(indexPage.pageTitle, filepath, indexPage.name, indexPage.pageDescription, appendLinkType.link);

                        output.instructions.close();
                    }
                }
            }

            output.instructions.close();

            if (!blocks.Contains(output))
            {
                blocks.Add(output);
            }

            output.parent = this;

            return(output);
        }
        public metaDocScriptBlock AddNavigation(IMetaContentNested navParent)
        {
            metaDocScriptBlock output = new metaDocScriptBlock();

            output.instructions.open("nav", "Navigation", "");

            output.instructions.c_link("Back", "../index.html", "home", "Back to main index page", appendLinkType.link);
            output.instructions.c_link("Index", "index.html", "home", "Back to main index page", appendLinkType.link);

            output.instructions.close();

            //foreach (metaPage indexPage in indexSource.pages)
            //{
            //    String filepath = indexPage.name + ".html"; //.t(templateFieldBasic.path_ext);
            //    output.instructions.c_link(indexPage.pageTitle, filepath, indexPage.name, indexPage.pageDescription, appendLinkType.link);
            //}

            blocks.Add(output);
            output.parent = this;

            return(output);
        }