public void Generate(Schema schema, bool isValue)
{
if (m_writtenSchemas.Contains(schema))
return;
m_writtenSchemas.Add(schema);
using (StreamWriter output = new StreamWriter(Path.Combine(m_outputDirectory, string.Format("{0}{1}.md", schema.Name, isValue ? "Value" : ""))))
{
output.WriteLine("This page describes the possible content of a CZML document or stream. Please read [[CZML Structure]] for an explanation of how a CZML document is put together.");
output.WriteLine();
output.WriteLine("#{0}{1}", schema.Name, isValue ? " (value)" : "");
output.WriteLine();
output.WriteLine(schema.Description);
output.WriteLine();
if (!string.IsNullOrWhiteSpace(schema.ExtensionPrefix))
{
output.WriteLine("_Note: This type is an extension and may not be implemented by all CZML clients._");
output.WriteLine();
}
if (schema.Extends != null)
{
output.WriteLine("**Extends**: [[{0}]]", schema.Extends.Name);
output.WriteLine();
Generate(schema.Extends);
}
if (isValue)
{
output.WriteLine("**Type**: {0}", JsonSchemaTypesToLabel(schema.JsonTypes));
output.WriteLine();
}
else
{
output.WriteLine("**Interpolatable**: {0}", schema.IsInterpolatable ? "yes" : "no");
output.WriteLine();
}
if (schema.Examples != null)
{
output.WriteLine("**Examples**:");
output.WriteLine();
foreach (string example in schema.Examples)
{
output.WriteLine("```javascript");
output.WriteLine(example);
output.WriteLine("```");
output.WriteLine();
}
}
if (schema.EnumValues.Any())
{
output.WriteLine("##Values");
output.WriteLine();
foreach (SchemaEnumValue enumValue in schema.EnumValues)
{
output.WriteLine("* `{0}` - {1}", enumValue.Name, enumValue.Description);
output.WriteLine();
}
}
if (schema.Properties.Count > 0)
{
output.WriteLine("##Properties");
output.WriteLine();
foreach (Property property in schema.Properties)
{
Schema propertyValueType = property.ValueType;
string type =
propertyValueType.IsSchemaFromType
? JsonSchemaTypesToLabel(property.ValueType.JsonTypes)
: string.Format("[[{0}{1}]]", propertyValueType.Name, property.IsValue ? "Value" : "");
output.WriteLine("**{0}** - {1}", property.Name, type);
output.WriteLine();
output.WriteLine(property.Description);
output.WriteLine();
JToken defaultToken = property.Default;
if (defaultToken != null)
{
string defaultValue;
if (defaultToken.Type == JTokenType.Boolean)
defaultValue = defaultToken.Value<bool>() ? "true" : "false";
else if (defaultToken.Type == JTokenType.Float)
defaultValue = defaultToken.Value<double>().ToString("0.0###############", CultureInfo.InvariantCulture);
else
defaultValue = defaultToken.Value<string>();
output.WriteLine("Default: `{0}`", defaultValue);
output.WriteLine();
}
if (property.Examples != null)
{
output.WriteLine("**Examples**:");
output.WriteLine();
foreach (string example in property.Examples)
{
output.WriteLine("```javascript");
output.WriteLine(example);
output.WriteLine("```");
output.WriteLine();
}
}
output.WriteLine();
if (!propertyValueType.IsSchemaFromType)
{
Generate(propertyValueType, property.IsValue);
}
}
}
if (schema.AdditionalProperties != null)
{
var propertyValueType = schema.AdditionalProperties.ValueType;
output.WriteLine("This type represents a key-value mapping, where values are of type [[{0}]].", propertyValueType.Name);
output.WriteLine();
Generate(propertyValueType);
}
}
}