blob: 77a73e359ce26253797e429dcd756f65b413c158 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
using System;
using System.IO;
using System.Linq;
using System.Text;
namespace JavaDocToMarkdownConverter.Formatters
{
public class DemoCodeFormatter
{
public static void ProcessDemoFiles(ConvertedDocument convertedDoc)
{
//custom processor for processing the Demo *.cs files so that when the docs build the csharp is visible directly in the docs without requiring
//to navigate to the GitHub source. This is done by extracting just the code part of the *.cs files and creating docfx override files for those
//classes.
var demoCsFolder = convertedDoc.OutputFile.Directory;
var apiDocsFolder = Path.Combine(demoCsFolder.Parent.Parent.FullName, "websites\\apidocs");
if (!Directory.Exists(apiDocsFolder))
throw new InvalidOperationException($"The folder {apiDocsFolder} does not exist");
var apiSpecFolder = Path.Combine(apiDocsFolder, "apiSpec");
Directory.CreateDirectory(apiSpecFolder);
foreach (var folder in demoCsFolder.EnumerateDirectories().Where(x => x.Name != "Properties" && x.Name != "obj" && x.Name != "bin"))
{
foreach (var file in folder.EnumerateFiles("*.cs"))
{
var code = CodeExtractor.ExtractCode(file);
var ns = CodeExtractor.ExtractNamespace(code);
var c = CodeExtractor.ExtractClassName(code);
var type = $"{ns}.{c}";
//naming is based on a docfx convention - not a strict convention but we might as well be consistent
var overrideFileName = $"{ns.Replace(".", "_")}_{c}.md";
File.WriteAllText(Path.Combine(apiSpecFolder, overrideFileName), AppendYamlHeader(type, code));
}
}
}
private static string AppendYamlHeader(string typeName, string fileContent)
{
var sb = new StringBuilder();
sb.AppendLine("---");
sb.Append("uid: ");
sb.AppendLine(typeName);
// This is special syntax to denote an 'array' of strings since that is what the 'example' metadata requires,
// see:https://dotnet.github.io/docfx/tutorial/intro_overwrite_files.html#managed-reference-model
// This syntax doesn't seem to be documented anywhere except in the issue tracker
// see https://github.com/dotnet/docfx/issues/375#issuecomment-225407949
// see https://github.com/dotnet/docfx/issues/1685#issuecomment-303644744
sb.AppendLine("example: [*content]");
//sb.Append("summary: ");
//sb.AppendLine(summary);
sb.AppendLine("---");
sb.AppendLine();
sb.AppendLine("```");
sb.AppendLine(fileContent);
sb.AppendLine("```");
return sb.ToString();
}
}
}