From fa156782621683cc0522455a2376e81031cccb1b Mon Sep 17 00:00:00 2001 From: GustavoAmerico Date: Fri, 29 Dec 2017 02:51:52 -0200 Subject: [PATCH 1/8] =?UTF-8?q?Fazendo=20o=20bot=C3=A3o=20de=20criar=20mar?= =?UTF-8?q?kdown=20aparecer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MarkdownDocNet.sln | 13 +- MarkdownVsix/GenerateMarkdown.cs | 128 ++++++++++++ MarkdownVsix/GenerateMarkdownPackage.cs | 75 +++++++ MarkdownVsix/GenerateMarkdownPackage.vsct | 72 +++++++ MarkdownVsix/Key.snk | Bin 0 -> 596 bytes MarkdownVsix/MarkdownVsix.csproj | 195 ++++++++++++++++++ MarkdownVsix/Properties/AssemblyInfo.cs | 33 +++ MarkdownVsix/Resources/GenerateMarkdown.png | Bin 0 -> 1172 bytes .../Resources/GenerateMarkdownPackage.ico | Bin 0 -> 428446 bytes MarkdownVsix/VSPackage.resx | 140 +++++++++++++ MarkdownVsix/app.config | 15 ++ MarkdownVsix/index.html | 65 ++++++ MarkdownVsix/packages.config | 21 ++ MarkdownVsix/source.extension.vsixmanifest | 21 ++ MarkdownVsix/stylesheet.css | 129 ++++++++++++ 15 files changed, 905 insertions(+), 2 deletions(-) create mode 100644 MarkdownVsix/GenerateMarkdown.cs create mode 100644 MarkdownVsix/GenerateMarkdownPackage.cs create mode 100644 MarkdownVsix/GenerateMarkdownPackage.vsct create mode 100644 MarkdownVsix/Key.snk create mode 100644 MarkdownVsix/MarkdownVsix.csproj create mode 100644 MarkdownVsix/Properties/AssemblyInfo.cs create mode 100644 MarkdownVsix/Resources/GenerateMarkdown.png create mode 100644 MarkdownVsix/Resources/GenerateMarkdownPackage.ico create mode 100644 MarkdownVsix/VSPackage.resx create mode 100644 MarkdownVsix/app.config create mode 100644 MarkdownVsix/index.html create mode 100644 MarkdownVsix/packages.config create mode 100644 MarkdownVsix/source.extension.vsixmanifest create mode 100644 MarkdownVsix/stylesheet.css diff --git a/MarkdownDocNet.sln b/MarkdownDocNet.sln index 7c03637..195332d 100644 --- a/MarkdownDocNet.sln +++ b/MarkdownDocNet.sln @@ -1,10 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownDocNet", "MarkdownDocNet\MarkdownDocNet.csproj", "{177B50B5-4561-443B-BAFD-A3AB19519324}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownVsix", "MarkdownVsix\MarkdownVsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,8 +17,15 @@ Global {177B50B5-4561-443B-BAFD-A3AB19519324}.Debug|Any CPU.Build.0 = Debug|Any CPU {177B50B5-4561-443B-BAFD-A3AB19519324}.Release|Any CPU.ActiveCfg = Release|Any CPU {177B50B5-4561-443B-BAFD-A3AB19519324}.Release|Any CPU.Build.0 = Release|Any CPU + {3CF8B458-7D40-4207-9F76-3AAADCEA8344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CF8B458-7D40-4207-9F76-3AAADCEA8344}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CF8B458-7D40-4207-9F76-3AAADCEA8344}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CF8B458-7D40-4207-9F76-3AAADCEA8344}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6C8DE249-EF2B-4C6E-A329-6794BB52C856} + EndGlobalSection EndGlobal diff --git a/MarkdownVsix/GenerateMarkdown.cs b/MarkdownVsix/GenerateMarkdown.cs new file mode 100644 index 0000000..1d11aeb --- /dev/null +++ b/MarkdownVsix/GenerateMarkdown.cs @@ -0,0 +1,128 @@ +using System; +using System.ComponentModel.Design; +using System.Globalization; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; + +namespace MarkdownVsix +{ + /// + /// Command handler + /// + internal sealed class GenerateMarkdown + { + /// + /// Command ID. + /// + public const int CommandId = 0x0100; + + /// + /// Command menu group (command set GUID). + /// + public static readonly Guid CommandSet = new Guid("5813e236-e447-4319-a996-d3a2c1dacaf6"); + + public static readonly Guid SymbolGenDocSolutionNode = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14683"); + public static readonly Guid SymbolGenDocSolutionFolderGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14684"); + public static readonly Guid SymbolGenDocProjectNodeGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14685"); + + + /// + /// VS Package that provides this command, not null. + /// + private readonly Package package; + + /// + /// Initializes a new instance of the class. + /// Adds our command handlers for menu (commands must exist in the command table file) + /// + /// Owner package, not null. + private GenerateMarkdown(Package package) + { + this.package = package ?? throw new ArgumentNullException("package"); + + if (this.ServiceProvider.GetService(typeof(IMenuCommandService)) is OleMenuCommandService commandService) + { + var SymbolGenDocSolutionNodeCommandID = new CommandID(SymbolGenDocSolutionNode, 0x1050); + var solutionmenuItem = new MenuCommand(this.GenerateMarkdownForSolutions, SymbolGenDocSolutionNodeCommandID); + commandService.AddCommand(solutionmenuItem); + + var SymbolGenDocSolutionFolderGroupCommandID = new CommandID(SymbolGenDocSolutionFolderGroup, 0x1051); + var foldermenuItem = new MenuCommand(this.GenerateMarkdownForSolutions, SymbolGenDocSolutionFolderGroupCommandID); + commandService.AddCommand(foldermenuItem); + + var SymbolGenDocProjectNodeGroupCommandID = new CommandID(SymbolGenDocProjectNodeGroup, 0x1052); + var projectmenuItem = new MenuCommand(this.GenerateMarkdownForSolutions, SymbolGenDocProjectNodeGroupCommandID); + commandService.AddCommand(projectmenuItem); + } + } + + /// + /// Gets the instance of the command. + /// + public static GenerateMarkdown Instance + { + get; + private set; + } + + /// + /// Gets the service provider from the owner package. + /// + private IServiceProvider ServiceProvider + { + get + { + return this.package; + } + } + + /// + /// Initializes the singleton instance of the command. + /// + /// Owner package, not null. + public static void Initialize(Package package) + { + Instance = new GenerateMarkdown(package); + } + + /// + /// This function is the callback used to execute the command when the menu item is clicked. + /// See the constructor to see how the menu item is associated with this function using + /// OleMenuCommandService service and MenuCommand class. + /// + /// Event sender. + /// Event args. + private void MenuItemCallback(string message) + { + + string title = "GenerateMarkdown"; + + // Show a message box to prove we were here + VsShellUtilities.ShowMessageBox( + this.ServiceProvider, + message, + title, + OLEMSGICON.OLEMSGICON_INFO, + OLEMSGBUTTON.OLEMSGBUTTON_OK, + OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); + } + + private void GenerateMarkdownForProject(object sender, EventArgs e) + { + MenuItemCallback("Create Markdown for project"); + Console.WriteLine("Create Markdown for project"); + } + + private void GenerateMarkdownForSolutions(object sender, EventArgs e) + { + MenuItemCallback("Create Markdown for solutions"); + Console.WriteLine("Create Markdown for Solutions"); + } + + private void GenerateMarkdownForFolders(object sender, EventArgs e) + { + MenuItemCallback("Create Markdown for folders"); + Console.WriteLine("Create Markdown for Folders"); + } + } +} diff --git a/MarkdownVsix/GenerateMarkdownPackage.cs b/MarkdownVsix/GenerateMarkdownPackage.cs new file mode 100644 index 0000000..a6165bd --- /dev/null +++ b/MarkdownVsix/GenerateMarkdownPackage.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.InteropServices; +using Microsoft.VisualStudio; +using Microsoft.VisualStudio.OLE.Interop; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; +using Microsoft.Win32; + +namespace MarkdownVsix +{ + /// + /// This is the class that implements the package exposed by this assembly. + /// + /// + /// + /// The minimum requirement for a class to be considered a valid package for Visual Studio + /// is to implement the IVsPackage interface and register itself with the shell. + /// This package uses the helper classes defined inside the Managed Package Framework (MPF) + /// to do it: it derives from the Package class that provides the implementation of the + /// IVsPackage interface and uses the registration attributes defined in the framework to + /// register itself and its components with the shell. These attributes tell the pkgdef creation + /// utility what data to put into .pkgdef file. + /// + /// + /// To get loaded into VS, the package must be referred by <Asset Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file. + /// + /// + [PackageRegistration(UseManagedResourcesOnly = true)] + [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] + [ProvideMenuResource("Menus.ctmenu", 1)] + [Guid(GenerateMarkdownPackage.PackageGuidString)] + [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] + [ProvideBindingPath] + //[ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. + + [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] + public sealed class GenerateMarkdownPackage : Package + { + /// + /// GenerateMarkdownPackage GUID string. + /// + public const string PackageGuidString = "1d883cd3-1fac-497e-b56d-097a8ba0a09f"; + + /// + /// Initializes a new instance of the class. + /// + public GenerateMarkdownPackage() + { + // Inside this method you can place any initialization code that does not require + // any Visual Studio service because at this point the package object is created but + // not sited yet inside Visual Studio environment. The place to do all the other + // initialization is the Initialize method. + } + + + #region Package Members + + /// + /// Initialization of the package; this method is called right after the package is sited, so this is the place + /// where you can put all the initialization code that rely on services provided by VisualStudio. + /// + protected override void Initialize() + { + GenerateMarkdown.Initialize(this); + base.Initialize(); + } + + #endregion + } +} diff --git a/MarkdownVsix/GenerateMarkdownPackage.vsct b/MarkdownVsix/GenerateMarkdownPackage.vsct new file mode 100644 index 0000000..4a9af9d --- /dev/null +++ b/MarkdownVsix/GenerateMarkdownPackage.vsct @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MarkdownVsix/Key.snk b/MarkdownVsix/Key.snk new file mode 100644 index 0000000000000000000000000000000000000000..4227ea1e7fe80ff6b58fa80faf56467e85004ab0 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096IEZIat?UGanv|)^KQamt;5Cd?Gxlz346ZyXpO+D zqzNE-WFw>LUK9w24&A>TS$W-Y3Yj+rvSCVd^|5y{G>};z{0i#ug3$4=T?rGxcg&Y@ zs2`Jdef?+9(DcnS8l13R`gjMny!5CXb}{&!pB|(&oB-z98kJyZR{tQC_@4o)=RAlp z2J}sz_dPVid*Sg1Lu#;xDiZ<;(^l`-ZaKhaOj#bHxhn#u!!^FRkEYAF9@?*L(;KD9 z%atVefR1>&%=1RzX%(_fk|5x79RW<}b`^r`*xhGu5%e1e5DDH7^NT<2dxogU(9pyB zfWewT=p@7iBinRSF{OLvCHB84VT*qG)bM1Sgy%?ng*AB1;8BKbdq1wDB=tZ&Frydc z>93R;C=Z4whg-;`-L4n^9q6;^B{RJ9Vh_DZVO41`u}4w&rLLw+0Nfy%ZG&P1hP!0Y zG4T*5-y`&7iqxyDYzx1^F4za#?`i0SYAB + + + + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + true + + + true + + + Key.snk + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {3CF8B458-7D40-4207-9F76-3AAADCEA8344} + Library + Properties + MarkdownVsix + MarkdownVsix + v4.7 + true + true + true + true + true + false + Program + $(DevEnvDir)devenv.exe + /rootsuffix Exp + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Designer + + + + + Menus.ctmenu + + + + + + + + + False + + + False + + + False + + + False + + + + False + + + ..\packages\Microsoft.VisualStudio.CoreUtility.15.0.26201\lib\net45\Microsoft.VisualStudio.CoreUtility.dll + True + + + ..\packages\Microsoft.VisualStudio.Imaging.15.0.26201\lib\net45\Microsoft.VisualStudio.Imaging.dll + True + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6071\lib\Microsoft.VisualStudio.OLE.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.15.0.15.0.26201\lib\Microsoft.VisualStudio.Shell.15.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Framework.15.0.26201\lib\net45\Microsoft.VisualStudio.Shell.Framework.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Threading.15.0.240\lib\net45\Microsoft.VisualStudio.Threading.dll + + + ..\packages\Microsoft.VisualStudio.Utilities.15.0.26201\lib\net45\Microsoft.VisualStudio.Utilities.dll + True + + + ..\packages\Microsoft.VisualStudio.Validation.15.0.82\lib\net45\Microsoft.VisualStudio.Validation.dll + + + False + + + + + + + + + + + true + VSPackage + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + \ No newline at end of file diff --git a/MarkdownVsix/Properties/AssemblyInfo.cs b/MarkdownVsix/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7c45384 --- /dev/null +++ b/MarkdownVsix/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MarkdownVsix")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MarkdownVsix")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MarkdownVsix/Resources/GenerateMarkdown.png b/MarkdownVsix/Resources/GenerateMarkdown.png new file mode 100644 index 0000000000000000000000000000000000000000..b22d975cbf00eda60e37587614e0677d0bfb525d GIT binary patch literal 1172 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

N3mPu2mM3; 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + GenerateMarkdown Extension + + + GenerateMarkdown Visual Studio Extension Detailed Info + + + Resources\GenerateMarkdownPackage.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/MarkdownVsix/app.config b/MarkdownVsix/app.config new file mode 100644 index 0000000..cc8e053 --- /dev/null +++ b/MarkdownVsix/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MarkdownVsix/index.html b/MarkdownVsix/index.html new file mode 100644 index 0000000..1fee824 --- /dev/null +++ b/MarkdownVsix/index.html @@ -0,0 +1,65 @@ + + + + + + + + Getting Started + + + +

+ + +
+
+

Creating a Visual Studio Extension

+ +

This project enables developers to create an extension for Visual Studio. The solution contains a VSIX project that packages the extension into a VSIX file. This file is used to install an extension for Visual Studio.

+

Add new features

+ +
    +
  1. Right-click the project node in Solution Explorer and select Add>New Item.
  2. +
  3. In the Add New Item dialog box, expand the Extensibility node under Visual C# or Visual Basic.
  4. +
  5. Choose from the available item templates: Visual Studio Package, Editor Items (Classifier, Margin, Text Adornment, Viewport Adornment), Command, Tool Window, Toolbox Control, and then click Add.
  6. +
+ +

The files for the template that you selected are added to the project. You can start adding functionality to your item template, press F5 to run the project, or add additional item templates.

+ +

Run and debug

+

To run the project, press F5. Visual Studio will:

+ +
    +
  • Build the extension from the VSIX project.
  • +
  • Create a VSIX package from the VSIX project.
  • +
  • When debugging, start an experimental instance of Visual Studio with the VSIX package installed.
  • +
+ +

In the experimental instance of Visual Studio you can test out the functionality of your extension without affecting your Visual Studio installation.

+ +
+
+
+

Visual Studio Extensibility Resources

+ +
    +
  1. Visual Studio documentation
    Detailed documentation and API reference material for building extensions.
  2. +
  3. Extension samples on GitHub
    Use a sample project to kickstart your development.
  4. +
  5. Extensibility chat room on Gitter
    Meet other extension developers and exchange tips and tricks for extension development.
  6. +
  7. Channel 9 videos on extensibility
    Watch videos from the product team on Visual Studio extensibility.
  8. +
  9. Extensibility Tools
    Install an optional helper tool that adds extra IDE support for extension authors.
  10. +
+

Give us feedback

+ +
+
+
+
+ + diff --git a/MarkdownVsix/packages.config b/MarkdownVsix/packages.config new file mode 100644 index 0000000..8a596b1 --- /dev/null +++ b/MarkdownVsix/packages.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MarkdownVsix/source.extension.vsixmanifest b/MarkdownVsix/source.extension.vsixmanifest new file mode 100644 index 0000000..73fc1a1 --- /dev/null +++ b/MarkdownVsix/source.extension.vsixmanifest @@ -0,0 +1,21 @@ + + + + + MarkdownVsix + Empty VSIX Project. + + + + + + + + + + + + + + + diff --git a/MarkdownVsix/stylesheet.css b/MarkdownVsix/stylesheet.css new file mode 100644 index 0000000..d5e9c71 --- /dev/null +++ b/MarkdownVsix/stylesheet.css @@ -0,0 +1,129 @@ +body { + margin: 0; + padding: 0; + border: 0; + color: #1E1E1E; + font-size: 13px; + font-family: "Segoe UI", Helvetica, Arial, sans-serif; + line-height: 1.45; + word-wrap: break-word; +} + +/* General & 'Reset' Stuff */ + + +.container { + width: 980px; + margin: 0 auto; +} + +section { + display: block; + margin: 0; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +/* Header,
+ header - container + h1 - project name + h2 - project description +*/ + +#header { + color: #FFF; + background: #68217a; + position:relative; +} +#hangcloud { + width: 190px; + height: 160px; + background: url("../images/bannerart03.png"); + position: absolute; + top: 0; + right: -30px; +} +h1, h2 { + font-family: "Segoe UI Light", "Segoe UI", Helvetica, Arial, sans-serif; + line-height: 1; + margin: 0 18px; + padding: 0; +} +#header h1 { + font-size: 3.4em; + padding-top: 18px; + font-weight: normal; + margin-left: 15px; +} + +#header h2 { + font-size: 1.5em; + margin-top: 10px; + padding-bottom: 18px; + font-weight: normal; +} + + +#main_content { + width: 100%; + display: flex; + flex-direction: row; +} + + +h1, h2, h3, h4, h5, h6 { + font-weight: bolder; +} + +#main_content h1 { + font-size: 1.8em; + margin-top: 34px; +} + + #main_content h1:first-child { + margin-top: 30px; + } + +#main_content h2 { + font-size: 1.4em; + font-weight: bold; +} +p, ul { + margin: 11px 18px; +} + +#main_content a { + color: #06C; + text-decoration: none; +} +ul { + margin-top: 13px; + margin-left: 18px; + padding-left: 0; +} + ul li { + margin-left: 18px; + padding-left: 0; + } +#lpanel { + width: 620px; + float: left; +} +#rpanel ul { + list-style-type: none; + width: 300px; +} + #rpanel ul li { + line-height: 1.8em; + } +#rpanel { + background: #e7e7e7; + width: 360px; + float: right; +} + +#rpanel div { + width: 300px; +} From c095fb3a5638340c56adb89475cb694c813555d7 Mon Sep 17 00:00:00 2001 From: GustavoAmerico Date: Fri, 5 Jan 2018 02:34:30 -0200 Subject: [PATCH 2/8] =?UTF-8?q?Segregando=20fun=C3=A7=C3=B5es=20de=20forma?= =?UTF-8?q?ta=C3=A7=C3=A3o=20do=20markdown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MarkdownDocNet.sln | 2 +- MarkdownDocNet/MarkdownDocNet.csproj | 5 +- MarkdownDocNet/Properties/AssemblyInfo.cs | 1 - MarkdownVsix/ActiveDocumentRestorer.cs | 56 +++ MarkdownVsix/Commands/BaseCommand.cs | 59 +++ MarkdownVsix/Commands/Constants.cs | 25 ++ .../Commands/CreateMarkdownProjectCommand.cs | 69 ++++ MarkdownVsix/Format/DocFormat.cs | 33 ++ MarkdownVsix/Format/DocParser.cs | 384 ++++++++++++++++++ MarkdownVsix/Format/Markdown/MarkdownParse.cs | 361 ++++++++++++++++ MarkdownVsix/Format/Markdown/MemberDoc.cs | 52 +++ MarkdownVsix/Format/Markdown/MemberType.cs | 13 + MarkdownVsix/Format/ProjectFile.cs | 67 +++ MarkdownVsix/GenerateMarkdown.cs | 107 ++--- MarkdownVsix/GenerateMarkdownPackage.cs | 112 +++-- MarkdownVsix/GenerateMarkdownPackage.vsct | 3 +- MarkdownVsix/Properties/AssemblyInfo.cs | 22 +- MarkdownVsix/SolutionHelper.cs | 135 ++++++ MarkdownVsix/UIHierarchyHelper.cs | 55 +++ ...VisualStudio.DocumentGenerate.Vsix.csproj} | 20 +- MarkdownVsix/app.config | 9 +- MarkdownVsix/index.html | 3 +- MarkdownVsix/stylesheet.css | 5 +- .../Properties/Resources.Designer.cs | 63 +++ .../Properties/Resources.resx | 101 +++++ .../VSDocument.Format.Markdown.csproj | 38 ++ 26 files changed, 1677 insertions(+), 123 deletions(-) create mode 100644 MarkdownVsix/ActiveDocumentRestorer.cs create mode 100644 MarkdownVsix/Commands/BaseCommand.cs create mode 100644 MarkdownVsix/Commands/Constants.cs create mode 100644 MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs create mode 100644 MarkdownVsix/Format/DocFormat.cs create mode 100644 MarkdownVsix/Format/DocParser.cs create mode 100644 MarkdownVsix/Format/Markdown/MarkdownParse.cs create mode 100644 MarkdownVsix/Format/Markdown/MemberDoc.cs create mode 100644 MarkdownVsix/Format/Markdown/MemberType.cs create mode 100644 MarkdownVsix/Format/ProjectFile.cs create mode 100644 MarkdownVsix/SolutionHelper.cs create mode 100644 MarkdownVsix/UIHierarchyHelper.cs rename MarkdownVsix/{MarkdownVsix.csproj => VisualStudio.DocumentGenerate.Vsix.csproj} (93%) create mode 100644 VSDocument.Format.Markdown/Properties/Resources.Designer.cs create mode 100644 VSDocument.Format.Markdown/Properties/Resources.resx create mode 100644 VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj diff --git a/MarkdownDocNet.sln b/MarkdownDocNet.sln index 195332d..d79297d 100644 --- a/MarkdownDocNet.sln +++ b/MarkdownDocNet.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownDocNet", "MarkdownDocNet\MarkdownDocNet.csproj", "{177B50B5-4561-443B-BAFD-A3AB19519324}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownVsix", "MarkdownVsix\MarkdownVsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualStudio.DocumentGenerate.Vsix", "MarkdownVsix\VisualStudio.DocumentGenerate.Vsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/MarkdownDocNet/MarkdownDocNet.csproj b/MarkdownDocNet/MarkdownDocNet.csproj index b077b98..080aab3 100644 --- a/MarkdownDocNet/MarkdownDocNet.csproj +++ b/MarkdownDocNet/MarkdownDocNet.csproj @@ -5,7 +5,7 @@ Debug AnyCPU {177B50B5-4561-443B-BAFD-A3AB19519324} - Exe + Library Properties MarkdownDocNet MarkdownDocNet @@ -33,6 +33,9 @@ prompt 4 + + + diff --git a/MarkdownDocNet/Properties/AssemblyInfo.cs b/MarkdownDocNet/Properties/AssemblyInfo.cs index 1cab02f..16e765d 100644 --- a/MarkdownDocNet/Properties/AssemblyInfo.cs +++ b/MarkdownDocNet/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/MarkdownVsix/ActiveDocumentRestorer.cs b/MarkdownVsix/ActiveDocumentRestorer.cs new file mode 100644 index 0000000..03c9240 --- /dev/null +++ b/MarkdownVsix/ActiveDocumentRestorer.cs @@ -0,0 +1,56 @@ +using EnvDTE; +using System; + +namespace MarkdownVsix +{ + /// + /// A class that handles tracking a document and switching back to it, typically in a using + /// statement context. + /// + internal class ActiveDocumentRestorer : IDisposable + { + #region Constructors + + /// Initializes a new instance of the class. + /// The hosting package. + internal ActiveDocumentRestorer(GenerateMarkdownPackage package) + { + Package = package; + + StartTracking(); + } + + #endregion Constructors + + /// Gets or sets the hosting package. + private GenerateMarkdownPackage Package { get; set; } + + /// Gets or sets the active document. + private Document TrackedDocument { get; set; } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting + /// unmanaged resources. + /// + public void Dispose() + { + RestoreTrackedDocument(); + } + + /// Restores the tracked document if not already active. + internal void RestoreTrackedDocument() + { + if (TrackedDocument != null && Package.ActiveDocument != TrackedDocument) + { + TrackedDocument.Activate(); + } + } + + /// Starts tracking the active document. + internal void StartTracking() + { + // Cache the active document. + TrackedDocument = Package.ActiveDocument; + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Commands/BaseCommand.cs b/MarkdownVsix/Commands/BaseCommand.cs new file mode 100644 index 0000000..fbfd802 --- /dev/null +++ b/MarkdownVsix/Commands/BaseCommand.cs @@ -0,0 +1,59 @@ +using System; +using System.ComponentModel.Design; +using Microsoft.VisualStudio.Shell; + +namespace MarkdownVsix +{ + /// The base implementation of a command. + internal abstract class BaseCommand : OleMenuCommand + { + /// Gets the hosting package. + protected GenerateMarkdownPackage Package { get; private set; } + + /// Initializes a new instance of the class. + /// The hosting package. + /// The id for the command. + protected BaseCommand(GenerateMarkdownPackage package, CommandID id) + : base(BaseCommand_Execute, id) + { + Package = package; + + BeforeQueryStatus += BaseCommand_BeforeQueryStatus; + } + + /// Called to update the current status of the command. + protected virtual void OnBeforeQueryStatus() + { + // By default, commands are always enabled. + Enabled = true; + } + + /// Called to execute the command. + protected virtual void OnExecute() + { + //OutputWindowHelper.DiagnosticWriteLine($"{GetType().Name}.OnExecute invoked"); + } + + /// Handles the BeforeQueryStatus event of the BaseCommand control. + /// The source of the event. + /// + /// The instance containing the event data. + /// + private static void BaseCommand_BeforeQueryStatus(object sender, EventArgs e) + { + BaseCommand command = sender as BaseCommand; + command?.OnBeforeQueryStatus(); + } + + /// Handles the Execute event of the BaseCommand control. + /// The source of the event. + /// + /// The instance containing the event data. + /// + private static void BaseCommand_Execute(object sender, EventArgs e) + { + BaseCommand command = sender as BaseCommand; + command?.OnExecute(); + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Commands/Constants.cs b/MarkdownVsix/Commands/Constants.cs new file mode 100644 index 0000000..20e6ba7 --- /dev/null +++ b/MarkdownVsix/Commands/Constants.cs @@ -0,0 +1,25 @@ +using System; + +namespace MarkdownVsix +{ + public class Constants + { + public const string DocExtension = ".xml"; + + /// Caminho do diretório dos arquivos + public const string ProjectDocPath = "AutoDocs"; + + public static class PackageGuids + { + public const string PackageGuidString = ("d69f1580-274f-4d12-b13a-c365c759de66"); + + public readonly static Guid SymbolGenDocProjectNodeGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14686"); + } + + /// Helper class that exposes all GUIDs used across VS Package. + public sealed partial class PackageIds + { + public const int CmdIDSymbolGenDocProjectNodeGroup = 0x1052; + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs b/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs new file mode 100644 index 0000000..33c86b8 --- /dev/null +++ b/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs @@ -0,0 +1,69 @@ +using EnvDTE; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.IO; +using System.Linq; +using VisualStudio.DocumentGenerate.Vsix.Format.Markdown; +using VSDocument.Format.Markdown; + +namespace MarkdownVsix +{ + + /// A command that provides for cleaning up code in the selected documents. + internal class CreateMarkdownProjectCommand : BaseCommand + { + /// Gets the list of selected project items. + private IEnumerable SelectedProjectItems + { + get + { + return SolutionHelper.GetSelectedProjectItemsRecursively(Package); + } + } + + /// + /// Initializes a new instance of the class. + /// + /// The hosting package. + internal CreateMarkdownProjectCommand(GenerateMarkdownPackage package) + : base(package, new CommandID(Constants.PackageGuids.SymbolGenDocProjectNodeGroup, Constants.PackageIds.CmdIDSymbolGenDocProjectNodeGroup)) + { + } + + /// Called to update the current status of the command. + protected override void OnBeforeQueryStatus() + { + Enabled = Package.IDE.Solution.IsOpen; + } + + /// Called to execute the command. + protected override void OnExecute() + { + base.OnExecute(); + Package.IDE.Solution.SolutionBuild.Clean(true); + Package.IDE.Solution.SolutionBuild.Build(true); + var solutionDirectory = Path.GetDirectoryName(Package.IDE.Solution.FullName); + solutionDirectory = Path.Combine(solutionDirectory, Constants.ProjectDocPath); + + + using (var document = new ActiveDocumentRestorer(Package)) + { + const string documentationFile = "DocumentationFile"; + + var projects = SelectedProjectItems + .Where(a => a.ContainingProject != null && !Equals(a.ContainingProject.Properties?.Item(documentationFile), null)) + .Select(a => new ProjectFile(a.ContainingProject)) + .Distinct() + .ToArray(); + + + foreach (var project in projects) + { + var parser = new MarkdownParse(project.DocFile, project.AssemblyFile, solutionDirectory); + parser.ParseXml(); + parser.GenerateDoc(); + } + } + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Format/DocFormat.cs b/MarkdownVsix/Format/DocFormat.cs new file mode 100644 index 0000000..6fd882b --- /dev/null +++ b/MarkdownVsix/Format/DocFormat.cs @@ -0,0 +1,33 @@ +using System; +using System.Reflection; +using System.Text; + +namespace VSDocument.Format.Markdown +{ + public abstract class DocFormat + { + + protected virtual void WriteInfo(MethodInfo[] methods, StringBuilder output) { } + + protected virtual void WriteInfo(PropertyInfo[] properties, StringBuilder output) { } + + protected virtual void WriteInfo(FieldInfo[] fields, StringBuilder output) { } + + protected virtual void WriteInfo(EventInfo[] events, StringBuilder output) { } + + + protected virtual void WriteInfo(ConstructorInfo[] events, StringBuilder output) { } + + protected virtual void WriteInfo(Type type, StringBuilder output) { } + + protected virtual void WriteStatic(FieldInfo[] staticFields, StringBuilder output) { } + + protected virtual void WriteStatic(MethodInfo[] staticMethods, StringBuilder output) { } + + protected virtual void WriteStatic(PropertyInfo[] staticProperties, StringBuilder output) { } + + + + } + +} \ No newline at end of file diff --git a/MarkdownVsix/Format/DocParser.cs b/MarkdownVsix/Format/DocParser.cs new file mode 100644 index 0000000..9fac09c --- /dev/null +++ b/MarkdownVsix/Format/DocParser.cs @@ -0,0 +1,384 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Xml; +using System.Xml.Linq; + +namespace VSDocument.Format.Markdown +{ + public class DocParser : DocFormat, IDisposable + { + protected static HashSet ignoredNamespaces = new HashSet + { + "System", + "System.Collections.Generic", + "System.Text", + "System.IO" + }; + + protected static Dictionary primitiveNames = new Dictionary + { + {typeof(byte), "byte"}, + {typeof(sbyte), "sbyte"}, + {typeof(short), "short"}, + {typeof(ushort), "ushort"}, + {typeof(int), "int"}, + {typeof(uint), "uint"}, + {typeof(long), "long"}, + {typeof(ulong), "ulong"}, + {typeof(char), "char"}, + {typeof(float), "float"}, + {typeof(double), "double"}, + {typeof(decimal), "decimal"}, + {typeof(bool), "bool"}, + {typeof(object), "object"}, + {typeof(string), "string"}, + }; + + protected Dictionary MemberDocumentations = new Dictionary(); + private Assembly AssemblyInfo; + private bool disposedValue = false; + private XDocument Doc; + protected string OutputPath { get; private set; } + + public DocParser(string docFile, string assemblyFile, string outputFile) + { + Doc = XDocument.Load(docFile, LoadOptions.SetLineInfo); + AssemblyInfo = Assembly.LoadFile(assemblyFile); + OutputPath = outputFile; + } + + public static string CommonNamespacePrefix(string fullName1, string fullName2) + { + var elements1 = fullName1.Split('.'); + var elements2 = fullName2.Split('.'); + + var potentialMatchLength = Math.Min(elements1.Length, elements2.Length); + + var output = new StringBuilder(); + bool first = true; + + for (var i = 0; i < potentialMatchLength; i++) + { + if (elements1[i].Equals(elements2[i])) + { + if (!first) + output.Append("."); + first = false; + + output.Append(elements1[i]); + } + else + break; + } + + return output.ToString(); + } + + // This code added to correctly implement the disposable pattern. + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + // TODO: uncomment the following line if the finalizer is overridden above. GC.SuppressFinalize(this); + } + + public string FixValueIndentation(XNode node, string text) + { + var lineInfo = (IXmlLineInfo)node.Parent; + var indentationCount = lineInfo.LinePosition - 2; + if (indentationCount > 0) + { + var indentation = "\n" + new String(' ', indentationCount); + text = text.Replace(indentation, "\n"); + } + + return text.Trim(); + } + + public string FullNameFromDescriptor(string descriptor) + { + var descriptorElements = descriptor.Split(':'); + + if (descriptorElements.Length != 2) + throw new InvalidOperationException(String.Format("Invalid name descriptor: '{0}'", descriptor)); + + return descriptorElements[1]; + } + + public void GenerateDoc() + { + var types = AssemblyInfo.GetExportedTypes(); + + var typesSorted = types.OrderByDescending((Type a) => + { + var impA = 0; + if (MemberDocumentations.ContainsKey(a.FullName)) + impA = MemberDocumentations[a.FullName].Importance; + return impA; + }); + + foreach (var type in typesSorted) + { + WriteFile(type); + } + } + + public string HumanNameFromDescriptor(string descriptor, string parentTypeOrNamespace = null) + { + var descriptorElements = descriptor.Split(':'); + + if (descriptorElements.Length != 2 || descriptorElements[0].Length != 1) + throw new InvalidOperationException(String.Format("Invalid name descriptor: '{0}'", descriptor)); + + var memberType = MemberDoc.TypeFromDescriptor(descriptorElements[0][0]); + var fullName = descriptorElements[1]; + + // Cut away any method signatures + var fullNameNoSig = fullName.Split(new char[] { '(' }, 2)[0]; + + if (String.IsNullOrEmpty(parentTypeOrNamespace)) + return fullName; + + var commonPrefix = ""; + var dotIndex = fullNameNoSig.LastIndexOf('.'); + if (dotIndex >= 0) + { + var possiblePrefix = fullNameNoSig.Substring(0, dotIndex); + commonPrefix = CommonNamespacePrefix(possiblePrefix, parentTypeOrNamespace); + } + + //if(memberType == MemberType.Type || memberType == MemberType.Namespace) + return fullNameNoSig.Substring(commonPrefix.Length + 1); + /*else + { + var declaringTypeName = fullNameNoSig.Substring(0, fullNameNoSig.LastIndexOf('.')); + var declaringType = AssemblyInfo.GetType(declaringTypeName); + if(declaringType == null || declaringType.FullName != parentTypeOrNamespace) + return fullNameNoSig.Substring(commonPrefix.Length + 1); + else + { + // So the given descriptor + var memberName = fullName.Substring(commonPrefix.Length + 1); + + // For everything except methods, just return the member name + if (memberType != MemberType.Method) + return memberName; + + // Try to find the exact matching method so we can print the correct signature + var possibleMatches = declaringType.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); + foreach(var match in possibleMatches) + { + var memberId = FullNameFromMember(match); + if (memberId == fullName) + return match.Name + MakeSignature(match, true); + } + + return memberName; + } + } + */ + } + + public string LinkFromDescriptor(string descriptor, string contextMemberName, string linkName = null) + { + var link = FullNameFromDescriptor(descriptor); + + if (linkName == null) + return " [" + HumanNameFromDescriptor(descriptor, contextMemberName) + "](#" + link + ") "; + else + return " [" + linkName + "](#" + link + ") "; + } + + /// + /// Parses the text inside a given XML node and returns a Markdown version of it. + /// + public string ParseDocText(XNode node, string contextMemberName) + { + if (node.NodeType == XmlNodeType.Text) + { + var text = ((XText)node).Value; + return FixValueIndentation(node, text); + } + else if (node.NodeType == XmlNodeType.Element) + { + var element = (XElement)node; + if (element.Name == "see") + { + var descriptor = element.Attribute("cref").Value; + string linkName = null; + if (!String.IsNullOrEmpty(element.Value)) + linkName = element.Value; + return LinkFromDescriptor(descriptor, contextMemberName, linkName); + } + else if (element.Name == "code") + { + var code = FixValueIndentation(element, element.Value); + ParseDocText(element.FirstNode, contextMemberName); + return "\n```csharp\n" + code + "\n```\n"; + } + else + { + var output = new StringBuilder(); + foreach (var child in element.Nodes()) + { + if (child.NodeType == XmlNodeType.Element || child.NodeType == XmlNodeType.Text) + output.Append(ParseDocText(child, contextMemberName)); + } + return output.ToString(); + } + } + else + return ""; + } + + /// + /// Parsed a single member node from the xml documentation and returns the corresponding + /// MemberDoc object. + /// + public MemberDoc ParseMember(XElement member) + { + var memberInfo = new MemberDoc(); + + string nameDescriptor = member.Attribute("name").Value; + var descriptorElements = nameDescriptor.Split(':'); + + if (descriptorElements.Length != 2) + throw new InvalidOperationException(String.Format( + "Invalid name descriptor in line {0}: '{1}'", + ((IXmlLineInfo)member).LineNumber, + nameDescriptor + )); + + memberInfo.Type = MemberDoc.TypeFromDescriptor(descriptorElements[0][0]); + + memberInfo.FullName = descriptorElements[1]; + memberInfo.LocalName = memberInfo.FullName; + + var xImportance = member.Element("importance"); + if (xImportance != null) + { + int importance = 0; + if (int.TryParse(xImportance.Value, out importance)) + memberInfo.Importance = importance; + } + + var xSummary = member.Element("summary"); + if (xSummary != null) + memberInfo.Summary = ParseDocText(xSummary, memberInfo.FullName); + + var xRemarks = member.Element("remarks"); + if (xRemarks != null) + memberInfo.Remarks = ParseDocText(xRemarks, memberInfo.FullName); + + var xReturns = member.Element("returns"); + if (xReturns != null) + memberInfo.Returns = ParseDocText(xReturns, memberInfo.FullName); + + var xExample = member.Element("example"); + if (xExample != null) + memberInfo.Example = ParseDocText(xExample, memberInfo.FullName); + + var xParams = member.Elements("param"); + foreach (var param in xParams) + { + var name = param.Attribute("name").Value; + memberInfo.ParameterDescriptionsByName[name] = ParseDocText(param, memberInfo.FullName); + } + + return memberInfo; + } + + public void ParseXml() + { + var members = Doc.Element("doc").Element("members").Elements("member"); + foreach (var member in members) + { + var memberInfo = ParseMember(member); + MemberDocumentations[memberInfo.FullName] = memberInfo; + } + } + + public void WriteFile(Type type) + { + string md = ""; + if (type.BaseType == typeof(System.MulticastDelegate)) + { + // Todo: Docs for delegate types + } + else if (MemberDocumentations.ContainsKey(type.FullName) && (type.IsClass || type.IsInterface || type.IsEnum)) + { + // Only print members that are documented + + // Print overview of all members + var constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var events = type.GetEvents(BindingFlags.Instance | BindingFlags.Public); + var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + var staticProperties = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + + var output = new StringBuilder(); + WriteInfo(type, output); + + WriteStatic(staticFields, output); + if (!type.IsEnum) WriteInfo(fields, output); + + WriteStatic(staticProperties, output); + WriteInfo(properties, output); + + WriteInfo(events, output); + WriteInfo(constructors, output); + WriteInfo(methods, output); + WriteStatic(staticMethods, output); + output.AppendLine(""); + //output.Append(new StringBuilder()); + md = output.ToString(); + } + + if (!String.IsNullOrEmpty(md)) + { + var assemblyName = type.Assembly.GetName().Name; + var path = $"{OutputPath}\\{assemblyName}\\"; + if (!string.Equals(assemblyName, type.Namespace, StringComparison.CurrentCultureIgnoreCase)) + path += type.Namespace; + + var output = new StringBuilder(); + output.Append(md); + output.AppendLine(""); + output.AppendLine("---"); + output.AppendLine(""); + Directory.CreateDirectory(path); + var file = $"{path}\\{type.Name}.md"; + File.WriteAllText(file, output.ToString()); + } + } + + + // To detect redundant calls + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + // TODO: dispose managed state (managed objects). + } + + // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. + this.AssemblyInfo = null; + this.Doc = null; + GC.ReRegisterForFinalize(this); + // TODO: set large fields to null. + + disposedValue = true; + } + } + } + +} \ No newline at end of file diff --git a/MarkdownVsix/Format/Markdown/MarkdownParse.cs b/MarkdownVsix/Format/Markdown/MarkdownParse.cs new file mode 100644 index 0000000..8553431 --- /dev/null +++ b/MarkdownVsix/Format/Markdown/MarkdownParse.cs @@ -0,0 +1,361 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using VSDocument.Format.Markdown; + +namespace VisualStudio.DocumentGenerate.Vsix.Format.Markdown +{ + public class MarkdownParse : DocParser + { + public MarkdownParse(string docFile, string assemblyFile, string outputFile) : base(docFile, assemblyFile, outputFile) + { + } + + + /// Returns the name of the given type as it would be notated in C# + public string CSharpName(Type type) + { + var name = ""; + + if (ignoredNamespaces.Contains(type.Namespace)) + name = type.Name; + else + name = type.FullName; + + name = name.Replace('+', '.'); + + if ((type.IsPrimitive || type == typeof(string)) && primitiveNames.ContainsKey(type)) + return primitiveNames[type]; + + if (!type.IsGenericType) + return name; + + var output = new StringBuilder(); + output.Append(name.Substring(0, name.IndexOf('`'))); + output.Append("<"); + output.Append(string.Join(", ", type.GetGenericArguments() + .Select(t => CSharpName(t)))); + output.Append(">"); + return output.ToString(); + } + + + /// + /// Returns the full name of the given member, in the same notation that is used in the XML + /// documentation files for member ids and references. + /// + public string FullNameFromMember(MemberInfo member) + { + if (member is MethodInfo) + { + var method = (MethodInfo)member; + if (method.GetParameters().Length > 0) + return method.DeclaringType.FullName + "." + method.Name + MakeSignature(method, humanReadable: false); + else + return method.DeclaringType.FullName + "." + method.Name; + } + else + { + return member.DeclaringType.FullName + "." + member.Name; + } + } + + public string MakeSignature(MethodBase method, bool humanReadable = true) + { + var output = new StringBuilder(); + output.Append("("); + var parameters = method.GetParameters(); + bool first = true; + foreach (var p in parameters) + { + if (!first) + output.Append(humanReadable ? ", " : ","); + + if (p.IsOptional && humanReadable) + output.Append("["); + + if (humanReadable) + { + output.Append(CSharpName(p.ParameterType)); + output.Append(" "); + output.Append(p.Name); + } + else + { + output.Append(p.ParameterType.FullName); + } + + if (p.IsOptional && humanReadable) + output.Append("]"); + first = false; + } + output.Append(")"); + + return output.ToString(); + } + + public string MemberListCategory(string title, IEnumerable members) + { + var output = new StringBuilder(); + + if (!String.IsNullOrEmpty(title)) + { + output.AppendLine("**" + title + "**"); + output.AppendLine(""); + } + foreach (var member in members) + { + output.AppendLine(MemberListItem(member)); + } + output.AppendLine(""); + + return output.ToString(); + } + + public string MemberListItem(MemberInfo member) + { + var fullName = FullNameFromMember(member); + + var output = new StringBuilder(); + + output.AppendLine(""); + output.AppendLine(""); + output.Append("* "); + MethodInfo method = member as MethodInfo; + if (method != null) + { + //var method = (MethodInfo)member; + if (method.ReturnType == null || method.ReturnType == typeof(void)) + output.Append("*void* "); + else + output.Append("*" + CSharpName(method.ReturnType) + "* "); + + output.Append("**" + method.Name + "** *" + MakeSignature(method) + "*"); + } + else if (member is ConstructorInfo) + { + var constructor = (ConstructorInfo)member; + fullName = constructor.DeclaringType.FullName + ".#ctor" + MakeSignature(constructor, false); + output.Append("**" + member.DeclaringType.Name + "** *" + MakeSignature(constructor) + "*"); + } + else + { + Type type = null; + if (member is FieldInfo) + type = ((FieldInfo)member).FieldType; + else if (member is PropertyInfo) + type = ((PropertyInfo)member).PropertyType; + + if (type != null) + output.Append("*" + CSharpName(type) + "* "); + + output.Append("**" + member.Name + "**"); + } + + output.AppendLine(" "); + + if (MemberDocumentations.ContainsKey(fullName)) + { + var doc = MemberDocumentations[fullName]; + if (!String.IsNullOrEmpty(doc.Summary)) + output.AppendLine(" " + doc.Summary + " "); + if (!String.IsNullOrEmpty(doc.Remarks)) + output.AppendLine(" " + doc.Remarks); + if (!String.IsNullOrEmpty(doc.Returns)) + output.AppendLine("**Returns:** " + doc.Returns); + if (!String.IsNullOrEmpty(doc.Example)) + { + output.AppendLine("**Example:** "); + output.AppendLine(""); + output.AppendLine(""); + output.AppendLine($@"`C# "); + output.AppendLine(doc.Example); + output.AppendLine(""); + output.AppendLine(""); + output.AppendLine($@"`"); + } + + output.AppendLine(""); + if (method != null) + { + var parameters = method.GetParameters(); + if (parameters.Length > 0) + { + output.AppendLine("**Parameters:**"); + foreach (var paramInfo in parameters) + { + output.Append("* *" + CSharpName(paramInfo.ParameterType) + "* **" + paramInfo.Name + "**"); + if (paramInfo.IsOptional) + output.Append(" *(optional, default: " + paramInfo.DefaultValue.ToString() + ")*"); + + output.AppendLine(""); + output.AppendLine(""); + + if (doc.ParameterDescriptionsByName.ContainsKey(paramInfo.Name)) + { + output.AppendLine("> " + doc.ParameterDescriptionsByName[paramInfo.Name]); + output.AppendLine(""); + } + } + } + } + + } + + output.AppendLine(""); + + return output.ToString(); + } + + protected override void WriteInfo(Type type, StringBuilder output) + { + output.AppendLine(""); + + var typeType = ""; + + if (type.IsValueType) + typeType = "Struct"; + else if (type.IsInterface) + typeType = "Interface"; + else if (type.IsClass) + typeType = "Class"; + else if (type.IsEnum) + typeType = "Enum"; + + // Print the type name heading + output.AppendLine("## " + typeType + " " + type.FullName); + + if (type.BaseType != typeof(object)) + output.AppendLine("*Extends " + type.BaseType.FullName + "*"); + + output.AppendLine(""); + + var doc = MemberDocumentations[type.FullName]; + // Print summary and remarks + if (!String.IsNullOrEmpty(doc.Summary)) + { + output.AppendLine(doc.Summary); + output.AppendLine(""); + } + + if (!String.IsNullOrEmpty(doc.Remarks)) + { + output.AppendLine(doc.Remarks); + output.AppendLine(""); + } + + if (!String.IsNullOrEmpty(doc.Example)) + { + output.AppendLine("**Examples**"); + output.AppendLine(""); + output.AppendLine(doc.Example); + output.AppendLine(""); + } + } + + protected override void WriteInfo(ConstructorInfo[] constructors, StringBuilder output) + { + if (constructors.Length > 0) + { + output.Append(MemberListCategory("Constructors", constructors)); + } + } + + protected override void WriteInfo(MethodInfo[] methods, StringBuilder output) + { + if (methods.Length > 0) + { + var methodList = new StringBuilder(); + bool foundRealMethods = false; + + methodList.AppendLine("**Methods**"); + methodList.AppendLine(""); + + foreach (var method in methods) + { + if (!method.IsConstructor && !method.IsSpecialName) + { + foundRealMethods = true; + methodList.Append(MemberListItem(method)); + } + } + + if (foundRealMethods) + { + output.Append(methodList); + output.AppendLine(""); + } + } + } + + protected override void WriteInfo(PropertyInfo[] properties, StringBuilder output) + { + if (properties.Length > 0) + { + output.Append(MemberListCategory("Properties", properties)); + } + } + + protected override void WriteInfo(EventInfo[] events, StringBuilder output) + { + if (events.Length > 0) + { + output.Append(MemberListCategory("Events", events)); + } + } + + protected override void WriteInfo(FieldInfo[] fields, StringBuilder output) + { + if (fields.Length > 0) + { + output.Append(MemberListCategory("Fields", fields)); + } + } + + protected override void WriteStatic(FieldInfo[] staticFields, StringBuilder output) + { + if (staticFields.Length > 0) + { + output.Append(MemberListCategory("Static Fields", staticFields)); + } + } + + protected override void WriteStatic(MethodInfo[] staticMethods, StringBuilder output) + { + if (staticMethods.Length > 0) + { + var methodList = new StringBuilder(); + bool foundRealMethods = false; + + methodList.AppendLine("**Static Methods**"); + methodList.AppendLine(""); + + foreach (var method in staticMethods) + { + if (!method.IsConstructor && !method.IsSpecialName) + { + foundRealMethods = true; + methodList.Append(MemberListItem(method)); + } + } + + if (foundRealMethods) + { + output.Append(methodList); + output.AppendLine(""); + } + } + } + + protected override void WriteStatic(PropertyInfo[] staticProperties, StringBuilder output) + { + if (staticProperties.Length > 0) + { + output.Append(MemberListCategory("Static Properties", staticProperties)); + } + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Format/Markdown/MemberDoc.cs b/MarkdownVsix/Format/Markdown/MemberDoc.cs new file mode 100644 index 0000000..262d7f8 --- /dev/null +++ b/MarkdownVsix/Format/Markdown/MemberDoc.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace VSDocument.Format.Markdown +{ + public class MemberDoc + { + public string Example; + + public string FullName; + + public int Importance = 0; + + public string LocalName; + + public Dictionary ParameterDescriptionsByName = new Dictionary(); + + public string ParentName; + + public string Remarks; + + public string Returns; + + public string Summary; + + public MemberType Type; + + public static MemberType TypeFromDescriptor(char descriptor) + { + switch (descriptor) + { + case 'T': + return MemberType.Type; + + case 'M': + return MemberType.Method; + + case 'E': + return MemberType.Event; + + case 'F': + return MemberType.Field; + + case 'P': + return MemberType.Property; + + default: + throw new ArgumentException("Unknown member descriptor: " + descriptor); + } + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Format/Markdown/MemberType.cs b/MarkdownVsix/Format/Markdown/MemberType.cs new file mode 100644 index 0000000..3ac463f --- /dev/null +++ b/MarkdownVsix/Format/Markdown/MemberType.cs @@ -0,0 +1,13 @@ +namespace VSDocument.Format.Markdown +{ + public enum MemberType + { + Namespace = 0, + Type = 1, + Method = 2, + Field = 3, + Property = 4, + Event = 5, + Constructor = 6 + } +} \ No newline at end of file diff --git a/MarkdownVsix/Format/ProjectFile.cs b/MarkdownVsix/Format/ProjectFile.cs new file mode 100644 index 0000000..6fb695b --- /dev/null +++ b/MarkdownVsix/Format/ProjectFile.cs @@ -0,0 +1,67 @@ +using EnvDTE; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace MarkdownVsix +{ + public class ProjectFile : IEquatable + { + private const string assemblyName = "AssemblyName"; + private const string documentationFile = "DocumentationFile"; + private const string fullPath = "FullPath"; + public string AssemblyFile => Directory.GetFiles(Path, AssemblyName + ".dll", SearchOption.AllDirectories)?.FirstOrDefault(); + + public string AssemblyName { get; set; } + + public string DocFile => Directory.GetFiles(Path, DocName, SearchOption.AllDirectories)?.FirstOrDefault(); + + public string DocName { get; set; } + + public string Path { get; set; } + + /// + /// + /// Ocorre quando project é nulo + public ProjectFile(EnvDTE.Project project) + { + if (ReferenceEquals(project, null)) + throw new ArgumentNullException(nameof(project)); + + Path = project.Properties.Item(fullPath)?.Value?.ToString(); + AssemblyName = project.Properties.Item(assemblyName)?.Value?.ToString(); + DocName = AssemblyName + ".xml"; + } + + public ProjectFile() + { + } + + public static bool operator !=(ProjectFile file1, ProjectFile file2) + { + return !(file1 == file2); + } + + public static bool operator ==(ProjectFile file1, ProjectFile file2) + { + return EqualityComparer.Default.Equals(file1, file2); + } + + public override bool Equals(object obj) + { + return Equals(obj as ProjectFile); + } + + public bool Equals(ProjectFile other) + { + return other != null && + AssemblyName == other.AssemblyName; + } + + public override int GetHashCode() + { + return -1184256330 + EqualityComparer.Default.GetHashCode(AssemblyName); + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/GenerateMarkdown.cs b/MarkdownVsix/GenerateMarkdown.cs index 1d11aeb..82bd223 100644 --- a/MarkdownVsix/GenerateMarkdown.cs +++ b/MarkdownVsix/GenerateMarkdown.cs @@ -1,39 +1,45 @@ -using System; -using System.ComponentModel.Design; -using System.Globalization; -using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using System; +using System.ComponentModel.Design; namespace MarkdownVsix { - /// - /// Command handler - /// + /// Command handler internal sealed class GenerateMarkdown { - /// - /// Command ID. - /// + /// Command ID. public const int CommandId = 0x0100; - /// - /// Command menu group (command set GUID). - /// + /// Command menu group (command set GUID). public static readonly Guid CommandSet = new Guid("5813e236-e447-4319-a996-d3a2c1dacaf6"); - public static readonly Guid SymbolGenDocSolutionNode = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14683"); - public static readonly Guid SymbolGenDocSolutionFolderGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14684"); public static readonly Guid SymbolGenDocProjectNodeGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14685"); + public static readonly Guid SymbolGenDocSolutionFolderGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14684"); + public static readonly Guid SymbolGenDocSolutionNode = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14683"); - - /// - /// VS Package that provides this command, not null. - /// + /// VS Package that provides this command, not null. private readonly Package package; + /// Gets the instance of the command. + public static GenerateMarkdown Instance + { + get; + private set; + } + + /// Gets the service provider from the owner package. + private IServiceProvider ServiceProvider + { + get + { + return this.package; + } + } + /// - /// Initializes a new instance of the class. - /// Adds our command handlers for menu (commands must exist in the command table file) + /// Initializes a new instance of the class. Adds our command + /// handlers for menu (commands must exist in the command table file) /// /// Owner package, not null. private GenerateMarkdown(Package package) @@ -56,33 +62,29 @@ private GenerateMarkdown(Package package) } } - /// - /// Gets the instance of the command. - /// - public static GenerateMarkdown Instance + /// Initializes the singleton instance of the command. + /// Owner package, not null. + public static void Initialize(Package package) { - get; - private set; + Instance = new GenerateMarkdown(package); } - /// - /// Gets the service provider from the owner package. - /// - private IServiceProvider ServiceProvider + private void GenerateMarkdownForFolders(object sender, EventArgs e) { - get - { - return this.package; - } + MenuItemCallback("Create Markdown for folders"); + Console.WriteLine("Create Markdown for Folders"); } - /// - /// Initializes the singleton instance of the command. - /// - /// Owner package, not null. - public static void Initialize(Package package) + private void GenerateMarkdownForProject(object sender, EventArgs e) { - Instance = new GenerateMarkdown(package); + MenuItemCallback("Create Markdown for project"); + Console.WriteLine("Create Markdown for project"); + } + + private void GenerateMarkdownForSolutions(object sender, EventArgs e) + { + MenuItemCallback("Create Markdown for solutions"); + Console.WriteLine("Create Markdown for Solutions"); } /// @@ -91,10 +93,9 @@ public static void Initialize(Package package) /// OleMenuCommandService service and MenuCommand class. /// /// Event sender. - /// Event args. + /// Event args. private void MenuItemCallback(string message) { - string title = "GenerateMarkdown"; // Show a message box to prove we were here @@ -106,23 +107,5 @@ private void MenuItemCallback(string message) OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); } - - private void GenerateMarkdownForProject(object sender, EventArgs e) - { - MenuItemCallback("Create Markdown for project"); - Console.WriteLine("Create Markdown for project"); - } - - private void GenerateMarkdownForSolutions(object sender, EventArgs e) - { - MenuItemCallback("Create Markdown for solutions"); - Console.WriteLine("Create Markdown for Solutions"); - } - - private void GenerateMarkdownForFolders(object sender, EventArgs e) - { - MenuItemCallback("Create Markdown for folders"); - Console.WriteLine("Create Markdown for Folders"); - } } -} +} \ No newline at end of file diff --git a/MarkdownVsix/GenerateMarkdownPackage.cs b/MarkdownVsix/GenerateMarkdownPackage.cs index a6165bd..ceec12c 100644 --- a/MarkdownVsix/GenerateMarkdownPackage.cs +++ b/MarkdownVsix/GenerateMarkdownPackage.cs @@ -1,39 +1,36 @@ -using System; +using EnvDTE; +using EnvDTE80; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; +using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Win32; namespace MarkdownVsix { - /// - /// This is the class that implements the package exposed by this assembly. - /// + /// This is the class that implements the package exposed by this assembly. /// /// - /// The minimum requirement for a class to be considered a valid package for Visual Studio - /// is to implement the IVsPackage interface and register itself with the shell. - /// This package uses the helper classes defined inside the Managed Package Framework (MPF) - /// to do it: it derives from the Package class that provides the implementation of the - /// IVsPackage interface and uses the registration attributes defined in the framework to - /// register itself and its components with the shell. These attributes tell the pkgdef creation - /// utility what data to put into .pkgdef file. + /// The minimum requirement for a class to be considered a valid package for Visual Studio is to + /// implement the IVsPackage interface and register itself with the shell. This package uses the + /// helper classes defined inside the Managed Package Framework (MPF) to do it: it derives from + /// the Package class that provides the implementation of the IVsPackage interface and uses the + /// registration attributes defined in the framework to register itself and its components with + /// the shell. These attributes tell the pkgdef creation utility what data to put into .pkgdef file. /// /// - /// To get loaded into VS, the package must be referred by <Asset Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file. + /// To get loaded into VS, the package must be referred by <Asset + /// Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file. /// /// [PackageRegistration(UseManagedResourcesOnly = true)] [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [ProvideMenuResource("Menus.ctmenu", 1)] - [Guid(GenerateMarkdownPackage.PackageGuidString)] + [Guid(Constants.PackageGuids.PackageGuidString)] [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] [ProvideBindingPath] //[ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. @@ -41,35 +38,86 @@ namespace MarkdownVsix [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] public sealed class GenerateMarkdownPackage : Package { + /// An internal collection of the commands registered by this package. + private readonly ICollection _commands = new List(); + + /// + /// The top level application instance of the VS IDE that is executing this package. + /// + private DTE2 _ide; + + /// Gets the currently active document, otherwise null. + public Document ActiveDocument + { + get + { + try + { + return IDE.ActiveDocument; + } + catch (Exception) + { + // If a project property page is active, accessing the ActiveDocument causes an exception. + return null; + } + } + } + /// - /// GenerateMarkdownPackage GUID string. + /// Gets the top level application instance of the VS IDE that is executing this package. /// - public const string PackageGuidString = "1d883cd3-1fac-497e-b56d-097a8ba0a09f"; + public DTE2 IDE => _ide ?? (_ide = (DTE2)GetService(typeof(DTE))); + + /// Gets the version of the running IDE instance. + public double IDEVersion => Convert.ToDouble(IDE.Version, CultureInfo.InvariantCulture); /// - /// Initializes a new instance of the class. + /// Gets or sets a flag indicating if CodeMaid is running inside an AutoSave context. /// + public bool IsAutoSaveContext { get; set; } + + /// Gets the menu command service. + public OleMenuCommandService MenuCommandService => GetService(typeof(IMenuCommandService)) as OleMenuCommandService; + + /// Gets the shell service. + private IVsShell ShellService => GetService(typeof(SVsShell)) as IVsShell; + + /// Initializes a new instance of the class. public GenerateMarkdownPackage() { - // Inside this method you can place any initialization code that does not require - // any Visual Studio service because at this point the package object is created but - // not sited yet inside Visual Studio environment. The place to do all the other + // Inside this method you can place any initialization code that does not require any + // Visual Studio service because at this point the package object is created but not + // sited yet inside Visual Studio environment. The place to do all the other // initialization is the Initialize method. } - - #region Package Members - /// - /// Initialization of the package; this method is called right after the package is sited, so this is the place - /// where you can put all the initialization code that rely on services provided by VisualStudio. + /// Initialization of the package; this method is called right after the package is sited, so + /// this is the place where you can put all the initialization code that rely on services + /// provided by VisualStudio. /// protected override void Initialize() { - GenerateMarkdown.Initialize(this); + Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this)); + RegisterCommands(); + //GenerateMarkdown.Initialize(this); base.Initialize(); } - #endregion + /// Register the package commands (which must exist in the .vsct file). + private void RegisterCommands() + { + var menuCommandService = MenuCommandService; + if (menuCommandService != null) + { + _commands.Add(new CreateMarkdownProjectCommand(this)); + + // Add all commands to the menu command service. + foreach (var command in _commands) + { + menuCommandService.AddCommand(command); + } + } + } } -} +} \ No newline at end of file diff --git a/MarkdownVsix/GenerateMarkdownPackage.vsct b/MarkdownVsix/GenerateMarkdownPackage.vsct index 4a9af9d..b2d1f22 100644 --- a/MarkdownVsix/GenerateMarkdownPackage.vsct +++ b/MarkdownVsix/GenerateMarkdownPackage.vsct @@ -63,10 +63,9 @@ - - + diff --git a/MarkdownVsix/Properties/AssemblyInfo.cs b/MarkdownVsix/Properties/AssemblyInfo.cs index 7c45384..1230e92 100644 --- a/MarkdownVsix/Properties/AssemblyInfo.cs +++ b/MarkdownVsix/Properties/AssemblyInfo.cs @@ -1,10 +1,8 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. +// General Information about an assembly is controlled through the following set of attributes. +// Change these attribute values to modify the information associated with an assembly. [assembly: AssemblyTitle("MarkdownVsix")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -14,20 +12,16 @@ [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. +// Setting ComVisible to false makes the types in this assembly not visible to COM components. If you +// need to access a type in this assembly from COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // Version information for an assembly consists of the following four values: // -// Major Version -// Minor Version -// Build Number -// Revision +// Major Version Minor Version Build Number Revision // -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] +// You can specify all the values or you can default the Build and Revision Numbers by using the '*' +// as shown below: [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: System.Runtime.InteropServices.Guid("6a84e990-e429-4d68-9042-9918da4ba488")] \ No newline at end of file diff --git a/MarkdownVsix/SolutionHelper.cs b/MarkdownVsix/SolutionHelper.cs new file mode 100644 index 0000000..af740e3 --- /dev/null +++ b/MarkdownVsix/SolutionHelper.cs @@ -0,0 +1,135 @@ +using EnvDTE; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MarkdownVsix +{ + /// A static helper class for working with the solution. + internal static class SolutionHelper + { + /// Gets an enumerable set of all items of the specified type within the solution. + /// The type of item to retrieve. + /// The solution. + /// The enumerable set of all items. + internal static IEnumerable GetAllItemsInSolution(Solution solution) + where T : class + { + var allProjects = new List(); + + if (solution != null) + { + allProjects.AddRange(GetItemsRecursively(solution)); + } + + return allProjects; + } + + /// + /// Gets items of the specified type recursively from the specified parent item. Includes the + /// parent item if it matches the specified type as well. + /// + /// The type of item to retrieve. + /// The parent item. + /// The enumerable set of items within the parent item, may be empty. + internal static IEnumerable GetItemsRecursively(object parentItem) + where T : class + { + if (parentItem == null) + { + throw new ArgumentNullException(nameof(parentItem)); + } + + // Create a collection. + var projectItems = new List(); + + // Include the parent item if it is of the desired type. + var desiredType = parentItem as T; + if (desiredType != null) + { + projectItems.Add(desiredType); + } + + // Get all children based on the type of parent item. + var children = GetChildren(parentItem); + + // Then recurse through all children. + foreach (var childItem in children) + { + projectItems.AddRange(GetItemsRecursively(childItem)); + } + + return projectItems; + } + + /// Gets an enumerable set of the selected project items. + /// The hosting package. + /// The enumerable set of selected project items. + internal static IEnumerable GetSelectedProjectItemsRecursively(GenerateMarkdownPackage package) + { + var selectedProjectItems = new List(); + var selectedUIHierarchyItems = UIHierarchyHelper.GetSelectedUIHierarchyItems(package); + + foreach (var item in selectedUIHierarchyItems.Select(uiHierarchyItem => uiHierarchyItem.Object)) + { + selectedProjectItems.AddRange(GetItemsRecursively(item)); + } + + return selectedProjectItems; + } + + /// + /// Gets an enumerable set of similar project items compared by file name, useful for shared projects. + /// + /// The hosting package. + /// The project item to match. + /// The enumerable set of similar project items. + internal static IEnumerable GetSimilarProjectItems(GenerateMarkdownPackage package, ProjectItem projectItem) + { + var allItems = GetAllItemsInSolution(package.IDE.Solution); + + return allItems + .Where(x => x.Name == projectItem.Name && x.Kind == projectItem.Kind && x.Document.FullName == projectItem.Document.FullName); + } + + /// Gets the children of the specified parent item if applicable. + /// The parent item. + /// An enumerable set of children, may be empty. + private static IEnumerable GetChildren(object parentItem) + { + // First check if the item is a solution. + var solution = parentItem as Solution; + if (solution?.Projects != null) + { + return solution.Projects.Cast().Cast().ToList(); + } + + // Next check if the item is a project. + var project = parentItem as Project; + if (project?.ProjectItems != null) + { + return project.ProjectItems.Cast().Cast().ToList(); + } + + // Next check if the item is a project item. + var projectItem = parentItem as ProjectItem; + if (projectItem != null) + { + // Standard projects. + if (projectItem.ProjectItems != null) + { + return projectItem.ProjectItems.Cast().Cast().ToList(); + } + + // Projects within a solution folder. + if (projectItem.SubProject != null) + { + return new[] { projectItem.SubProject }; + } + } + + // Otherwise return an empty array. + return new object[0]; + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/UIHierarchyHelper.cs b/MarkdownVsix/UIHierarchyHelper.cs new file mode 100644 index 0000000..913249f --- /dev/null +++ b/MarkdownVsix/UIHierarchyHelper.cs @@ -0,0 +1,55 @@ +using EnvDTE; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MarkdownVsix +{ + /// A static helper class for working with the UI hierarchies. + internal static class UIHierarchyHelper + { + /// Gets an enumerable set of the selected UI hierarchy items. + /// The hosting package. + /// The enumerable set of selected UI hierarchy items. + internal static IEnumerable GetSelectedUIHierarchyItems(GenerateMarkdownPackage package) + { + var solutionExplorer = GetSolutionExplorer(package); + + return ((object[])solutionExplorer.SelectedItems).Cast().ToList(); + } + + /// Gets the solution explorer for the specified hosting package. + /// The hosting package. + /// The solution explorer. + internal static UIHierarchy GetSolutionExplorer(GenerateMarkdownPackage package) + { + return package.IDE.ToolWindows.SolutionExplorer; + } + + /// Gets the top level (solution) UI hierarchy item. + /// The hosting package. + /// The top level (solution) UI hierarchy item, otherwise null. + internal static UIHierarchyItem GetTopUIHierarchyItem(GenerateMarkdownPackage package) + { + var solutionExplorer = GetSolutionExplorer(package); + + return solutionExplorer.UIHierarchyItems.Count > 0 + ? solutionExplorer.UIHierarchyItems.Item(1) + : null; + } + + /// Determines whether the specified item has any expanded children. + /// The parent item. + /// True if there are expanded children, false otherwise. + internal static bool HasExpandedChildren(UIHierarchyItem parentItem) + { + if (parentItem == null) + { + throw new ArgumentNullException(nameof(parentItem)); + } + + return parentItem.UIHierarchyItems.Cast().Any( + childItem => childItem.UIHierarchyItems.Expanded || HasExpandedChildren(childItem)); + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/MarkdownVsix.csproj b/MarkdownVsix/VisualStudio.DocumentGenerate.Vsix.csproj similarity index 93% rename from MarkdownVsix/MarkdownVsix.csproj rename to MarkdownVsix/VisualStudio.DocumentGenerate.Vsix.csproj index ba0da25..a2aae8f 100644 --- a/MarkdownVsix/MarkdownVsix.csproj +++ b/MarkdownVsix/VisualStudio.DocumentGenerate.Vsix.csproj @@ -7,6 +7,7 @@ true + true @@ -23,9 +24,9 @@ {3CF8B458-7D40-4207-9F76-3AAADCEA8344} Library Properties - MarkdownVsix - MarkdownVsix - v4.7 + VisualStudio.DocumentGenerate.Vsix + VisualStudio.DocumentGenerate.Vsix + v4.6.1 true true true @@ -54,9 +55,21 @@ 4 + + + + + + + + + + + + @@ -166,6 +179,7 @@ + diff --git a/MarkdownVsix/app.config b/MarkdownVsix/app.config index cc8e053..d8415d0 100644 --- a/MarkdownVsix/app.config +++ b/MarkdownVsix/app.config @@ -1,4 +1,4 @@ - + @@ -10,6 +10,13 @@ + + + + + + + \ No newline at end of file diff --git a/MarkdownVsix/index.html b/MarkdownVsix/index.html index 1fee824..00beadb 100644 --- a/MarkdownVsix/index.html +++ b/MarkdownVsix/index.html @@ -40,7 +40,6 @@

Run and debug

In the experimental instance of Visual Studio you can test out the functionality of your extension without affecting your Visual Studio installation.

-
@@ -62,4 +61,4 @@

Give us feedback

- + \ No newline at end of file diff --git a/MarkdownVsix/stylesheet.css b/MarkdownVsix/stylesheet.css index d5e9c71..8d0c276 100644 --- a/MarkdownVsix/stylesheet.css +++ b/MarkdownVsix/stylesheet.css @@ -11,7 +11,6 @@ body { /* General & 'Reset' Stuff */ - .container { width: 980px; margin: 0 auto; @@ -65,14 +64,12 @@ h1, h2 { font-weight: normal; } - #main_content { width: 100%; display: flex; flex-direction: row; } - h1, h2, h3, h4, h5, h6 { font-weight: bolder; } @@ -126,4 +123,4 @@ ul { #rpanel div { width: 300px; -} +} \ No newline at end of file diff --git a/VSDocument.Format.Markdown/Properties/Resources.Designer.cs b/VSDocument.Format.Markdown/Properties/Resources.Designer.cs new file mode 100644 index 0000000..7701236 --- /dev/null +++ b/VSDocument.Format.Markdown/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace VSDocument.Format.Markdown.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VSDocument.Format.Markdown.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/VSDocument.Format.Markdown/Properties/Resources.resx b/VSDocument.Format.Markdown/Properties/Resources.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/VSDocument.Format.Markdown/Properties/Resources.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj b/VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj new file mode 100644 index 0000000..ffa4bf3 --- /dev/null +++ b/VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj @@ -0,0 +1,38 @@ + + + + netstandard2.0 + Gustavo Américo Gonçalves + GAG LTDA + VSDocument Format + git + 1.0.0.1 + 1.0.0.1 + True + 51da6188-cd28-464e-abfa-e4e9b71869b2 + + + + + + bin\Debug\netstandard2.0\VSDocument.Format.Markdown.xml + bin\netstandard2.0\ + true + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + From 3cf96c642aa60c4b188189ada6e01241595f8a24 Mon Sep 17 00:00:00 2001 From: GustavoAmerico Date: Sun, 7 Jan 2018 01:57:26 -0200 Subject: [PATCH 3/8] =?UTF-8?q?terminando=20a=20formata=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20markdown=20pra=20V1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MarkdownVsix/Commands/BaseCommand.cs | 4 +- MarkdownVsix/Commands/Constants.cs | 5 + .../Commands/CreateMarkdownProjectCommand.cs | 21 +- .../Commands/CreateMarkdownSolutionCommand.cs | 12 + .../CreateMarkdownSolutionFolderCommand.cs | 12 + MarkdownVsix/Format/DocFormat.cs | 42 +-- MarkdownVsix/Format/DocParser.cs | 22 +- MarkdownVsix/Format/Markdown/MarkdownParse.cs | 244 +++++++++--------- MarkdownVsix/Format/Markdown/MemberDoc.cs | 2 +- MarkdownVsix/Format/ProjectFile.cs | 3 +- MarkdownVsix/GenerateMarkdownPackage.cs | 3 +- MarkdownVsix/LICENSE.txt | 21 ++ MarkdownVsix/Resources/GenerateMarkdown.png | Bin 1172 -> 3245 bytes .../Resources/GenerateMarkdownPackage.ico | Bin 428446 -> 67646 bytes MarkdownVsix/Resources/logo.svg | 34 +++ ...isualStudio.DocumentGenerator.Vsix.csproj} | 20 +- MarkdownVsix/source.extension.vsixmanifest | 22 +- ...Net.sln => VSDocumentGeneratorSolution.sln | 2 +- 18 files changed, 295 insertions(+), 174 deletions(-) create mode 100644 MarkdownVsix/Commands/CreateMarkdownSolutionCommand.cs create mode 100644 MarkdownVsix/Commands/CreateMarkdownSolutionFolderCommand.cs create mode 100644 MarkdownVsix/LICENSE.txt create mode 100644 MarkdownVsix/Resources/logo.svg rename MarkdownVsix/{VisualStudio.DocumentGenerate.Vsix.csproj => VisualStudio.DocumentGenerator.Vsix.csproj} (94%) rename MarkdownDocNet.sln => VSDocumentGeneratorSolution.sln (92%) diff --git a/MarkdownVsix/Commands/BaseCommand.cs b/MarkdownVsix/Commands/BaseCommand.cs index fbfd802..8af1f94 100644 --- a/MarkdownVsix/Commands/BaseCommand.cs +++ b/MarkdownVsix/Commands/BaseCommand.cs @@ -1,6 +1,6 @@ -using System; +using Microsoft.VisualStudio.Shell; +using System; using System.ComponentModel.Design; -using Microsoft.VisualStudio.Shell; namespace MarkdownVsix { diff --git a/MarkdownVsix/Commands/Constants.cs b/MarkdownVsix/Commands/Constants.cs index 20e6ba7..0a328ef 100644 --- a/MarkdownVsix/Commands/Constants.cs +++ b/MarkdownVsix/Commands/Constants.cs @@ -14,12 +14,17 @@ public static class PackageGuids public const string PackageGuidString = ("d69f1580-274f-4d12-b13a-c365c759de66"); public readonly static Guid SymbolGenDocProjectNodeGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14686"); + + public readonly static Guid SymbolGenDocSolutionFolderGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14685"); + public readonly static Guid SymbolGenDocSolutionNodeGroup = new Guid("1ebc1a20-d2e7-4875-a7ff-2a3219b14683"); } /// Helper class that exposes all GUIDs used across VS Package. public sealed partial class PackageIds { public const int CmdIDSymbolGenDocProjectNodeGroup = 0x1052; + public const int CmdIDSymbolGenDocSolutionFolderGroup = 0x1051; + public const int CmdIDSymbolGenDocSolutionNodeGroup = 0x1050; } } } \ No newline at end of file diff --git a/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs b/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs index 33c86b8..fba47d8 100644 --- a/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs +++ b/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs @@ -4,11 +4,9 @@ using System.IO; using System.Linq; using VisualStudio.DocumentGenerate.Vsix.Format.Markdown; -using VSDocument.Format.Markdown; namespace MarkdownVsix { - /// A command that provides for cleaning up code in the selected documents. internal class CreateMarkdownProjectCommand : BaseCommand { @@ -26,7 +24,16 @@ private IEnumerable SelectedProjectItems /// /// The hosting package. internal CreateMarkdownProjectCommand(GenerateMarkdownPackage package) - : base(package, new CommandID(Constants.PackageGuids.SymbolGenDocProjectNodeGroup, Constants.PackageIds.CmdIDSymbolGenDocProjectNodeGroup)) + : this(package, new CommandID(Constants.PackageGuids.SymbolGenDocProjectNodeGroup, Constants.PackageIds.CmdIDSymbolGenDocProjectNodeGroup)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The hosting package. + internal CreateMarkdownProjectCommand(GenerateMarkdownPackage package, CommandID command) + : base(package, command) { } @@ -45,18 +52,20 @@ protected override void OnExecute() var solutionDirectory = Path.GetDirectoryName(Package.IDE.Solution.FullName); solutionDirectory = Path.Combine(solutionDirectory, Constants.ProjectDocPath); - using (var document = new ActiveDocumentRestorer(Package)) { const string documentationFile = "DocumentationFile"; + const string projectFullName = "Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject"; + //&& (a.ContainingProject.Properties?.Item(documentationFile) != null) var projects = SelectedProjectItems - .Where(a => a.ContainingProject != null && !Equals(a.ContainingProject.Properties?.Item(documentationFile), null)) + .Where(a => a.ContainingProject != null && + a.ContainingProject.GetType().FullName == projectFullName) .Select(a => new ProjectFile(a.ContainingProject)) + .Where(a => !string.IsNullOrWhiteSpace(a.DocFile)) .Distinct() .ToArray(); - foreach (var project in projects) { var parser = new MarkdownParse(project.DocFile, project.AssemblyFile, solutionDirectory); diff --git a/MarkdownVsix/Commands/CreateMarkdownSolutionCommand.cs b/MarkdownVsix/Commands/CreateMarkdownSolutionCommand.cs new file mode 100644 index 0000000..ce410dd --- /dev/null +++ b/MarkdownVsix/Commands/CreateMarkdownSolutionCommand.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.Design; + +namespace MarkdownVsix +{ + internal class CreateMarkdownSolutionCommand : CreateMarkdownProjectCommand + { + internal CreateMarkdownSolutionCommand(GenerateMarkdownPackage package) + : base(package, new CommandID(Constants.PackageGuids.SymbolGenDocSolutionNodeGroup, Constants.PackageIds.CmdIDSymbolGenDocSolutionNodeGroup)) + { + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Commands/CreateMarkdownSolutionFolderCommand.cs b/MarkdownVsix/Commands/CreateMarkdownSolutionFolderCommand.cs new file mode 100644 index 0000000..3a41c16 --- /dev/null +++ b/MarkdownVsix/Commands/CreateMarkdownSolutionFolderCommand.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.Design; + +namespace MarkdownVsix +{ + internal class CreateMarkdownSolutionFolderCommand : CreateMarkdownProjectCommand + { + internal CreateMarkdownSolutionFolderCommand(GenerateMarkdownPackage package) + : base(package, new CommandID(Constants.PackageGuids.SymbolGenDocSolutionFolderGroup, Constants.PackageIds.CmdIDSymbolGenDocSolutionFolderGroup)) + { + } + } +} \ No newline at end of file diff --git a/MarkdownVsix/Format/DocFormat.cs b/MarkdownVsix/Format/DocFormat.cs index 6fd882b..62cf5b0 100644 --- a/MarkdownVsix/Format/DocFormat.cs +++ b/MarkdownVsix/Format/DocFormat.cs @@ -6,28 +6,40 @@ namespace VSDocument.Format.Markdown { public abstract class DocFormat { + protected virtual void WriteInfo(MethodInfo[] methods, StringBuilder output) + { + } - protected virtual void WriteInfo(MethodInfo[] methods, StringBuilder output) { } + protected virtual void WriteInfo(PropertyInfo[] properties, StringBuilder output) + { + } - protected virtual void WriteInfo(PropertyInfo[] properties, StringBuilder output) { } + protected virtual void WriteInfo(FieldInfo[] fields, StringBuilder output) + { + } - protected virtual void WriteInfo(FieldInfo[] fields, StringBuilder output) { } + protected virtual void WriteInfo(EventInfo[] events, StringBuilder output) + { + } - protected virtual void WriteInfo(EventInfo[] events, StringBuilder output) { } + protected virtual void WriteInfo(ConstructorInfo[] events, StringBuilder output) + { + } + protected virtual void WriteInfo(Type type, StringBuilder output) + { + } - protected virtual void WriteInfo(ConstructorInfo[] events, StringBuilder output) { } - - protected virtual void WriteInfo(Type type, StringBuilder output) { } - - protected virtual void WriteStatic(FieldInfo[] staticFields, StringBuilder output) { } - - protected virtual void WriteStatic(MethodInfo[] staticMethods, StringBuilder output) { } - - protected virtual void WriteStatic(PropertyInfo[] staticProperties, StringBuilder output) { } - + protected virtual void WriteStatic(FieldInfo[] staticFields, StringBuilder output) + { + } + protected virtual void WriteStatic(MethodInfo[] staticMethods, StringBuilder output) + { + } + protected virtual void WriteStatic(PropertyInfo[] staticProperties, StringBuilder output) + { + } } - } \ No newline at end of file diff --git a/MarkdownVsix/Format/DocParser.cs b/MarkdownVsix/Format/DocParser.cs index 9fac09c..f60278b 100644 --- a/MarkdownVsix/Format/DocParser.cs +++ b/MarkdownVsix/Format/DocParser.cs @@ -282,6 +282,10 @@ public MemberDoc ParseMember(XElement member) if (xExample != null) memberInfo.Example = ParseDocText(xExample, memberInfo.FullName); + var xException = member.Element("exception"); + if (xException != null) + memberInfo.Exception = ParseDocText(xException, memberInfo.FullName); + var xParams = member.Elements("param"); foreach (var param in xParams) { @@ -315,14 +319,22 @@ public void WriteFile(Type type) // Print overview of all members var constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); var events = type.GetEvents(BindingFlags.Instance | BindingFlags.Public); - var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); - var staticProperties = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var staticProperties = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + + var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(a => !a.IsSpecialName) + .ToArray(); + + var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(a => !a.IsSpecialName) + .ToArray(); + var output = new StringBuilder(); WriteInfo(type, output); @@ -359,7 +371,6 @@ public void WriteFile(Type type) } } - // To detect redundant calls protected virtual void Dispose(bool disposing) { @@ -380,5 +391,4 @@ protected virtual void Dispose(bool disposing) } } } - } \ No newline at end of file diff --git a/MarkdownVsix/Format/Markdown/MarkdownParse.cs b/MarkdownVsix/Format/Markdown/MarkdownParse.cs index 8553431..3ee52a4 100644 --- a/MarkdownVsix/Format/Markdown/MarkdownParse.cs +++ b/MarkdownVsix/Format/Markdown/MarkdownParse.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Reflection; using System.Text; @@ -14,17 +13,11 @@ public MarkdownParse(string docFile, string assemblyFile, string outputFile) : b { } - /// Returns the name of the given type as it would be notated in C# public string CSharpName(Type type) { - var name = ""; - - if (ignoredNamespaces.Contains(type.Namespace)) - name = type.Name; - else - name = type.FullName; - + //FullName is null when type is Generic with TResult, T e etc... + var name = ignoredNamespaces.Contains(type.Namespace) ? type.Name : type.FullName ?? type.Name; name = name.Replace('+', '.'); if ((type.IsPrimitive || type == typeof(string)) && primitiveNames.ContainsKey(type)) @@ -42,7 +35,6 @@ public string CSharpName(Type type) return output.ToString(); } - /// /// Returns the full name of the given member, in the same notation that is used in the XML /// documentation files for member ids and references. @@ -100,10 +92,10 @@ public string MakeSignature(MethodBase method, bool humanReadable = true) public string MemberListCategory(string title, IEnumerable members) { var output = new StringBuilder(); - + output.AppendLine(""); if (!String.IsNullOrEmpty(title)) { - output.AppendLine("**" + title + "**"); + output.AppendLine("## **" + title + "**"); output.AppendLine(""); } foreach (var member in members) @@ -111,7 +103,7 @@ public string MemberListCategory(string title, IEnumerable members) output.AppendLine(MemberListItem(member)); } output.AppendLine(""); - + output.AppendLine(""); return output.ToString(); } @@ -120,28 +112,10 @@ public string MemberListItem(MemberInfo member) var fullName = FullNameFromMember(member); var output = new StringBuilder(); - output.AppendLine(""); output.AppendLine(""); output.Append("* "); - MethodInfo method = member as MethodInfo; - if (method != null) - { - //var method = (MethodInfo)member; - if (method.ReturnType == null || method.ReturnType == typeof(void)) - output.Append("*void* "); - else - output.Append("*" + CSharpName(method.ReturnType) + "* "); - - output.Append("**" + method.Name + "** *" + MakeSignature(method) + "*"); - } - else if (member is ConstructorInfo) - { - var constructor = (ConstructorInfo)member; - fullName = constructor.DeclaringType.FullName + ".#ctor" + MakeSignature(constructor, false); - output.Append("**" + member.DeclaringType.Name + "** *" + MakeSignature(constructor) + "*"); - } - else + if (member is FieldInfo || member is PropertyInfo) { Type type = null; if (member is FieldInfo) @@ -154,56 +128,9 @@ public string MemberListItem(MemberInfo member) output.Append("**" + member.Name + "**"); } - output.AppendLine(" "); - if (MemberDocumentations.ContainsKey(fullName)) - { - var doc = MemberDocumentations[fullName]; - if (!String.IsNullOrEmpty(doc.Summary)) - output.AppendLine(" " + doc.Summary + " "); - if (!String.IsNullOrEmpty(doc.Remarks)) - output.AppendLine(" " + doc.Remarks); - if (!String.IsNullOrEmpty(doc.Returns)) - output.AppendLine("**Returns:** " + doc.Returns); - if (!String.IsNullOrEmpty(doc.Example)) - { - output.AppendLine("**Example:** "); - output.AppendLine(""); - output.AppendLine(""); - output.AppendLine($@"`C# "); - output.AppendLine(doc.Example); - output.AppendLine(""); - output.AppendLine(""); - output.AppendLine($@"`"); - } - - output.AppendLine(""); - if (method != null) - { - var parameters = method.GetParameters(); - if (parameters.Length > 0) - { - output.AppendLine("**Parameters:**"); - foreach (var paramInfo in parameters) - { - output.Append("* *" + CSharpName(paramInfo.ParameterType) + "* **" + paramInfo.Name + "**"); - if (paramInfo.IsOptional) - output.Append(" *(optional, default: " + paramInfo.DefaultValue.ToString() + ")*"); - - output.AppendLine(""); - output.AppendLine(""); - - if (doc.ParameterDescriptionsByName.ContainsKey(paramInfo.Name)) - { - output.AppendLine("> " + doc.ParameterDescriptionsByName[paramInfo.Name]); - output.AppendLine(""); - } - } - } - } - - } + this.WriteDocs(member, output); output.AppendLine(""); @@ -226,7 +153,7 @@ protected override void WriteInfo(Type type, StringBuilder output) typeType = "Enum"; // Print the type name heading - output.AppendLine("## " + typeType + " " + type.FullName); + output.AppendLine("# " + typeType + " " + type.FullName); if (type.BaseType != typeof(object)) output.AppendLine("*Extends " + type.BaseType.FullName + "*"); @@ -258,37 +185,46 @@ protected override void WriteInfo(Type type, StringBuilder output) protected override void WriteInfo(ConstructorInfo[] constructors, StringBuilder output) { - if (constructors.Length > 0) + if (constructors == null || !constructors.Any()) return; + output.AppendLine(""); + foreach (var member in constructors) { - output.Append(MemberListCategory("Constructors", constructors)); + var fullName = FullNameFromMember(member); + output.AppendLine(""); + output.AppendLine(""); + output.Append("* "); + + var constructor = (ConstructorInfo)member; + fullName = constructor.DeclaringType.FullName + ".#ctor" + MakeSignature(constructor, false); + output.Append("**" + member.DeclaringType.Name + "** *" + MakeSignature(constructor) + "*"); + this.WriteDocs(member, output); } + + //output.Append(MemberListCategory("Constructors", constructors)); + + output.AppendLine(""); } protected override void WriteInfo(MethodInfo[] methods, StringBuilder output) { - if (methods.Length > 0) - { - var methodList = new StringBuilder(); - bool foundRealMethods = false; - - methodList.AppendLine("**Methods**"); - methodList.AppendLine(""); + if (methods == null || !methods.Any()) return; + output.AppendLine("## **Methods**"); + output.AppendLine(""); + output.AppendLine(""); - foreach (var method in methods) - { - if (!method.IsConstructor && !method.IsSpecialName) - { - foundRealMethods = true; - methodList.Append(MemberListItem(method)); - } - } + //TODO: Verificar se precisa remover IsSpecialName + foreach (var method in methods.Where(m => !m.IsConstructor)) + { + var returnValue = (method.ReturnType == null || method.ReturnType == typeof(void)) + ? "void " + : $"*{CSharpName(method.ReturnType) }* "; - if (foundRealMethods) - { - output.Append(methodList); - output.AppendLine(""); - } + output.Append($"### {returnValue} **{method.Name}** *{MakeSignature(method)}*"); + WriteDocs(method, output); } + + output.AppendLine(""); + output.AppendLine(""); } protected override void WriteInfo(PropertyInfo[] properties, StringBuilder output) @@ -317,44 +253,98 @@ protected override void WriteInfo(FieldInfo[] fields, StringBuilder output) protected override void WriteStatic(FieldInfo[] staticFields, StringBuilder output) { - if (staticFields.Length > 0) + if (staticFields == null || staticFields.Length == 0) return; + + output.AppendLine("## **Static Fields**"); + output.AppendLine(""); + + foreach (var method in staticFields) { - output.Append(MemberListCategory("Static Fields", staticFields)); + output.Append(MemberListItem(method)); } + output.AppendLine(""); } - protected override void WriteStatic(MethodInfo[] staticMethods, StringBuilder output) + protected override void WriteStatic(PropertyInfo[] staticProperties, StringBuilder output) { - if (staticMethods.Length > 0) + if (staticProperties.Length > 0) { - var methodList = new StringBuilder(); - bool foundRealMethods = false; + output.Append(MemberListCategory("Static Properties", staticProperties)); + } + } - methodList.AppendLine("**Static Methods**"); - methodList.AppendLine(""); + /// Metodo responsavel por escrever o summary, remarks, returns e example + /// Atributo/metodo que será documentado + /// string de saída' + private void WriteDocs(MemberInfo member, StringBuilder output) + { + string fullName = FullNameFromMember(member); + var docKey = MemberDocumentations.FirstOrDefault(d => d.Key.Replace("[^a-zA-Z0-9.]", "") == fullName.Replace("[^a-zA-Z0-9.]", "")); + if (ReferenceEquals(docKey, null) || ReferenceEquals(docKey.Value, null)) return; + var doc = docKey.Value; - foreach (var method in staticMethods) - { - if (!method.IsConstructor && !method.IsSpecialName) - { - foundRealMethods = true; - methodList.Append(MemberListItem(method)); - } - } + output.AppendLine(""); - if (foundRealMethods) - { - output.Append(methodList); - output.AppendLine(""); - } + //if (!MemberDocumentations.ContainsKey(fullName)) return; + //var doc = MemberDocumentations[fullName]; + if (!String.IsNullOrEmpty(doc.Summary)) + { + output.AppendLine(""); + output.AppendLine($" Summary: {doc.Summary} "); + } + if (!String.IsNullOrEmpty(doc.Remarks)) + { + output.AppendLine(""); + output.AppendLine($" Remarks: {doc.Remarks}"); + } + if (!String.IsNullOrEmpty(doc.Returns)) + { + output.AppendLine(""); + output.AppendLine($" **Returns:** {doc.Returns}"); + } + if (!String.IsNullOrEmpty(doc.Exception)) + { + output.AppendLine(""); + output.AppendLine("Exception(s):"); + output.AppendLine($" "); + } + if (!String.IsNullOrEmpty(doc.Example)) + { + output.AppendLine(""); + output.AppendLine("**Example:** "); + output.AppendLine(""); + output.AppendLine($@"```CSharp"); + output.AppendLine(""); + output.AppendLine(doc.Example); + output.AppendLine(""); + output.AppendLine($@"```"); } + + //Documenta os parametros caso exista + if (member is MethodBase method) + this.WriteParameters(method, output, doc); + output.AppendLine(""); } - protected override void WriteStatic(PropertyInfo[] staticProperties, StringBuilder output) + private void WriteParameters(MethodBase method, StringBuilder output, MemberDoc doc) { - if (staticProperties.Length > 0) + var parameters = method?.GetParameters(); + if (parameters == null || !parameters.Any()) return; + + output.AppendLine("#### **Parameters:**"); + output.AppendLine(""); + output.AppendLine(""); + + foreach (var paramInfo in parameters) { - output.Append(MemberListCategory("Static Properties", staticProperties)); + output.Append("* *" + CSharpName(paramInfo.ParameterType) + "* **" + paramInfo.Name + "**"); + if (paramInfo.IsOptional) + output.Append(" *(optional, default: " + paramInfo.DefaultValue.ToString() + ")* "); + if (doc.ParameterDescriptionsByName.ContainsKey(paramInfo.Name)) + output.Append($" - (_{doc.ParameterDescriptionsByName[paramInfo.Name]}_)"); + + output.AppendLine(""); + output.AppendLine(""); } } } diff --git a/MarkdownVsix/Format/Markdown/MemberDoc.cs b/MarkdownVsix/Format/Markdown/MemberDoc.cs index 262d7f8..ee8ea9c 100644 --- a/MarkdownVsix/Format/Markdown/MemberDoc.cs +++ b/MarkdownVsix/Format/Markdown/MemberDoc.cs @@ -7,6 +7,7 @@ public class MemberDoc { public string Example; + public string Exception; public string FullName; public int Importance = 0; @@ -22,7 +23,6 @@ public class MemberDoc public string Returns; public string Summary; - public MemberType Type; public static MemberType TypeFromDescriptor(char descriptor) diff --git a/MarkdownVsix/Format/ProjectFile.cs b/MarkdownVsix/Format/ProjectFile.cs index 6fb695b..60d5c77 100644 --- a/MarkdownVsix/Format/ProjectFile.cs +++ b/MarkdownVsix/Format/ProjectFile.cs @@ -1,5 +1,4 @@ -using EnvDTE; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/MarkdownVsix/GenerateMarkdownPackage.cs b/MarkdownVsix/GenerateMarkdownPackage.cs index ceec12c..4c6c968 100644 --- a/MarkdownVsix/GenerateMarkdownPackage.cs +++ b/MarkdownVsix/GenerateMarkdownPackage.cs @@ -111,7 +111,8 @@ private void RegisterCommands() if (menuCommandService != null) { _commands.Add(new CreateMarkdownProjectCommand(this)); - + _commands.Add(new CreateMarkdownSolutionCommand(this)); + _commands.Add(new CreateMarkdownSolutionFolderCommand(this)); // Add all commands to the menu command service. foreach (var command in _commands) { diff --git a/MarkdownVsix/LICENSE.txt b/MarkdownVsix/LICENSE.txt new file mode 100644 index 0000000..b0d397f --- /dev/null +++ b/MarkdownVsix/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Lukas Boersma + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/MarkdownVsix/Resources/GenerateMarkdown.png b/MarkdownVsix/Resources/GenerateMarkdown.png index b22d975cbf00eda60e37587614e0677d0bfb525d..6089e92922859ed9a26db80f7e6ccdd822289502 100644 GIT binary patch literal 3245 zcmY*ccTm$?)Bc4ZT|hcgf{KK4X^PUz6;O}}C?Hh=hAIS*fQYo9ml{L_MCn05qzl}H zo&@P#h$KL$ic0TN48j|~?~m{O&di>j=gjV$XZP%x*-fxCzj2!5EC&Dpr%g?a?l3g^ zkFc>Y_I5qjeuiR3T{E?2W2|sCw|E9-4=}Mu0RVT$9|65m;1**XiUt|m1zGuf1ckT; zx&t90AxhqUJ}881fV+}^pl9~F&RGE9k~cN_+xl_NT5d#u__v5|ePXLN5mZ~8b|i1c zMPb(xrZjl>u`)?$u)*2IJeHSPQMa0$u5AqaI+R$e@8|}g+&&0Pa;fG zNtj;*oE{&j8m(%;F30)@h*W2jL|m9QYuS@PGHlgZf56t;KR~29lO#eq)#CQ_tsje` zGrsn&OpIQpf2iqpT@`rk2Bws(92C47deGN3CR?l6&deXVft3ZDNKeIAzF2Ua;a(af zeeL|b1Z{C)BA;qVqD@C5Sa@II9xUZ2?<4Gcf8>@8TQqnxbxX31m@K}IgO5jal53V`nQ1iuT*j6di z5FjBhF1=P`W{8)}saL$s`R-J}Kel@Gr92Db(awXCA5Mx|0RrpNLDzW2>g! zzfPRzLDylH&BZ4VW<_0kapgosyujyL?|8W6B$YsK;qmpuM{y-wTOR28(sczKqf?=o zcK}S+ED!!v{2fSPK2JRy0^U!RUVD#4AdkTsQQ*gDRD%A^5ceRn>4Xk&A&o&1ye$ZE zq0EI@U8;|uGKE`e20KibTAk8e*HckR3DnBJgVOt=uCq-M2$MQmosh`TUDO7*Oj54y zmeEXMyr(O>g(l_cCK&yqw<}-8>M+E)V=9#Aw5<-fiOInFQ4o=TdR`lR0FD3`fkg&v z&MOkeKt`q*VwERiu*%n6cEGThkv(Ut1Se;% zT(Xp!85@~VYiiw{wBbbJ)=_1CHHUYp(R&c>U_y<6Lgdl(V(cL*S^egdQB9rD$D{C= zzbQYm(TS2E9V8%F6}!svVIIeWEWZM7n5^mRtkMc8_!w~QsA;0R8i?>MvKtkm+kF?o zMlC?0iINJ(h3P`Ko%_a^?08Q;;m3(}V^4Z(`o^@@#~Uv(yka#I`h6Dx50IP%aprY>6E1z=dnh zzAK*RV>bC(%bQByf-lch(a>H2_{i?=zuVnlxjpA&%UR=0cT_^u*1)m8*6V}0_An4e zNHLMiIWR%NZ1&HS4fH(Ijk$!MxM3I9cM-e)HgL?~=KdeYKI+xa;VO9tr70~vnjNf= zvr>07J*5KgV?WT^j03-I+bA?^YZ|H`uUqmEZ#sIP^S26GT8?&I$xN5ek1Z4B-)G zaHE&a(KoTOTWxVH8dEj&*{PxVaE%Q!-HP&I?#qb+kZ><_;KziOqfiuGxX9Z1yl(qz z=EhR(yVDu|+>GMoGmp2Z8}F4XEtEgX+C4c^?nI2Vbh07<+kl(l=>05@{5+viqLI5h zVK7pLu)>t#Tvs-er&fv$MaSo8{@$KxjVPpHY^y4Gb9443^fX07tINxgE-jbL6ZQLi z#2)AYdq1*0WeAtiNPGWOn2;Ke3T#nsE_MXzGyW?vwMBh{A13C&zL3Kz8*|WkzX{F$ z5%c94k0TIW{a#?tBZcIcNyEqPC%8vxZt#y&lxx@a$`0lX!9l_Q>OWe)bNH|U^`jaM z7esL@V|dde6;U;BrpKp&mz+tLu46hv)n9*c?G6`5`c2OMx8+ zx{~3~%fS0^VONO{Z1eL?mA^aGZS?P&gi+a!qMyXhRQAYTm0iqO4=E?k8*jC-vIIP9%;w*5 z-*u2&R>ZU;oY{{cg7~=e1<>U1#_bTLqBrW%R}Aj?oD6P>jzH~{A)+p0e%iV18VF-jBCJ2y5T&D)EHl{jg9~J~>K#bL2{F z)|J27DQP5O!LJf9Jq~GM>{xWLgr{e~D~` z=j*TcL%tcgIG}%J5VEbmt=J zhuD%Doqfi`een(yrBTFFo_poP(>ZUdADn0}5v?o|dv7_n<|zxzieVqod*vMshf{s&+a@+=V^vQJzrgwx*>uyUqqq?~DtP>IOZvarw-x z%$8>kwLfdogPBU_IU&ry|3b@#$WkV%F)ytb&8@4Lct@fVyUQXq<|izGNOck{-3P=> zpth?1f_Ye4Urp-BTS+$FSZHq>PCBYBp;MMOEKKl9b0OfOGkYPn*NJHtey#L~9`c=s z*w5TLmv=VV?fGGhl*rtz)Oq6I)o+~Q&{qySUHV3|!+c_QvV$WVC=edvFgOQabKJC# z7e)9BgNrO1&qdNIX1{CfWw*jBl_n-noZE&K(Pe$HGj=u53kR6DJEE4>-&; z?b-R-x3Ux2tmUATAyl0Zz!ssm z$)}jbZ5;vJuGsyw;M*4sv!3;5oPN0J(mS+K2IAhJ?O3U=D06DnR%!eYdB^#`H;CDS z^bjMpxUu;U$GoG;IpWK{!#};URv7&ufU&mwpahxN+?ApRf&QBe;{TXF^plj*45u<$ zo)U3wxP9Tpd+#Sr#dFwFfAa6J8ERVUMJ2rDk{U0uDWaCT9mT)R^Ap5eGN2yoA`P+) z8%3N*Tuk8qi8us|+N=p)k+Iq3%ToQC-WswobJ_2Ql{}0y%xrA^*kU|7R;_Ad{q>p;pz{j)QSkF@6S`pM|jUh%fK@=Fc7OC;%5t_)2AHIP00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1Sv^GK~z{r&6rO} zR8bVhMO+m@n`n^>S1nuxLD3=*TeOfsmlen?+6F={#2~abZOoueAZTJ(h!8>v{t3;> za?E)|5DA$%%#4KTQ&4A9oX&T-XSj3Ub>17D7(e)!JLjHr)!%vdzW1y+tlHh(J<9H6 zC)uRE&VI~3rPB^9A}Xs7r5JEE`&%NBp!)jyJP!>G(f0N>8gX8yD`m6Unw_1U4t9(0 z`^R-SPl)q;AA1VsnwSfU>5DfL{NbJ}g%6z=Y!y2`Ha4b!&wZSu_228{Z}{|MX*t&j zZo(SpokR_TtlRpvN}qckDl^<=y9pd?++5B0pB~($m6=KGCJ#9-DB`AjX=;A-hyG_1 zN-BV`t*0W3!CXzHQVMc9m8MO9D`43PoZE#OT-5;IfBKm6Z09Y^y}%qG^SC?X#c8;% zmPW2zAT)v-cn0$>D6qi4bZ1++_WElMyK_xfRaTMM6*J>-K>W+fd8@3$k!07x#Wsa& zh6e@)sHdmL2_OEsyh5>94C^nU#%=(NtDNIFl9sXrroHe%Qf zR#RHk57Kf$F@4Ym6oL;2B#=yiGL}!B8j$3hx#l>m9^&~A$eWpY>x2()toyQ7R+pg( zF;^30j9tL+`*eCvE-0oC(tt4duu~>1a~uXx^37ax999qU{L_hv32JL=bHaz`K$0hxe2L3grw7Dy*V%vN z@pF89A^<;=&QMcR6D=$(V6A3ds#K@}eDzQ1v^=?>zyKfhChP(p#i(@(kW64QmQS4) zkXbK z3DUMSq1eYz6R-(fVy2zqKPCsu9LuLp3rKRrQR_M8gpZvtIXRj8-rL(t$z&3146={t za`hC1ryCPE8iCz_=YDAha^&$-WCO9ipLYNow%GtP4m$-%g{;#8a^T^2W)0ic`s=u3>eS(!53jy;Ap}TwK(!j{X4>h0jPj$#%z}oK71%7O)%j{Z2*9CjSurx-l4;Lit}qY m*JGpEo(&`nZYkjtQN=$$-bTw6(Xv|r0000hv=ZCR0jtxQyMDHQS~ zm(7xVJ|F2~v$201|BEzcVd0R!P&7(-Ab%w=3kxa3ziVG7dFXpkv9aGICnTR8Q z)u40bMgE*H6tp6L1)+0AM*f^I6tp6L1)+0AM*f^I6tp6L1)+0AM*f^I6tt#O1LTQW z(>1ey?|Y$^Kv3gI z?Bzv9y{H0zs0Z+lQ@*SK>l*b^Orv$q+GO2q;TyhDHk%9e#O*zQs_T!={KH^ z$X`y{qaXgAj2wK?GLdZ01~RngX-mIiqK6Euzmt@6gO>i|<%s;{Bn|xID{dgUv)gMD z0{-z8*OSb#+Wn4!Klly43wwT-YvPWV1M-)Xw9fx}l6ZX*0jB)H_{Ue?MDmyR^Ilq5 z;IHY&@zo~3@w`C(a?)n}fumNRXH!Ok27l_8X#P4Wrav+K*z>RHK+_jU;p!2?Z#*r? zUryRQe_)y3@pGd+$n)3qW8?Sf`+i8fp@~0@mt1=rDQA*$neh=D`TGzW7p0m%a31Mi zqJ^mD4}OC?e?|SururY;HNTF>G(Rr+x?7RIoQN6!H>aUXF_y1yWEf=#S zz5OBmdgYB|^zd@SFW+~Nq_+K3zi#?GDfD$$-KBn)$X`yjJby^35I;%#0$&+pdxOCk z#)wKI*GTf;-`3rz4zPN^aODsw4Sh-yE#J`G^tM1kE@LiZBY&5I5(KN}55cl$-Z9uR z#%zqR(0_u{5Bw4r_>)qBq+5Sxu;lr}9r?Ba&tHo-)*ei*`;Kt_ zKrYvn*vP*k3qLj?f0|f1lc4?j+ch1i=C5&Xdsy=`@u%@hBUiL}1AaV!xBJPbC=T)$ zNyeSK9e+rHwFhhXQ$M}Ga3`teUw!A?xmFUV{esk%`$^{1T3RQJR0r{Wjr@I!PK)To z9|C22w@}#DbHv5ODLNK#N|*_lUxxVu){ca8;*FchaM!#*=8uuTQ1q@m-0*jmkRTBB z3l09X4&e0w?5Qn3B$<;fbX++tNWtD2`P<9K$+zD8;r`GU1l9xVzo*R;4ex)3)&XBL z=|W=Fm$Wve*FGcicOqQzA9(9tI*)gY*}VQ`jYE=-|JCcro$oMM=RbX4yA8AfvZpta z)YhqnALz)?-Z`Ge4UoTkYRPqXm}Je@#r5P5eTC$jZ)*1*>YQz482T3jo9`XVQ)R5t ziw+=vL!6G5%*i*&=#f_~P3A<4V|HO$TZFFx#_{4AS{S zrju@U0Qt*M8Nay2)H%vlf5t%vP3-A-A{^yn&a)0&x_E)WZ>xYQmFhd*%=Vg?$o)SW z`TKuk{&1|#0sR6POXd$hI>5)TrycprNf*WuSp5$3MA=^J-+R&Kns+>6gmwEakjtHO zY~=4OBfAjrEkUy7R-J3pO(ge8r!aUJbpZJbak=);#*@d^3B>8T(cFby!nk337a)Hj zDo-AbssqU16K31Mji>|2-xjH7&qmV$QRCmatDV5U)PBtIqlZnLFJ3tBDV=!#HB)?c5oR5T8vm*H++pmU%gW~V z{I`Yk88Yqs&Xx_H()zIbfGIwI5mp^wvWd$4PgwbbE`(7BqQ?K~l|BN$Mc~Jz=UAr*v}JEFay{9yT3_8h=Znhs-f(9Vq9AYxXj6TV&+#R#L%+3rYuI&0)HAy0#t} zzH#(=Ab+nC3od*RIsj{s*g8b`9wm3K%~J-EzbA189ykyk7@#^p*E$>P4n5QZQR5G5 zCpWHZo)FV_`G3Cj!;21#e)O8Lh6s4Gbwovku~i0p z_~wDFJCo4?R#xo)JO36Nla=T!!yoj+P6v4QurE!C?n`F1w%ltyz{(O8{)Iw;6bktX zG3B!So}pGcP|Y6tdvJ)>l6ldAsPWeX)8PMj9q8xwB!cIjv1dh;)dA$sBpI$VuLJO& zAJ|0qsT_Omt8*&WfwPYN0_0yU&G1~Cbin7j;^Kh44j}*V@V3fHy>)=`pE>P5@|#&R zY|Y!7*P5~z)bBqB`Tf_kzkiC%{oRw6=H4HQXM2SyLSqVuP7MWsw!s^rLD zN_@T}%jiI|S>Mk%z2i~e_h%82Ka)hT=Z?0mWd0v#lNaXGeS-vtj1Itff^6Ln*+TvT zIFin*S1#Aur4LTI+cqWdI`B*5-9NOO?pY+cmvtEV!`Od5@6QyA*84%)La2kMTmEos z_`O2-9V2+A6RW=HY5#%jnXOW}4Wh9BKaJh{?EB znYN<_)2YDBYs;6qYX2D-;4F6a0PKgz_N#;6MJx^XaWTDH!&v`&FNJ&z_~yi^ZQ;k? zsr@g?d9@Ct+h*!(#K-n3)Y)GaMR)Cv{B=>)i~l1J{m3VUisu=hQjgJKW&L;kwd zdH&Fc*uHg>FZ0r0pQH82?OI(j?f$#S>7EnSSUp{X4h-*~TQObF(mG%Mxo4T+`F9`q zFFDiOV`~Nn&HLfQyf4&?LC*iOyp89X=l|Zjt-fx(tD}|t_y_v8%QGIBEY03mCOk&s z`MY_)?b+R7x&!jp#nFiDA?L_n=O^?0H!6E5dH=Pm1p3TwP4)g5sz3jY%wE@gx&JEj zSDig*j;j2Tycx=)eupEdIV(%kf~hBdD) zTVh)OHRC6fN$=@X?ggP}NXFmI+JQz1Gi}OU$lj$sM~#0Y*7-3!Py#3clmJQqC4dr8 HP6Gc2_(1Fp literal 428446 zcmeHwzmFYBl3qPFmz*Euki&m~ZRmipgt26b1bqtY(xX9RJvsvBK&Ri~Ag*@=9a#iM za>RpVtU*8~r_ZFd4k7cV&(R$~0mE^Iv%p}VGO8-7vf^b_R#j%ytLpdl?(59T$c&8m z;`{Q|D|Yu3#iqDf6vb`VUM>Fc--_b@xT|l!t*@^Y#ee+oMR9ssUH{vaqWB-L-R#@d z^*5WM_=o@L7PzlX@mcZBzuOf5`+w2;>iQqQDvE#p^Tw^OuRkk_=l{HM>#OTO{H`ee z{l7XV<@(d&o71bsfBk=(;{JWIyXyx<@%F~G+TUsMkAG7X|Mx##tNpoa=jR{(^R?RF zY4L}vMe!g0%eCU0%3)Escqy;)Yg;w@-<^SM+ilgj@2=}!+v5EE+!=P||BKy@dhX@^ zM?>_@`*PQ_e0}ux^t-cc?l!^xKI&~B_|Jm?_}6mI@6Cfg^bh{|tZVz=UxmPTMqi9? zjDJSke~0}m1b~05dB4Z}0RLI$w$J#4Fk>6H{v7J_xNQA-Yy(8M+kIUAd$2Q>KV(#}CpAcqj~A*v73thx$A&TYnzg zfPag*-(!42n6Zspe-8C|T(S-Mz(SfY3FNy9*<%Fw&s41 z@d;tZHg5en)aP;8`t#TZ{C(8hKI0R@jBVWdbEwbbvi0Y&4fwa1`#r`dgc;ko_2*EZ z$7So!V;k`IQE&Thrj4{dsHy{w?NykMRj%#x`#KIn?KI+4}R?2K;^0+dktH!i;U)`g5qyxb^2ypT}kE&tn_#_fc>Aj86zNwsGsvp+1kx)}O~V;NN2I_ZXiLW^Ciu zpF@2fm#sgKZNT40z3nqTAX^?6*j{yeq; ze;@U>&-nP5j>fKMmdfyYJ5Aj@|1?`~Nz8`|rMc(cMs7P1=9V_WH-+GLk9#4=#Qc zXDSE2S$VEq1Lv#0rjbl&CY{YMtRidLt<*!@3M4#$2!^HT0~ zNA5qN_*JMH1xD^aHt%+RC+qfN-2Rh_U&WwMVATGf+H}VE&f28C-kAL-7rzQNNP#i? zkI%Wg!b`j9YWvfj$gO5p*-0pV6^Ece-`3@gPIIL-IHw{bNf(BIE?e}ug5kM587yKBFHC$=9@{OUgY)BbjQBSR?A zjd6(A;rq)^1c3^4w;xhfzQx+hHZ<^}>whl*fquxv-dK(5kVksH z?FAMZ=%)b3HO6Ceha1{%f2@v{cj{Dt2dj2i@momu_X>{a6cFeKSMLut34PkP1xLDB zwiFQC?}k;sePbJlmta8qYrx&O+|{sz+GW9P<)DDyt*$B1`e}MYGCFH!4~lnx`#J!L ze&se^gHiiS?5j;m3WWEM=hUVje-8>J@77loR04?9pp#Jqt={b&3;a~Pey`UvZ(=`K zok+b^-U*~Y(5C~>k?Tsbd)Kk#%P^DxdTKCq|3TZ2ufbV&e+{Vt*mD^a2o%pEEd?ks zi(_t&Uf!HqC4jJNcEzn%@U}Z@dlvya6Ky~TXJSf70VA+y7!(NhYcOE{vB{S)C;{x% zK&HR1z)9N=tw8|VZjk~L%8(i8o>qaNQ-eMD#e4SD+T(uB4L!tc>u;*CXteTyu!! z>aMr&Xm?KVN))m?=d5(w9rLeXCxCoJx_#gSe87*cCj2Yt1NwkId_{Eo&7Kp$OA_*c-!WzffN>({jHZzwtX zYKOYL%DVflJKA2|t0w%~j&yr>EBi%vw7t4s+0WaNZttYBcL)8e(*9R}q}xBE32Jyn zahL2p|Dsj?YuI_$r+-xjxb;W6eL}b=yrMYU>FAQHd%fY6|73d6-LiY-5Z-o2x>qj1 z?tr}N56=bIgD&~H8?*PqLjax2ko;>`fZh%6#_{jlpsa7t2F`u&24`f~H>mloZg96; zt~2PYvTGaE?p26t_nizj+ZJAS?`PoI8~6SOC+E%j#=XCRXK&qm8(hEO^`3iggIkSS zJ@?)Qt=)IuZqV?t7eaNlgecHzF+fb}Td^9Hqj&wagt z)AN=9+;d-V;MSd!ecyd$sOxa;bxBR<43O&w=DK=#Wt z?xX4Fm1`V$(!EF*&FMHhG@BnqFMr^<(b1=Ni!(Qi$2-5i@S+`WXH%~lcXF(qpM9$A zZVTtgojld$cQ2Zb(>1BLzUJS7a2r$$DuY{II;3HDHk8K!jhvM~OI^la4p%?m_G|fD zo#hWwm(f=yx77Khy=ouz3OZV<1EzA#!=*3UsqsoM6=C;rv%N*_Zzt#XsNMbjKT(P3edg4??z?A0%^RDZYQjLwhp^r+677tVpJms?NYs&j`1{z%vLrQ-t?mdfh7)z>Y$ zcD~)$g=6a+uXCq{t)nvSRo;?qw!7WG{BcJ-zwKV9?!`Rcx_Q(Xj_3Przn>WSVw{MGg@7@*f-@h*|E-s1>A3hX6|Mao=<(FUBGg=@31Xh4R zdA=!e-nndFN}k&AWlR5#mZ&n0{4W^-N}aXgOP2i|@L#KRcpUY=WC(=Itd3r??4f_P z(qRMYf5{LCmsuUXWZ6UiYNf*l)c=wp5H7PiDzo3L>`TU%*D4(zm-umgWSgsA>^GM`89(YD zuCq2O@#Ff)HdnpaZ!Ui_e$-#9ba-6i$MunIu6nWGT>fPIsDHT5+Ni{j>m%D-^GJe!wt8{o=;>Y!oZLWH;-(3D={HTAp&f2KNkLx4bT=inVx%|oa zQGcz{;ccxI@`IGUZ{^2@nqY^)^k8E?*i~Z*EC*w!`wMvJ_C4O8V+2*Pj z`_1J~#*g}k>#U7R{J1`{%~dbUl>L0GNHY)Ms z`p7m{z1VLqe=>g5U#oO@T;j*|k!`MevEN+&Wc;XqxX#+B#E2bflMQk@2JcN}-iuiQh7-tVbo|NBxyTE5i~$4e4C}Uc>%# z`IGTm)jwCf$iG4$7oMoUKtR#CHY`@F|NfDyUf@6YPYC4VljJYXe@*G(afu)6Q?|M4 z#eQ@7lkube;W}%h5GJe!w zt8{o=;>Y!oZLWH;-(3D={HTAp&f2KNkLx4bT=inVx%|oaQGcz{;ccxI@ z`IGUZ{^2@nqY^)^k8E?*i~Z*EC*w!`wMvJ_C4O8V+2*Pj`_1J~#*g}k>#U7R{J1`{ z%~dbUl>L0GNHY)Ms`p7m{z1VLqe=>g5U#oO@ zT;j*|k!`MevEN+&Wc;XqxX#+B#EhwH43O8mG!vdvX5 z_M6L}j34#aDjgn|_;G#K(#rU)>c3PxkiS46OmlTqtX6;i9ra%(0LE^W} zD(g|n_)-60nbkpwpN{l0Ei!)8UoCaeAn{vfmG!7({HTAh%<7=TPe*#078yV4ua-J! zkoYaL%6e2Xe$+o$W_3{Frz5>gi;N%jS4$lK+QC47?5*2W!~aXqd+)Kb+k<`-kZDllPI8O8aBkU z<{5`5{sany(^N+}yJ&lu;*Y0*nrYY&&AXa#xZ;ncKse3#XfF`S#Xm`XP!Rc07|$;< zqc8mo#lLx@s$;_U{ttzb^djcI?C&HOf3vxE=g#jEQm>ZUQJ^pV48`AExpn8xt>pYS z8ygDrWuK$?b=;q40KkF*ed*^Y{$_JhZgD&H2rTi-O@Y4b^Avxxxmj(JegqN%c`4AB zexBl&hhMc#`Vp9!0)5%%Dt>wRRU73v0&`NJFa2D_?;P4Wj=*db=*vD^@%iwpHp_Da z=Al4e`uU3A9Ddbyd5*vg6zI!7WAVMiui7!w5tvGWzVvez-#h%OEpr`#NfhYIK5Owi zhhMd8wj*#l1^Uv@TKw+eS8bc`2%JcPzU=SZx&38Eg^I(k+BxG9=uVd}`_tL~X^_Z# zXTJ4$mK${{kNeoW|CJ5klP}!I%Gg);gMVyxZNGW_O3ALoZ}hQu|0~ZCc;))g9~AKr z*bhb<$)W@0vs#8DFv@#BuNDA*G}=$rLG`hBf1lJNa1igkZQJ~d!W$mYP18aBv3Gx; zlp}CB@9Ta2?92XsJUt@`ItU(q)mD>_z)`$+d+jA(4fG_uZ;TO*Tj&}qep7%)*v^oeKewAy# z^mU()z=iNW34%%o;lob@pgaPX#QP)!NC)A=Ps{(#=gZ@L5(KvcBySz=8$n6TvXFuTRl4ipG+U1Ni zLH2h-0r#(Htf8fg8fzl$>4XCAnckQ}>lQfH#H)0|AuE%c;qamvQ=7r? zngx$Gk?(c1p!X&=1KNs(k2mpmI(pEZY0ZT`fBBXs39q9^?M-UB`s|fhnoR0WU)W>j z_W2oZ+wFGxQ$A7bajZX2GlA@a~y*jyBqb@!WQzgJE8RkPo%>=&B- zdSyS?>?f67GuHwBRkxp!12w#&xJ&kr`ubaBKiBPLfLq;82=|0n9^fjv3GdqNP!*c=lpi7?b#_YZD5J2aB0lEV8Zg4k_f8PdWeS0==?t3>l zBfGvq&2M#syXA77L1&d++n{!@LR7o&WU$$`aI7F;J?R)O)4V<301mK?gdIPuaob3DVD?@D$xUV*F=gEaz9&lf6P}@W9%MILl zK73d_dGe%q`t)h>?Af#8`Sa(+%a<>U*RNj}Z{EBq-oAZXynFYqc>n%=adB}`eE9I8 z`1z-g#V^17QvCX>D&=YedPpFY1seDLkEFXy{!_x0J{ z-zB{AS!HqGJLf-*-n=Tk()HDw^$IzE-+8s1x9HCAI=_C+->TYz=YLK6b)8@N>Z?vB z)fQiuE6V7;@ZGsTqv{-VN4_Yhxdo;7+qb{^%=@dASIOvIpM3UJIsJCEL%rli^H&~k zkoC)YgDcm|%iHzjGNyXP?Jvq-SifF5D^vbm6-Z~czr@9L#clqz^YGOb5l1=C`^Kp_ z_eJ5p)rG2p_U5%+j*CXBp!}%Yd0vl}lpdRoXDo{HlgnMSV{y136t5S>IkhK6v8C31 zp8QDdt)eKO7u<6X(zb5cJ#5>3+-z@A``gL+J!*G<|4(%LNuN_s-Rr)4HJ?+jx(oga zd`^Az=+WM1)mN`xsh?HxIhDag3k24OK>azjKJWugl~TY^53#-bmdaOrCvp2Wk96Bn z_Uf*f95lVo`et;Y_HOFsRVV&b`_l7|#h03Y?|P!Ef1k;>uFPL&7Pp1f-Ed=X7B~O> zwbDgt?<~H-cYm7=xo{KQ_xg6vg?R1u?dDGvl{b9kfo`Cx+fKT}`-(C-`J8Svn;W+B z_RQU8mQj6n<$8HT*I3Ia$|FKB@P5LhV!)qTnh?~4-g z{^;F}>iWws-RVo;23|Ms8TEX5o#^kz4SJT~9s}H{{L_d2YwpAT@4l$6Z@B*F?r%3< zt*(n3H?Cc~dGp$}YPw75CiQOIxJlWayU&7CUKj4Ocj)>b z2&*CM@9y6{Kx%2_`hcUAA9W3KkomJT?5CQKlBg%A2a`tJ$L9I`agCJ9CQBAKlFdh z{6F^Gp?~QA*fns>`9uHE|1tCb*mH;eq5osoz%l0!{X_r9%>QH09r}m|JZYf{-OV4*T6C7 z5B)>`$ISm@&mH=Q{*PS)$DBX(5B(oA|BpR)=zrPz|M{nnyEVTKt*

N3mPu2mM3; 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 + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MarkdownVsix/VisualStudio.DocumentGenerate.Vsix.csproj b/MarkdownVsix/VisualStudio.DocumentGenerator.Vsix.csproj similarity index 94% rename from MarkdownVsix/VisualStudio.DocumentGenerate.Vsix.csproj rename to MarkdownVsix/VisualStudio.DocumentGenerator.Vsix.csproj index a2aae8f..429e905 100644 --- a/MarkdownVsix/VisualStudio.DocumentGenerate.Vsix.csproj +++ b/MarkdownVsix/VisualStudio.DocumentGenerator.Vsix.csproj @@ -24,8 +24,8 @@ {3CF8B458-7D40-4207-9F76-3AAADCEA8344} Library Properties - VisualStudio.DocumentGenerate.Vsix - VisualStudio.DocumentGenerate.Vsix + VisualStudio.DocumentGenerator.Vsix + VisualStudio.DocumentGenerator.Vsix v4.6.1 true true @@ -59,6 +59,8 @@ + + @@ -83,8 +85,18 @@ Menus.ctmenu - - + + Always + true + + + Always + true + + + Always + true + diff --git a/MarkdownVsix/source.extension.vsixmanifest b/MarkdownVsix/source.extension.vsixmanifest index 73fc1a1..9110fcb 100644 --- a/MarkdownVsix/source.extension.vsixmanifest +++ b/MarkdownVsix/source.extension.vsixmanifest @@ -1,21 +1,25 @@  - - MarkdownVsix - Empty VSIX Project. + + Document Generator + An open source extension that will automate the documentation of your C# class. + LICENSE.txt + index.html + Resources\GenerateMarkdown.png + Tools;Documentation - + - - + + - - - + + + diff --git a/MarkdownDocNet.sln b/VSDocumentGeneratorSolution.sln similarity index 92% rename from MarkdownDocNet.sln rename to VSDocumentGeneratorSolution.sln index d79297d..58752eb 100644 --- a/MarkdownDocNet.sln +++ b/VSDocumentGeneratorSolution.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownDocNet", "MarkdownDocNet\MarkdownDocNet.csproj", "{177B50B5-4561-443B-BAFD-A3AB19519324}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualStudio.DocumentGenerate.Vsix", "MarkdownVsix\VisualStudio.DocumentGenerate.Vsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualStudio.DocumentGenerator.Vsix", "MarkdownVsix\VisualStudio.DocumentGenerator.Vsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From f5a4dde1643a89d59e78274e027b7ae9298c41e1 Mon Sep 17 00:00:00 2001 From: GustavoAmerico Date: Sun, 7 Jan 2018 15:36:49 -0200 Subject: [PATCH 4/8] =?UTF-8?q?Reorganizando=20a=20solu=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Properties/Resources.Designer.cs | 63 ----------- .../Properties/Resources.resx | 101 ------------------ .../VSDocument.Format.Markdown.csproj | 38 ------- VSDocumentGeneratorSolution.sln | 4 +- .../MarkdownDocNet}/App.config | 0 .../MarkdownDocNet}/DocParser.cs | 0 .../MarkdownDocNet}/MarkdownDocNet.csproj | 0 .../MarkdownDocNet}/Program.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../ActiveDocumentRestorer.cs | 0 .../Commands/BaseCommand.cs | 0 .../Commands/Constants.cs | 0 .../Commands/CreateMarkdownProjectCommand.cs | 0 .../Commands/CreateMarkdownSolutionCommand.cs | 0 .../CreateMarkdownSolutionFolderCommand.cs | 0 .../Format/DocFormat.cs | 0 .../Format/DocParser.cs | 0 .../Format/Markdown/MarkdownParse.cs | 0 .../Format/Markdown/MemberDoc.cs | 0 .../Format/Markdown/MemberType.cs | 0 .../Format/ProjectFile.cs | 0 .../GenerateMarkdown.cs | 0 .../GenerateMarkdownPackage.cs | 0 .../GenerateMarkdownPackage.vsct | 0 .../Key.snk | Bin .../LICENSE.txt | 0 .../Properties/AssemblyInfo.cs | 0 .../Resources/GenerateMarkdown.png | Bin .../Resources/GenerateMarkdownPackage.ico | Bin .../Resources/logo.svg | 0 .../SolutionHelper.cs | 0 .../UIHierarchyHelper.cs | 0 .../VSPackage.resx | 0 ...VisualStudio.DocumentGenerator.Vsix.csproj | 49 +++++---- .../app.config | 0 .../index.html | 0 .../packages.config | 17 +-- .../source.extension.vsixmanifest | 2 +- .../stylesheet.css | 0 39 files changed, 42 insertions(+), 232 deletions(-) delete mode 100644 VSDocument.Format.Markdown/Properties/Resources.Designer.cs delete mode 100644 VSDocument.Format.Markdown/Properties/Resources.resx delete mode 100644 VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj rename {MarkdownDocNet => src/MarkdownDocNet}/App.config (100%) rename {MarkdownDocNet => src/MarkdownDocNet}/DocParser.cs (100%) rename {MarkdownDocNet => src/MarkdownDocNet}/MarkdownDocNet.csproj (100%) rename {MarkdownDocNet => src/MarkdownDocNet}/Program.cs (100%) rename {MarkdownDocNet => src/MarkdownDocNet}/Properties/AssemblyInfo.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/ActiveDocumentRestorer.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Commands/BaseCommand.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Commands/Constants.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Commands/CreateMarkdownProjectCommand.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Commands/CreateMarkdownSolutionCommand.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Commands/CreateMarkdownSolutionFolderCommand.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Format/DocFormat.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Format/DocParser.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Format/Markdown/MarkdownParse.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Format/Markdown/MemberDoc.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Format/Markdown/MemberType.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Format/ProjectFile.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/GenerateMarkdown.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/GenerateMarkdownPackage.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/GenerateMarkdownPackage.vsct (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Key.snk (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/LICENSE.txt (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Properties/AssemblyInfo.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Resources/GenerateMarkdown.png (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Resources/GenerateMarkdownPackage.ico (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/Resources/logo.svg (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/SolutionHelper.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/UIHierarchyHelper.cs (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/VSPackage.resx (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/VisualStudio.DocumentGenerator.Vsix.csproj (74%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/app.config (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/index.html (100%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/packages.config (61%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/source.extension.vsixmanifest (96%) rename {MarkdownVsix => src/VisualStudio.DocumentGenerator.Vsix}/stylesheet.css (100%) diff --git a/VSDocument.Format.Markdown/Properties/Resources.Designer.cs b/VSDocument.Format.Markdown/Properties/Resources.Designer.cs deleted file mode 100644 index 7701236..0000000 --- a/VSDocument.Format.Markdown/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace VSDocument.Format.Markdown.Properties { - using System; - - - ///

- /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VSDocument.Format.Markdown.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/VSDocument.Format.Markdown/Properties/Resources.resx b/VSDocument.Format.Markdown/Properties/Resources.resx deleted file mode 100644 index 4fdb1b6..0000000 --- a/VSDocument.Format.Markdown/Properties/Resources.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj b/VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj deleted file mode 100644 index ffa4bf3..0000000 --- a/VSDocument.Format.Markdown/VSDocument.Format.Markdown.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - netstandard2.0 - Gustavo Américo Gonçalves - GAG LTDA - VSDocument Format - git - 1.0.0.1 - 1.0.0.1 - True - 51da6188-cd28-464e-abfa-e4e9b71869b2 - - - - - - bin\Debug\netstandard2.0\VSDocument.Format.Markdown.xml - bin\netstandard2.0\ - true - - - - - True - True - Resources.resx - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - diff --git a/VSDocumentGeneratorSolution.sln b/VSDocumentGeneratorSolution.sln index 58752eb..d7dfd84 100644 --- a/VSDocumentGeneratorSolution.sln +++ b/VSDocumentGeneratorSolution.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownDocNet", "MarkdownDocNet\MarkdownDocNet.csproj", "{177B50B5-4561-443B-BAFD-A3AB19519324}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownDocNet", "src\MarkdownDocNet\MarkdownDocNet.csproj", "{177B50B5-4561-443B-BAFD-A3AB19519324}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualStudio.DocumentGenerator.Vsix", "MarkdownVsix\VisualStudio.DocumentGenerator.Vsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualStudio.DocumentGenerator.Vsix", "src\VisualStudio.DocumentGenerator.Vsix\VisualStudio.DocumentGenerator.Vsix.csproj", "{3CF8B458-7D40-4207-9F76-3AAADCEA8344}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/MarkdownDocNet/App.config b/src/MarkdownDocNet/App.config similarity index 100% rename from MarkdownDocNet/App.config rename to src/MarkdownDocNet/App.config diff --git a/MarkdownDocNet/DocParser.cs b/src/MarkdownDocNet/DocParser.cs similarity index 100% rename from MarkdownDocNet/DocParser.cs rename to src/MarkdownDocNet/DocParser.cs diff --git a/MarkdownDocNet/MarkdownDocNet.csproj b/src/MarkdownDocNet/MarkdownDocNet.csproj similarity index 100% rename from MarkdownDocNet/MarkdownDocNet.csproj rename to src/MarkdownDocNet/MarkdownDocNet.csproj diff --git a/MarkdownDocNet/Program.cs b/src/MarkdownDocNet/Program.cs similarity index 100% rename from MarkdownDocNet/Program.cs rename to src/MarkdownDocNet/Program.cs diff --git a/MarkdownDocNet/Properties/AssemblyInfo.cs b/src/MarkdownDocNet/Properties/AssemblyInfo.cs similarity index 100% rename from MarkdownDocNet/Properties/AssemblyInfo.cs rename to src/MarkdownDocNet/Properties/AssemblyInfo.cs diff --git a/MarkdownVsix/ActiveDocumentRestorer.cs b/src/VisualStudio.DocumentGenerator.Vsix/ActiveDocumentRestorer.cs similarity index 100% rename from MarkdownVsix/ActiveDocumentRestorer.cs rename to src/VisualStudio.DocumentGenerator.Vsix/ActiveDocumentRestorer.cs diff --git a/MarkdownVsix/Commands/BaseCommand.cs b/src/VisualStudio.DocumentGenerator.Vsix/Commands/BaseCommand.cs similarity index 100% rename from MarkdownVsix/Commands/BaseCommand.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Commands/BaseCommand.cs diff --git a/MarkdownVsix/Commands/Constants.cs b/src/VisualStudio.DocumentGenerator.Vsix/Commands/Constants.cs similarity index 100% rename from MarkdownVsix/Commands/Constants.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Commands/Constants.cs diff --git a/MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs b/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownProjectCommand.cs similarity index 100% rename from MarkdownVsix/Commands/CreateMarkdownProjectCommand.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownProjectCommand.cs diff --git a/MarkdownVsix/Commands/CreateMarkdownSolutionCommand.cs b/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownSolutionCommand.cs similarity index 100% rename from MarkdownVsix/Commands/CreateMarkdownSolutionCommand.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownSolutionCommand.cs diff --git a/MarkdownVsix/Commands/CreateMarkdownSolutionFolderCommand.cs b/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownSolutionFolderCommand.cs similarity index 100% rename from MarkdownVsix/Commands/CreateMarkdownSolutionFolderCommand.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownSolutionFolderCommand.cs diff --git a/MarkdownVsix/Format/DocFormat.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/DocFormat.cs similarity index 100% rename from MarkdownVsix/Format/DocFormat.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Format/DocFormat.cs diff --git a/MarkdownVsix/Format/DocParser.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/DocParser.cs similarity index 100% rename from MarkdownVsix/Format/DocParser.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Format/DocParser.cs diff --git a/MarkdownVsix/Format/Markdown/MarkdownParse.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/Markdown/MarkdownParse.cs similarity index 100% rename from MarkdownVsix/Format/Markdown/MarkdownParse.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Format/Markdown/MarkdownParse.cs diff --git a/MarkdownVsix/Format/Markdown/MemberDoc.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/Markdown/MemberDoc.cs similarity index 100% rename from MarkdownVsix/Format/Markdown/MemberDoc.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Format/Markdown/MemberDoc.cs diff --git a/MarkdownVsix/Format/Markdown/MemberType.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/Markdown/MemberType.cs similarity index 100% rename from MarkdownVsix/Format/Markdown/MemberType.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Format/Markdown/MemberType.cs diff --git a/MarkdownVsix/Format/ProjectFile.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/ProjectFile.cs similarity index 100% rename from MarkdownVsix/Format/ProjectFile.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Format/ProjectFile.cs diff --git a/MarkdownVsix/GenerateMarkdown.cs b/src/VisualStudio.DocumentGenerator.Vsix/GenerateMarkdown.cs similarity index 100% rename from MarkdownVsix/GenerateMarkdown.cs rename to src/VisualStudio.DocumentGenerator.Vsix/GenerateMarkdown.cs diff --git a/MarkdownVsix/GenerateMarkdownPackage.cs b/src/VisualStudio.DocumentGenerator.Vsix/GenerateMarkdownPackage.cs similarity index 100% rename from MarkdownVsix/GenerateMarkdownPackage.cs rename to src/VisualStudio.DocumentGenerator.Vsix/GenerateMarkdownPackage.cs diff --git a/MarkdownVsix/GenerateMarkdownPackage.vsct b/src/VisualStudio.DocumentGenerator.Vsix/GenerateMarkdownPackage.vsct similarity index 100% rename from MarkdownVsix/GenerateMarkdownPackage.vsct rename to src/VisualStudio.DocumentGenerator.Vsix/GenerateMarkdownPackage.vsct diff --git a/MarkdownVsix/Key.snk b/src/VisualStudio.DocumentGenerator.Vsix/Key.snk similarity index 100% rename from MarkdownVsix/Key.snk rename to src/VisualStudio.DocumentGenerator.Vsix/Key.snk diff --git a/MarkdownVsix/LICENSE.txt b/src/VisualStudio.DocumentGenerator.Vsix/LICENSE.txt similarity index 100% rename from MarkdownVsix/LICENSE.txt rename to src/VisualStudio.DocumentGenerator.Vsix/LICENSE.txt diff --git a/MarkdownVsix/Properties/AssemblyInfo.cs b/src/VisualStudio.DocumentGenerator.Vsix/Properties/AssemblyInfo.cs similarity index 100% rename from MarkdownVsix/Properties/AssemblyInfo.cs rename to src/VisualStudio.DocumentGenerator.Vsix/Properties/AssemblyInfo.cs diff --git a/MarkdownVsix/Resources/GenerateMarkdown.png b/src/VisualStudio.DocumentGenerator.Vsix/Resources/GenerateMarkdown.png similarity index 100% rename from MarkdownVsix/Resources/GenerateMarkdown.png rename to src/VisualStudio.DocumentGenerator.Vsix/Resources/GenerateMarkdown.png diff --git a/MarkdownVsix/Resources/GenerateMarkdownPackage.ico b/src/VisualStudio.DocumentGenerator.Vsix/Resources/GenerateMarkdownPackage.ico similarity index 100% rename from MarkdownVsix/Resources/GenerateMarkdownPackage.ico rename to src/VisualStudio.DocumentGenerator.Vsix/Resources/GenerateMarkdownPackage.ico diff --git a/MarkdownVsix/Resources/logo.svg b/src/VisualStudio.DocumentGenerator.Vsix/Resources/logo.svg similarity index 100% rename from MarkdownVsix/Resources/logo.svg rename to src/VisualStudio.DocumentGenerator.Vsix/Resources/logo.svg diff --git a/MarkdownVsix/SolutionHelper.cs b/src/VisualStudio.DocumentGenerator.Vsix/SolutionHelper.cs similarity index 100% rename from MarkdownVsix/SolutionHelper.cs rename to src/VisualStudio.DocumentGenerator.Vsix/SolutionHelper.cs diff --git a/MarkdownVsix/UIHierarchyHelper.cs b/src/VisualStudio.DocumentGenerator.Vsix/UIHierarchyHelper.cs similarity index 100% rename from MarkdownVsix/UIHierarchyHelper.cs rename to src/VisualStudio.DocumentGenerator.Vsix/UIHierarchyHelper.cs diff --git a/MarkdownVsix/VSPackage.resx b/src/VisualStudio.DocumentGenerator.Vsix/VSPackage.resx similarity index 100% rename from MarkdownVsix/VSPackage.resx rename to src/VisualStudio.DocumentGenerator.Vsix/VSPackage.resx diff --git a/MarkdownVsix/VisualStudio.DocumentGenerator.Vsix.csproj b/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj similarity index 74% rename from MarkdownVsix/VisualStudio.DocumentGenerator.Vsix.csproj rename to src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj index 429e905..a69fdc4 100644 --- a/MarkdownVsix/VisualStudio.DocumentGenerator.Vsix.csproj +++ b/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj @@ -97,7 +97,10 @@ Always true - + + Always + true + @@ -117,24 +120,24 @@ False - - ..\packages\Microsoft.VisualStudio.CoreUtility.15.0.26201\lib\net45\Microsoft.VisualStudio.CoreUtility.dll + + ..\..\packages\Microsoft.VisualStudio.CoreUtility.15.4.27004\lib\net45\Microsoft.VisualStudio.CoreUtility.dll True - - ..\packages\Microsoft.VisualStudio.Imaging.15.0.26201\lib\net45\Microsoft.VisualStudio.Imaging.dll + + ..\..\packages\Microsoft.VisualStudio.Imaging.15.4.27004\lib\net45\Microsoft.VisualStudio.Imaging.dll True ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6071\lib\Microsoft.VisualStudio.OLE.Interop.dll True - - ..\packages\Microsoft.VisualStudio.Shell.15.0.15.0.26201\lib\Microsoft.VisualStudio.Shell.15.0.dll + + ..\..\packages\Microsoft.VisualStudio.Shell.15.0.15.4.27004\lib\Microsoft.VisualStudio.Shell.15.0.dll True - - ..\packages\Microsoft.VisualStudio.Shell.Framework.15.0.26201\lib\net45\Microsoft.VisualStudio.Shell.Framework.dll + + ..\..\packages\Microsoft.VisualStudio.Shell.Framework.15.4.27004\lib\net45\Microsoft.VisualStudio.Shell.Framework.dll True @@ -156,6 +159,10 @@ ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll True + + ..\..\packages\Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.15.0.26606\lib\net20\Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.dll + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll True @@ -172,15 +179,17 @@ ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll True - - ..\packages\Microsoft.VisualStudio.Threading.15.0.240\lib\net45\Microsoft.VisualStudio.Threading.dll + + ..\..\packages\Microsoft.VisualStudio.Threading.15.4.4\lib\net45\Microsoft.VisualStudio.Threading.dll + True - - ..\packages\Microsoft.VisualStudio.Utilities.15.0.26201\lib\net45\Microsoft.VisualStudio.Utilities.dll + + ..\..\packages\Microsoft.VisualStudio.Utilities.15.4.27004\lib\net46\Microsoft.VisualStudio.Utilities.dll True - - ..\packages\Microsoft.VisualStudio.Validation.15.0.82\lib\net45\Microsoft.VisualStudio.Validation.dll + + ..\..\packages\Microsoft.VisualStudio.Validation.15.3.32\lib\net45\Microsoft.VisualStudio.Validation.dll + True False @@ -201,16 +210,18 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + + + - + @@ -64,7 +64,13 @@ - + + + + + + + diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Properties/AssemblyInfo.cs b/src/VisualStudio.DocumentGenerator.Vsix/Properties/AssemblyInfo.cs index 1230e92..88cb344 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/Properties/AssemblyInfo.cs +++ b/src/VisualStudio.DocumentGenerator.Vsix/Properties/AssemblyInfo.cs @@ -3,11 +3,11 @@ // General Information about an assembly is controlled through the following set of attributes. // Change these attribute values to modify the information associated with an assembly. -[assembly: AssemblyTitle("MarkdownVsix")] +[assembly: AssemblyTitle("Document Generator")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MarkdownVsix")] +[assembly: AssemblyProduct("Document Generator")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Readme.md b/src/VisualStudio.DocumentGenerator.Vsix/Readme.md new file mode 100644 index 0000000..68f420d --- /dev/null +++ b/src/VisualStudio.DocumentGenerator.Vsix/Readme.md @@ -0,0 +1 @@ +Em Construção \ No newline at end of file diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Resources/GenerateMarkdownPackage.ico b/src/VisualStudio.DocumentGenerator.Vsix/Resources/GenerateMarkdownPackage.ico deleted file mode 100644 index 43bd2d9447865c10c0e5cf7b99ce2e288a13ad6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 zcmeI5YmgMh9l+Ob`IL|O=p#=O%cM-DDr#a%Q$$T9mhv=ZCR0jtxQyMDHQS~ zm(7xVJ|F2~v$201|BEzcVd0R!P&7(-Ab%w=3kxa3ziVG7dFXpkv9aGICnTR8Q z)u40bMgE*H6tp6L1)+0AM*f^I6tp6L1)+0AM*f^I6tp6L1)+0AM*f^I6tt#O1LTQW z(>1ey?|Y$^Kv3gI z?Bzv9y{H0zs0Z+lQ@*SK>l*b^Orv$q+GO2q;TyhDHk%9e#O*zQs_T!={KH^ z$X`y{qaXgAj2wK?GLdZ01~RngX-mIiqK6Euzmt@6gO>i|<%s;{Bn|xID{dgUv)gMD z0{-z8*OSb#+Wn4!Klly43wwT-YvPWV1M-)Xw9fx}l6ZX*0jB)H_{Ue?MDmyR^Ilq5 z;IHY&@zo~3@w`C(a?)n}fumNRXH!Ok27l_8X#P4Wrav+K*z>RHK+_jU;p!2?Z#*r? zUryRQe_)y3@pGd+$n)3qW8?Sf`+i8fp@~0@mt1=rDQA*$neh=D`TGzW7p0m%a31Mi zqJ^mD4}OC?e?|SururY;HNTF>G(Rr+x?7RIoQN6!H>aUXF_y1yWEf=#S zz5OBmdgYB|^zd@SFW+~Nq_+K3zi#?GDfD$$-KBn)$X`yjJby^35I;%#0$&+pdxOCk z#)wKI*GTf;-`3rz4zPN^aODsw4Sh-yE#J`G^tM1kE@LiZBY&5I5(KN}55cl$-Z9uR z#%zqR(0_u{5Bw4r_>)qBq+5Sxu;lr}9r?Ba&tHo-)*ei*`;Kt_ zKrYvn*vP*k3qLj?f0|f1lc4?j+ch1i=C5&Xdsy=`@u%@hBUiL}1AaV!xBJPbC=T)$ zNyeSK9e+rHwFhhXQ$M}Ga3`teUw!A?xmFUV{esk%`$^{1T3RQJR0r{Wjr@I!PK)To z9|C22w@}#DbHv5ODLNK#N|*_lUxxVu){ca8;*FchaM!#*=8uuTQ1q@m-0*jmkRTBB z3l09X4&e0w?5Qn3B$<;fbX++tNWtD2`P<9K$+zD8;r`GU1l9xVzo*R;4ex)3)&XBL z=|W=Fm$Wve*FGcicOqQzA9(9tI*)gY*}VQ`jYE=-|JCcro$oMM=RbX4yA8AfvZpta z)YhqnALz)?-Z`Ge4UoTkYRPqXm}Je@#r5P5eTC$jZ)*1*>YQz482T3jo9`XVQ)R5t ziw+=vL!6G5%*i*&=#f_~P3A<4V|HO$TZFFx#_{4AS{S zrju@U0Qt*M8Nay2)H%vlf5t%vP3-A-A{^yn&a)0&x_E)WZ>xYQmFhd*%=Vg?$o)SW z`TKuk{&1|#0sR6POXd$hI>5)TrycprNf*WuSp5$3MA=^J-+R&Kns+>6gmwEakjtHO zY~=4OBfAjrEkUy7R-J3pO(ge8r!aUJbpZJbak=);#*@d^3B>8T(cFby!nk337a)Hj zDo-AbssqU16K31Mji>|2-xjH7&qmV$QRCmatDV5U)PBtIqlZnLFJ3tBDV=!#HB)?c5oR5T8vm*H++pmU%gW~V z{I`Yk88Yqs&Xx_H()zIbfGIwI5mp^wvWd$4PgwbbE`(7BqQ?K~l|BN$Mc~Jz=UAr*v}JEFay{9yT3_8h=Znhs-f(9Vq9AYxXj6TV&+#R#L%+3rYuI&0)HAy0#t} zzH#(=Ab+nC3od*RIsj{s*g8b`9wm3K%~J-EzbA189ykyk7@#^p*E$>P4n5QZQR5G5 zCpWHZo)FV_`G3Cj!;21#e)O8Lh6s4Gbwovku~i0p z_~wDFJCo4?R#xo)JO36Nla=T!!yoj+P6v4QurE!C?n`F1w%ltyz{(O8{)Iw;6bktX zG3B!So}pGcP|Y6tdvJ)>l6ldAsPWeX)8PMj9q8xwB!cIjv1dh;)dA$sBpI$VuLJO& zAJ|0qsT_Omt8*&WfwPYN0_0yU&G1~Cbin7j;^Kh44j}*V@V3fHy>)=`pE>P5@|#&R zY|Y!7*P5~z)bBqB`Tf_kzkiC%{oRw6=H4HQXM2SyLSqVuP7MWsw!s^rLD zN_@T}%jiI|S>Mk%z2i~e_h%82Ka)hT=Z?0mWd0v#lNaXGeS-vtj1Itff^6Ln*+TvT zIFin*S1#Aur4LTI+cqWdI`B*5-9NOO?pY+cmvtEV!`Od5@6QyA*84%)La2kMTmEos z_`O2-9V2+A6RW=HY5#%jnXOW}4Wh9BKaJh{?EB znYN<_)2YDBYs;6qYX2D-;4F6a0PKgz_N#;6MJx^XaWTDH!&v`&FNJ&z_~yi^ZQ;k? zsr@g?d9@Ct+h*!(#K-n3)Y)GaMR)Cv{B=>)i~l1J{m3VUisu=hQjgJKW&L;kwd zdH&Fc*uHg>FZ0r0pQH82?OI(j?f$#S>7EnSSUp{X4h-*~TQObF(mG%Mxo4T+`F9`q zFFDiOV`~Nn&HLfQyf4&?LC*iOyp89X=l|Zjt-fx(tD}|t_y_v8%QGIBEY03mCOk&s z`MY_)?b+R7x&!jp#nFiDA?L_n=O^?0H!6E5dH=Pm1p3TwP4)g5sz3jY%wE@gx&JEj zSDig*j;j2Tycx=)eupEdIV(%kf~hBdD) zTVh)OHRC6fN$=@X?ggP}NXFmI+JQz1Gi}OU$lj$sM~#0Y*7-3!Py#3clmJQqC4dr8 HP6Gc2_(1Fp diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Resources/favicon.ico b/src/VisualStudio.DocumentGenerator.Vsix/Resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d323b07fb8d8b417bfc12e7c46dea88bee17760c GIT binary patch literal 428446 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

N3mPu2mM3; zmKw3j9OIw0-7>d1d|TrK z{X_qjJhtX<%)e!BbNG(smuiRpp?^yrr}8s(y=885_)g6~wjTP2{w;YNSe5YKQ)ze@h;x@-ub4Wo~o$PR&2I9{Pv=EqNT{pS9gG zw>f-U;{*Le|CT(q=5NfuWo~o$j^&qXhyI~|OCG24Gj+XXZgcof%|Est`iK54c^u=P zwcRqeIec5=1N}q)mOQrRZ_K}CZgcpK<(F!Q{-J+M9;fm%b-iV7bNEipKeitFhyE>j z9OIw0-7>d1d|TrK{X_qjJhtX<%)e!BbNG(smuiRpp?^yrr}8s(y=885_)g6~wjTP2 z{w;YNSe5YKQ)ze@h;x@-ub4Wo~o$PR&2I z9{Pv=EqNT{pS9gGw>f-U;{*Le|CT(q=5NfuWo~o$j^&qXhyI~|OCG24Gj+XXZgcof z%|Est`iK54c^u=PwcRqeIec5=1N}q)mOQrRZ_K}CZgcpK<(F!Q{-J+M9;fm%b-iV7 zbNEipKeitFhyE>j9OIw0-7>d1d|TrK{X_qjJhtX<%)e!BbNG(smuiRpp?^yrr}8s( zy=885_)g6~wjTP2{w;YNSe5YKQ)ze@h;x z@-ub4Wo~o$PR&2I9{Pv=EqNT{pS9gGw>f-U;{*Le|CT(q=5NfuWo~o$j^&qXhyI~| zOCG24Gj+XXZgcof%|Est`iK54c^u=PwcRqeIec5=1N}q)mOQrRZ_K}CZgcpK<(F!Q z{-J+M9;fm%b-iV7bNEipKeitFhyE>j9OIw0-7>d1d|TrK{X_qjJhtX<%)e!BbNG(s zmuiRpp?^yrr}8s(y=885_)g6~wjTP2{w;YNSe5YKQ)ze@h;x@-ub4Wo~o$PR&2I9{Pv=EqNT{pS9gGw>f-U;{*Le|CT(q=5Nfu zWo~o$j^&qXhyI~|OCG24Gj+XXZgcof%|Est`d_yGWA%gm!44Qq#{l|={-K}g`dK@6 z&_DFQb`B%{>E{>p5B)f9)Jb{L{}b=pXurex~bZ?bt#8(Er*wjQFRY zU(i4F5B*Hn&)Ttr{-OW1a~SbYKfj=V=pXu-uAjAI2mM3;Yv(ZHpMHKp|Ik15GhIJx z#}4|3{@2c7#6SJ~g8rd@=x4fq){Y(Y5B;y5!-#+S`33z$|Ip8L{j423=pXuDJBJbf z^z#e)hyJ0T>H1kacF;fczjh8I{^{oz^bh?*KhyQIcI=>k=zr}TM*P#yFX$iohkmB( zXYJTQ|Iq*1IgI$HpI^{F^bh?^*U#FqgZ`JT|2h5}6P9}%S|66V&EeY`KjWBx63o5Oc3zf?Q)5B*#6IF+BN>n(Ge!*^=_vGveD^l!=I82_y8mbuO0+ZrF} zANsfCu{D2V{w;Hx!*?vdR6Fz!{af-lm7l5WEpwa0cWVBz_0T``Z^`2r|E%qnxy|9* z8XxE%`nTkSLRtnHS$ z&EeY`ALt+Yx8$)ke`EeFbDP6=EWcDc^bh@8@;H^Bsp~Cso5Oc%{;~DYKlE?O;~4*} z?UuRC;oBM?=pXvGWBx63o5Oc3zf?Q)5B*#6IF+BN>n(Ge!*^=_vGveD^l!=I z82_y8mbuO0+ZrF}ANsfCu{D2V{w;Hx!*?vdR6Fz!{af-lm7l5WEpwa0cWVBz_0T`` zZ^`2r|E%qnxy|9*8XxE%`nTkSLRtnHS$&EeY`ALt+Yx8$)ke`EeFbDP6=EWcDc^bh@8@;H^Bsp~Cso5Oc% z{;~DYKlE?O;~4*}?UuRC;oBM?=pXvGWBx63o5Oc3zf?Q)5B*#6IF+BN>n(Ge z!*^=_vGveD^l!=I82_y8mbuO0+ZrF}ANsfCu{D2V{w;Hx!*?vdR6Fz!{af-lm7l5W zEpwa0cWVBz_0T``Z^`2r|E%qnxy|9*8XxE%`nTkSLRtnHS$&EeY`ALt+Yx8$)ke`EeFbDP6=EWcDc^bh@8 z@;H^Bsp~Cso5Oc%{;~DYKlE?O;~4*}?UuRC;oBM?=pXvGWBx63o5Oc3zf?Q) z5B*#6IF+BN>n(Ge!*^=_vGveD^l!=I82_y8mbuO0+ZrF}ANsfCu{D2V{w;Hx!*?vd zR6Fz!{af-lm7l5WEpwa0cWVBz_0T``Z^`2r|E%qnxy|9*8XxE%`nTku2rQLI2SI+BuB)r=MTY zKlBg%OxMrav4j4h|Fv@%@lQX$pnvEe`kAhuwPOeUL;q{%FyfznenJ1xKlC$QKWoPh z`iK74&SAtq{rrOdp?~OSx_;J<9rT~3{~Y)o!pFOJ?{<$KJ;LA4e~_mACr_U2-oJmp zJ46kavS+d4uccr(R~#QceAvBw`4YNM)V+M)fA#9s(VhV-mVYsq?v}6*-t*Jm>!s%9 z^|9UyK>y4B41xE2TiwfZ;Mnd3p#SCSAMg3|YM;-7W4afB{+FkJyyqWA_pE@#_Im;7e?I-=J^ylP zpU;3b-wQzh_WH+r{^is?>z~^--U~qgw))3={&8rZ&w#bv3qb!i`p0|zap|7*&+S_7 z1=g(pA+aCgclYp~|DgQ)1jqh23J!TMFhm=dea_t4$9sPJo=<1s+qZA=w+h_fDmc`= zz-8CBmfzgEr~UAr-)jHavuDlU(|G#yDb4_Q2H;*mQ)}MwxwVh?{8sn$+4teYhr5f5 zi$?#{=g-7waW9Zp?X9=Db&vP_uI^dep?h5#V>?>h3$&`u)0x1@jh%ulNYo(1;fhk7a=%}FhqLC)ai}l6=f`6L!S9*^}@5j;aDHry@19Ut8u*N59cDk z?+<@*1+3y83u2_!aJ%2n8=?uuhMe@Pt3EE+GxUBaAmKqQF#(VxSzJ+u- z_L*M@e;UKH!09!}asFy`=^M}euK;~}S=xwuZ{EDw;dAJC4o-RIr_~bA0>|S|&s~VS z8m4oM=Qs!Eh;zsu^jVb7Q~Zp2oQo;X{Ipu&436VY+g+Ppj)OJPTao{k>nW6s^bB`unVb|eN5*uyT*^Dk6*UW2bRzLv|3)4XMwoCkEwi^UE|4;$1lU@1A5Oo z1jcKB7Kr=%VY;3&>kxcQ-E*y<59WC0r(wIcXMwoCpQ7gJYc$?0eS9sS59WO4r`2rf z&jN9OKV82$S8DuO^7xWJAI$yCPpi{Xp9SLnKBs!~`qH?xEnm~d~m2|ep+1)`799k_tq+%$G^s{C66EK^T8pX`Dyi-`&l6F@8{9w zA$HL?w&d}-J|8UMnV(h%>t}(uzdwW;54Werv!#z)eLl$j%#SOZ3r~w@fw;ftDjj#5 zi=%V;$^H2t_cK3cR8CBCJqyJBJy!>*i*Rsz>k5Xi~jxqJ=%e31K@pN4PFykpM-aeuE>0pqC% zH=R?qx2jC181dKQTLdkuArTOg2&%X9njKOa~<^V9IonJdMP`+E&(jL(Tc zPF~ODi#{LZ+-oS_x%SK*f3CQO_!){7=B*EbA@#qEbB0#xGUh%cr=j>@-sM1G2q!Mf zoUs+VEO`&fV=Ok9fB6s?!jrYmnOd#2<~t ziNFv}EqzXE<(8h`koZzDzQS02)jWz0i-%Xn}N1eT1z5KddnvBJb6)*(Kv@_}C7_yx1>{z;3q-8))>*Sz!l08Uo-4^nvq1QwPpZoDVo3a6aIC&=A1+fb#+8 zgQgDLKj3`8`GE5Q=Yxg-&IgxCidO^ zoX7nkKkKokIkB95JMu^U*Tn51vHJXu^+WuB@ZiC2O)rT_EN9=2{P*?0rrJ}isQ)h= z419ja`rtqKFZHA8|L31R?#8?{KRiCh7tQ5$vX$}2IPcrX@IP0)9Dgo<$bX*mFIT-# z|LXoS7oOlh`0sPTKi^}0od3h`e{$&+=O4~L;y^Aw`P!#`O!K}S`X8=;*6q^Tx$3{P zyg44^KhOOS5g?GJc=m zu|D_@{!9KaKiAUA_+y;+?PK`AR6LMBKL7h1@cA99?c29W`7>4#E>JGFIlsQv%`>ez$NTKrvxZYopFYikK?)ZL zANMk^IpzQG;ltg<#YK}p^%<8O?N~1K)!f<2IN!W^v&&VdP<**GMKMyW9JkVT&ILDz z-tWG5FBlq2POU!DVQj5P4ry?$`7V4VIq zonOzNKQH+_l()3T_u==)oQ0$z+Plx6@7wh$C(3Q;Ie6;kZr$rg_flgf8`W-zKKwIJ z^BL0^^PBe6e0bv&JLPaHYdz-Lt-tSH-@DgjeaJJ<`J(uLs9)4CU!k**G?RnhV{#77 zbumuX2gT1hdhNHaPp^)R=34VRl;4;!7xO56$Q<4E3*L|VzMZ%|C%-w4sjZ8Bus-TM zNk`2&M1A*)YRg;uz3bnf8n4y5I*-S${h^Mv!)tHsv5djlXq`5n#>pqmX>gN1mUQjn zJawy`GEs;Dp4)x#BIIHV%_hVJyTjy1K zvaMSFdnB8S>iT;9_c`uWe+R?;J&e-e{w~FDg`4aCKE!Uj+0x(T**0VH92cG8vmi6AFSpHE+GDy|K0=e z@BV#_p+5&A^)Pi^Zv3alF?Ai{2Y*Nl;7|FUp8Wnb700RTpkL^BN&1!VtJc@K`EMPs z^pE(v`jz-tU+2bu>N!4j9pdluXDW_U*8zXvPiGYPgZt+c9)Lf2_+x#)ApPe)|D}KH zYsBAu|FXtg`cK7QtZ)7;;`Qs-qkg_f#>Ln4^AzMu+eeI#etsg>mp_XY`&k~2ZA?o( z2mG8@QvA6v*YX-ri)j1~@89Rb{N>A+<%7LSr@6Fe&(As$))ez8)5-OTKabt(2lwji&DZp^`NZiMA40!R zLqAX1mp}O=-=VdzAZ z9|}j<55+*SG+1+-Lt3})zI%P|UQHaX&%VnVGrtH!QFGdtUgdnU(VP+dxIZMuA#+>| zQGSWoeNBbA@UyegPZr5)(nYh>Ky0))V&DTCN9@6bda}&%5qFI7Zj*+wOeh{zE>l{dKdwOYQFDoc`lS^mAIL?seb2nxE5( zsK?_0^TDKbAqBsdvcG&U$aT&61(SD!Y|piy^uzwww7>RzNai+V-jw`@_@!8e%)|cG z`^*^r4Z-y?<1cxhay^BADf`K_Yux|X`G@?&|GgT??IAc#;r|f76w8o#Q}&m6rd(tH zVefy86Srgkb^<*I=zHE0d;jHqsiog7oLX~Q>-*wwEX=)W==#>KEDR#n*mIYiRBLf!nFmoR3g_ zzUKw?KD_r2?)ovUVS8VD;r`?2)~|E-0?WAKjA<_j_w+yTALp^7qLo&{Ox~ z=M?v^x(nsY<;8gpYNZ=mFS)8+(_C%6|9;Es<=B$fbIg5hU;KUR*w(jRVnu7@*pkj=gjV$XZP%x*-fxCzj2!5EC&Dpr%g?a?l3g^ zkFc>Y_I5qjeuiR3T{E?2W2|sCw|E9-4=}Mu0RVT$9|65m;1**XiUt|m1zGuf1ckT; zx&t90AxhqUJ}881fV+}^pl9~F&RGE9k~cN_+xl_NT5d#u__v5|ePXLN5mZ~8b|i1c zMPb(xrZjl>u`)?$u)*2IJeHSPQMa0$u5AqaI+R$e@8|}g+&&0Pa;fG zNtj;*oE{&j8m(%;F30)@h*W2jL|m9QYuS@PGHlgZf56t;KR~29lO#eq)#CQ_tsje` zGrsn&OpIQpf2iqpT@`rk2Bws(92C47deGN3CR?l6&deXVft3ZDNKeIAzF2Ua;a(af zeeL|b1Z{C)BA;qVqD@C5Sa@II9xUZ2?<4Gcf8>@8TQqnxbxX31m@K}IgO5jal53V`nQ1iuT*j6di z5FjBhF1=P`W{8)}saL$s`R-J}Kel@Gr92Db(awXCA5Mx|0RrpNLDzW2>g! zzfPRzLDylH&BZ4VW<_0kapgosyujyL?|8W6B$YsK;qmpuM{y-wTOR28(sczKqf?=o zcK}S+ED!!v{2fSPK2JRy0^U!RUVD#4AdkTsQQ*gDRD%A^5ceRn>4Xk&A&o&1ye$ZE zq0EI@U8;|uGKE`e20KibTAk8e*HckR3DnBJgVOt=uCq-M2$MQmosh`TUDO7*Oj54y zmeEXMyr(O>g(l_cCK&yqw<}-8>M+E)V=9#Aw5<-fiOInFQ4o=TdR`lR0FD3`fkg&v z&MOkeKt`q*VwERiu*%n6cEGThkv(Ut1Se;% zT(Xp!85@~VYiiw{wBbbJ)=_1CHHUYp(R&c>U_y<6Lgdl(V(cL*S^egdQB9rD$D{C= zzbQYm(TS2E9V8%F6}!svVIIeWEWZM7n5^mRtkMc8_!w~QsA;0R8i?>MvKtkm+kF?o zMlC?0iINJ(h3P`Ko%_a^?08Q;;m3(}V^4Z(`o^@@#~Uv(yka#I`h6Dx50IP%aprY>6E1z=dnh zzAK*RV>bC(%bQByf-lch(a>H2_{i?=zuVnlxjpA&%UR=0cT_^u*1)m8*6V}0_An4e zNHLMiIWR%NZ1&HS4fH(Ijk$!MxM3I9cM-e)HgL?~=KdeYKI+xa;VO9tr70~vnjNf= zvr>07J*5KgV?WT^j03-I+bA?^YZ|H`uUqmEZ#sIP^S26GT8?&I$xN5ek1Z4B-)G zaHE&a(KoTOTWxVH8dEj&*{PxVaE%Q!-HP&I?#qb+kZ><_;KziOqfiuGxX9Z1yl(qz z=EhR(yVDu|+>GMoGmp2Z8}F4XEtEgX+C4c^?nI2Vbh07<+kl(l=>05@{5+viqLI5h zVK7pLu)>t#Tvs-er&fv$MaSo8{@$KxjVPpHY^y4Gb9443^fX07tINxgE-jbL6ZQLi z#2)AYdq1*0WeAtiNPGWOn2;Ke3T#nsE_MXzGyW?vwMBh{A13C&zL3Kz8*|WkzX{F$ z5%c94k0TIW{a#?tBZcIcNyEqPC%8vxZt#y&lxx@a$`0lX!9l_Q>OWe)bNH|U^`jaM z7esL@V|dde6;U;BrpKp&mz+tLu46hv)n9*c?G6`5`c2OMx8+ zx{~3~%fS0^VONO{Z1eL?mA^aGZS?P&gi+a!qMyXhRQAYTm0iqO4=E?k8*jC-vIIP9%;w*5 z-*u2&R>ZU;oY{{cg7~=e1<>U1#_bTLqBrW%R}Aj?oD6P>jzH~{A)+p0e%iV18VF-jBCJ2y5T&D)EHl{jg9~J~>K#bL2{F z)|J27DQP5O!LJf9Jq~GM>{xWLgr{e~D~` z=j*TcL%tcgIG}%J5VEbmt=J zhuD%Doqfi`een(yrBTFFo_poP(>ZUdADn0}5v?o|dv7_n<|zxzieVqod*vMshf{s&+a@+=V^vQJzrgwx*>uyUqqq?~DtP>IOZvarw-x z%$8>kwLfdogPBU_IU&ry|3b@#$WkV%F)ytb&8@4Lct@fVyUQXq<|izGNOck{-3P=> zpth?1f_Ye4Urp-BTS+$FSZHq>PCBYBp;MMOEKKl9b0OfOGkYPn*NJHtey#L~9`c=s z*w5TLmv=VV?fGGhl*rtz)Oq6I)o+~Q&{qySUHV3|!+c_QvV$WVC=edvFgOQabKJC# z7e)9BgNrO1&qdNIX1{CfWw*jBl_n-noZE&K(Pe$HGj=u53kR6DJEE4>-&; z?b-R-x3Ux2tmUATAyl0Zz!ssm z$)}jbZ5;vJuGsyw;M*4sv!3;5oPN0J(mS+K2IAhJ?O3U=D06DnR%!eYdB^#`H;CDS z^bjMpxUu;U$GoG;IpWK{!#};URv7&ufU&mwpahxN+?ApRf&QBe;{TXF^plj*45u<$ zo)U3wxP9Tpd+#Sr#dFwFfAa6J8ERVUMJ2rDk{U0uDWaCT9mT)R^Ap5eGN2yoA`P+) z8%3N*Tuk8qi8us|+N=p)k+Iq3%ToQC-WswobJ_2Ql{}0y%xrA^*kU|7R;_Ad{q>p;pz{j)QSkF@6S`pM|jUh%fK@=Fc7OC;%5t_)2 - - - Page 1 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + diff --git a/src/VisualStudio.DocumentGenerator.Vsix/VSPackage.resx b/src/VisualStudio.DocumentGenerator.Vsix/VSPackage.resx index 3997d67..05d7f36 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/VSPackage.resx +++ b/src/VisualStudio.DocumentGenerator.Vsix/VSPackage.resx @@ -135,6 +135,6 @@ GenerateMarkdown Visual Studio Extension Detailed Info - Resources\GenerateMarkdownPackage.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Resources\favicon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj b/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj index a69fdc4..f3fd3f8 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj +++ b/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj @@ -15,6 +15,10 @@ Key.snk + + + + Debug @@ -53,6 +57,7 @@ TRACE prompt 4 + bin\Release\VisualStudio.DocumentGenerator.Vsix.xml @@ -77,6 +82,7 @@ + Designer @@ -93,14 +99,19 @@ Always true + + Always + true + Always true - + Always true + @@ -206,6 +217,7 @@ true VSPackage + Designer diff --git a/src/VisualStudio.DocumentGenerator.Vsix/source.extension.vsixmanifest b/src/VisualStudio.DocumentGenerator.Vsix/source.extension.vsixmanifest index b0f88c2..f6243e5 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/source.extension.vsixmanifest +++ b/src/VisualStudio.DocumentGenerator.Vsix/source.extension.vsixmanifest @@ -6,7 +6,7 @@ An open source extension that will automate the documentation of your C# class. LICENSE.txt index.html - GenerateMarkdownPackage.ico + Resources/image.png Tools;Documentation From 728f02c83008862812614193b135fd0144ea79c8 Mon Sep 17 00:00:00 2001 From: GustavoAmerico Date: Thu, 26 Apr 2018 00:22:30 -0300 Subject: [PATCH 7/8] =?UTF-8?q?Removendo=20o=20disparo=20de=20exce=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/CreateMarkdownProjectCommand.cs | 29 +++++++++++++++---- .../Format/ProjectFile.cs | 11 ++++++- ...VisualStudio.DocumentGenerator.Vsix.csproj | 1 + 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownProjectCommand.cs b/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownProjectCommand.cs index 2f64b5a..e3e67cc 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownProjectCommand.cs +++ b/src/VisualStudio.DocumentGenerator.Vsix/Commands/CreateMarkdownProjectCommand.cs @@ -1,6 +1,8 @@ using EnvDTE; +using System; using System.Collections.Generic; using System.ComponentModel.Design; +using System.Diagnostics; using System.IO; using System.Linq; using VisualStudio.DocumentGenerate.Vsix.Format.Markdown; @@ -48,28 +50,43 @@ protected override void OnExecute() { base.OnExecute(); Package.IDE.Solution.SolutionBuild.Clean(true); - Package.IDE.Solution.SolutionBuild.Build(true); - var solutionDirectory = Path.GetDirectoryName(Package.IDE.Solution.FullName); - solutionDirectory = Path.Combine(solutionDirectory, Constants.ProjectDocPath); + // Package.IDE.Solution.SolutionBuild.Build(true); + + Console.WriteLine("Iniciando a geração de documentos"); + + if (SelectedProjectItems?.Any() == false) + { + Console.WriteLine("Não foi encontrado nenhum projeto selecionado"); + return; + } using (var document = new ActiveDocumentRestorer(Package)) { - const string documentationFile = "DocumentationFile"; + //const string documentationFile = "DocumentationFile"; const string projectFullName = "Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject"; + //&& (a.ContainingProject.Properties?.Item(documentationFile) != null) var projects = SelectedProjectItems .Where(a => a.ContainingProject != null && a.ContainingProject.GetType().FullName == projectFullName) .Select(a => new ProjectFile(a.ContainingProject)) - .Where(a => !string.IsNullOrWhiteSpace(a.DocFile)) + .Where(a => !string.IsNullOrWhiteSpace(a.DocFile) && !a.InvalidProject) .Distinct() .ToArray(); + Console.WriteLine("Foram encontrados {0}/{1} arquivos xml", projects.Length, SelectedProjectItems.Count()); + + var solutionDirectory = Path.GetDirectoryName(Package.IDE.Solution.FullName); + solutionDirectory = Path.Combine(solutionDirectory, Constants.ProjectDocPath); + foreach (var project in projects) { + Debug.WriteLine($"Executando {project.DocName}"); + Package.IDE.StatusBar.Text = $"Executando {project.DocName}"; + var parser = new MarkdownParse(project.DocFile, project.AssemblyFile, solutionDirectory); - + Package.IDE.Solution.SolutionBuild.BuildProject("Debug", project.UniqueName, true); parser.ParseXml(); parser.GenerateDoc(); } diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Format/ProjectFile.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/ProjectFile.cs index 60d5c77..4cdd536 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/Format/ProjectFile.cs +++ b/src/VisualStudio.DocumentGenerator.Vsix/Format/ProjectFile.cs @@ -20,17 +20,26 @@ public class ProjectFile : IEquatable public string Path { get; set; } + public string UniqueName { get; private set; } + + public bool InvalidProject { get; } + ///

/// /// Ocorre quando project é nulo public ProjectFile(EnvDTE.Project project) { if (ReferenceEquals(project, null)) - throw new ArgumentNullException(nameof(project)); + { + + Console.WriteLine("O Programa esta tentando criar a documentação para um projeto que não foi encontrado"); + InvalidProject = true; + } Path = project.Properties.Item(fullPath)?.Value?.ToString(); AssemblyName = project.Properties.Item(assemblyName)?.Value?.ToString(); DocName = AssemblyName + ".xml"; + UniqueName = project.UniqueName; } public ProjectFile() diff --git a/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj b/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj index f3fd3f8..c937626 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj +++ b/src/VisualStudio.DocumentGenerator.Vsix/VisualStudio.DocumentGenerator.Vsix.csproj @@ -90,6 +90,7 @@ Menus.ctmenu + Designer Always From ef665c71b3e770eeea4ecd01cd3a73ee1341c44a Mon Sep 17 00:00:00 2001 From: GustavoAmerico Date: Mon, 16 Jul 2018 00:59:47 -0300 Subject: [PATCH 8/8] =?UTF-8?q?tentando=20remover=20problemas=20ao=20escre?= =?UTF-8?q?ver=20a=20documenta=C3=A7=C3=A3o=20da=20interface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Format/DocParser.cs | 110 ++++++++++++------ 1 file changed, 74 insertions(+), 36 deletions(-) diff --git a/src/VisualStudio.DocumentGenerator.Vsix/Format/DocParser.cs b/src/VisualStudio.DocumentGenerator.Vsix/Format/DocParser.cs index c5849b1..43c2617 100644 --- a/src/VisualStudio.DocumentGenerator.Vsix/Format/DocParser.cs +++ b/src/VisualStudio.DocumentGenerator.Vsix/Format/DocParser.cs @@ -308,54 +308,94 @@ public void ParseXml() } } + + public void WriteConcreteType(Type type, StringBuilder output) + { + if (type == null || (!type.IsClass && !type.IsValueType) || !MemberDocumentations.ContainsKey(type.FullName)) + { + return; + } + // Print overview of all members + var constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var events = type.GetEvents(BindingFlags.Instance | BindingFlags.Public); + var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(a => !a.IsSpecialName) + .ToArray(); + + var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + var staticProperties = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); + var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(a => !a.IsSpecialName) + .ToArray(); + + WriteInfo(type, output); + WriteStatic(staticFields, output); + WriteInfo(fields, output); + WriteInfo(properties, output); + WriteInfo(events, output); + WriteInfo(constructors, output); + WriteInfo(methods, output); + WriteStatic(staticProperties, output); + WriteStatic(staticMethods, output); + output.AppendLine(""); + + + } + + public void WriteInterfacesType(Type type, StringBuilder output) + { + if (!type.IsInterface) + { + return; + } + + // Print overview of all members + var constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var events = type.GetEvents(BindingFlags.Instance | BindingFlags.Public); + var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(a => !a.IsSpecialName) + .ToArray(); + + WriteInfo(type, output); + WriteInfo(fields, output); + WriteInfo(properties, output); + WriteInfo(events, output); + WriteInfo(constructors, output); + WriteInfo(methods, output); + output.AppendLine(""); + + } + public void WriteFile(Type type) { - string md = ""; + if (type == null || !MemberDocumentations.ContainsKey(type.FullName)) + { + return; + } + var output = new StringBuilder(); if (type.BaseType == typeof(System.MulticastDelegate)) { // Todo: Docs for delegate types } - else if (MemberDocumentations.ContainsKey(type.FullName) && (type.IsClass || type.IsInterface || type.IsEnum)) + else if (type.IsEnum) { // Only print members that are documented - - // Print overview of all members - var constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - var events = type.GetEvents(BindingFlags.Instance | BindingFlags.Public); - - var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); - var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - var staticProperties = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly); - - var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) - .Where(a => !a.IsSpecialName) - .ToArray(); - - var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly) - .Where(a => !a.IsSpecialName) - .ToArray(); - - var output = new StringBuilder(); WriteInfo(type, output); - WriteStatic(staticFields, output); - if (!type.IsEnum) WriteInfo(fields, output); - - WriteStatic(staticProperties, output); - WriteInfo(properties, output); - WriteInfo(events, output); - WriteInfo(constructors, output); - WriteInfo(methods, output); - WriteStatic(staticMethods, output); - output.AppendLine(""); - //output.Append(new StringBuilder()); - md = output.ToString(); } - - if (!String.IsNullOrEmpty(md)) + else + { + WriteConcreteType(type, output); + WriteInterfacesType(type, output); + } + if (output.Length > 0) { var assemblyName = type.Assembly.GetName().Name; @@ -363,8 +403,6 @@ public void WriteFile(Type type) if (!string.Equals(assemblyName, type.Namespace, StringComparison.CurrentCultureIgnoreCase)) path += type.Namespace; - var output = new StringBuilder(); - output.Append(md); output.AppendLine(""); output.AppendLine("---"); output.AppendLine("");