📄 generator.cs
字号:
//
// SharpDevelop NAnt add-in.
//
// Copyright (C) 2004 Matthew Ward
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Matthew Ward (mrward@users.sourceforge.net)
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
namespace ICSharpCode.NAntAddIn
{
/// <summary>
/// The NAnt build file generator.
/// </summary>
public class Generator
{
public static readonly string NAntBuildFileExtension = ".build";
/// <summary>
/// The xsl transform used to convert a SharpDevelop project file to a
/// NAnt script.
/// </summary>
XslTransform xslTransform = new XslTransform();
/// <summary>
/// The xml resolver used with the xsl transform.
/// </summary>
XmlUrlResolver xmlUrlResolver = new XmlUrlResolver();
/// <summary>
/// Caches created generators.
/// </summary>
static Hashtable generatorsHashtable = new Hashtable();
/// <summary>
/// Creates a new instance of the <see cref="Generator"/> class.
/// </summary>
/// <remarks>The base folder must have a <see cref="Path.DirectorySeparatorChar"/>
/// added to it. The reason for this is that if the path is used in the XmlTextReader
/// as a base uri then the uri resolution will work. If no
/// <see cref="Path.DirectorySeparatorChar"/> is added then the resolving
/// process seems to get confused and removes the last folder from the
/// base Uri, I presume it thinks this last part is a filename and not
/// a folder.</remarks>
/// <param name="stylesheetFilename">The stylesheet to use to generate
/// the .build file.</param>
Generator(string stylesheetFilename)
{
// Load the transform.
string assemblyFolder = GetAssemblyFolder();
string xslFilename =
Path.Combine(assemblyFolder, stylesheetFilename);
// The base folder is taken from the full stylesheet path so
// we handle the case where the stylesheet is in a subdirectory
// off the assembly folder.
string baseFolder = Path.GetDirectoryName(xslFilename);
// Add a directory separator after the folder name otherwise
// the XmlUrlResolver does not resolve the imported stylesheets.
baseFolder = String.Concat(baseFolder, Path.DirectorySeparatorChar);
StreamReader xslStreamReader = new StreamReader(xslFilename, true);
XmlTextReader xslReader = new XmlTextReader(baseFolder, xslStreamReader);
xslTransform.Load(xslReader, xmlUrlResolver, GetType().Assembly.Evidence);
xslStreamReader.Close();
xslReader.Close();
}
/// <summary>
/// Creates a NAnt build file from a SharpDevelop .prjx project file.
/// </summary>
/// <param name="projectFilename">The SharpDevelop .prjx project filename.</param>
/// <param name="buildFilename">The NAnt build filename that
/// will be generated.</param>
/// <param name="stylesheetFilename">The stylesheet to convert the
/// project.</param>
public static void CreateBuildFile(string projectFilename, string buildFilename, string stylesheetFilename)
{
Generator generator = GetGenerator(stylesheetFilename);
generator.CreateBuildFile(projectFilename, buildFilename);
}
void CreateBuildFile(string projectFilename, string buildFilename)
{
xslTransform.Transform(projectFilename, buildFilename, xmlUrlResolver);
}
/// <summary>
/// Gets the assembly folder where this add-in was loaded from.
/// </summary>
/// <returns>The assembly folder where this add-in was loaded.</returns>
string GetAssemblyFolder()
{
Assembly assembly = GetType().Assembly;
string assemblyFilename = assembly.CodeBase.Replace("file:///", "");
string folder = Path.GetDirectoryName(assemblyFilename);
return folder;
}
/// <summary>
/// Gets the generator for the <paramref name="version"/>
/// specified.
/// </summary>
/// <remarks>
/// This method will create a new generator if one has not
/// been created for the particular <paramref name="version"/>,
/// otherwise it will re-use a generator.</remarks>
/// <param name="version">The NAnt version.</param>
/// <returns>A <see cref="Generator"/> instance.</returns>
static Generator GetGenerator(string version)
{
Generator generator = (Generator)generatorsHashtable[version];
if (generator == null) {
generator = new Generator(version);
generatorsHashtable.Add(version, generator);
}
return generator;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -