# encoding: ascii
# api: powershell
# title: New-MAML
# description: Generates External MAML Powershell help file for any loaded cmdlet or function
# version: 0.1
# type: function
# author: Chad Miller
# license: CC0
# x-poshcode-id: 1338
# x-archived: 2017-04-30T12:17:52
# x-published: 2010-09-22T17:45:00
#
#
#Requires -version 2.0
#Generates External MAML Powershell help file for any loaded cmdlet or function
#Note: Requires Joel Bennet's New-XML script from http: //www.poshcode.com/1244
#place New-XML in same directory as New-MAML
#Once the XML/MAML file is generated, you'll need to fill in the TODO items and the parameters options
#that are defaulted to false. The position parameter option will need to be changed in the generated MAML also.
#Example Usage to generate a test-ispath.ps1-help.xml file:
#PS C:\Users\u00\bin> $xml = ./new-maml test-ispath
#PS C:\Users\u00\bin> $xml.Declaration.ToString() | out-file ./test-ispath.ps1-help.xml -encoding "UTF8"
#PS C:\Users\u00\bin> $xml.ToString() | out-file ./test-ispath.ps1-help.xml -encoding "UTF8" -append
#For compiled cmdlets place the MAML file in the same directory as the binary module or snapin dll
#For script modules/functions include a reference to the External MAML file for each function
#Note: You can use the same MAML file for multiple functions, example:
#
## .ExternalHelp C:\Users\u00\bin\test-ispath.ps1-help.xml
## function test-ipath


param ($commandName)
$scriptRoot = Split-Path (Resolve-Path $myInvocation.MyCommand.Path)
. $scriptRoot\New-XML.ps1

[XNamespace]$helpItems="http://msh"
[XNamespace]$maml="http://schemas.microsoft.com/maml/2004/10"
[XNamespace]$command="http://schemas.microsoft.com/maml/dev/command/2004/10"
[XNamespace]$dev="http://schemas.microsoft.com/maml/dev/2004/10"
$parameters =  get-command $commandName | %{$commandName=$_.Name;$_.parameters} | %{$_.Values}

New-Xml helpItems -schema "maml" {
    xe ($command + "command") -maml $maml -command $command -dev $dev {
            xe ($command + "details") {
                xe ($command + "name") {"$commandName"}
                xe ($maml + "description") {
                    xe ($maml + "para") {"TODO Add Short description"}
                }
                xe ($maml + "copyright") {
                    xe ($maml + "para") {}
                }
                xe ($command + "verb") {"$(($CommandName -split '-')[0])"}
                xe ($command + "noun") {"$(($commandName -split '-')[1])"}
                xe ($dev + "version") {}
            }
            xe ($maml + "description") {
                xe ($maml + "para") {"TODO Add Long description"}
            }
            xe ($command + "syntax") {
                xe ($command + "syntaxItem") {
                $parameters | foreach { 
                    xe ($command + "name") {"$commandName"}
                        xe ($command + "parameter") -require "false" -variableLength "false" -globbing "false" -pipelineInput "false" -postion "0" {
                            xe ($maml + "name") {"$($_.Name)"}
                            xe ($maml + "description") {
                                xe ($maml + "para") {"TODO Add $($_.Name) Description"}
                            }
                            xe ($command + "parameterValue") -required "false" -variableLength "false" {"$($_.ParameterType.Name)"}
                        }
                    }
                }
            }
            xe ($command + "parameters") {
                $parameters | foreach { 
                xe ($command + "parameter") -required "false" -variableLength "false" -globbing "false" -pipelineInput "false (ByValue)" -position "0" {
                    xe ($maml + "name") {"$($_.Name)"}
		    xe ($maml + "description") {
			xe ($maml + "para") {"TODO Add $($_.Name) Description"}
                    }
		    xe ($command + "parameterValue") -required "true" -variableLength "false" {"$($_.ParameterType.Name)"}
                    xe ($dev + "type") {
                        xe ($maml + "name") {"$($_.ParameterType.Name)"}
			xe ($maml + "uri"){}
                    }
		    xe ($dev + "defaultValue") {}
                }
                }
            }
	    xe ($command + "inputTypes") {
                xe ($command + "inputType") {
                    xe ($dev + "type") {
                        xe ($maml + "name") {"TODO Add $commandName inputType"}
                        xe ($maml + "uri") {}
                        xe ($maml + "description") {
                            xe ($maml + "para") {}
                        }
                    }
			xe ($maml + "description") {}
                }
            }
	    xe ($command + "returnValues") {
		xe ($command + "returnValue") {
		    xe ($dev + "type") {
		        xe ($maml + "name") {"TODO Add $commandName returnType"}
                        xe ($maml + "uri") {}
                        xe ($maml + "description") {
                            xe ($maml + "para") {}
                        }
                    }
		    xe ($maml + "description") {}
		}
	    }
            xe ($command + "terminatingErrors") {}
	    xe ($command + "nonTerminatingErrors") {}
	    xe ($maml + "alertSet") {
		xe ($maml + "title") {}
		xe ($maml + "alert") {
		    xe ($maml + "para") {}
                }
            }
            xe ($command + "examples") {
		xe ($command + "example") {
                    xe ($maml + "title") {"--------------  EXAMPLE 1 --------------"}
                    xe ($maml + "introduction") {
                        xe ($maml + "para") {"C:\PS&gt;"}
                    }
                    xe ($dev + "code") {"TODO Add $commandName Example code"}
                    xe ($dev + "remarks") {
                        xe ($maml + "para") {"TODO Add $commandName Example Comment"}
                        xe ($maml + "para") {}
                        xe ($maml + "para") {}
                        xe ($maml + "para") {}
                        xe ($maml + "para") {}
                    }
                    xe ($command + "commandLines") {
                        xe ($command + "commandLine") {
                            xe ($command + "commandText") {}
                        }
                    }
                }
            }   
            xe ($maml + "relatedLinks") {
                xe ($maml + "navigationLink") {
		    xe ($maml + "linkText") {"$commandName"}
		    xe ($maml + "uri") {}
                }
            }
        }
    }
