build: move version number definition to central place, clean up build tools

This commit is contained in:
Hylke Bons 2012-07-26 15:17:29 +02:00
parent 7254769a4b
commit 2b4843ad24
206 changed files with 83 additions and 42338 deletions

View file

@ -1,11 +0,0 @@
/*
* AssemblyInfo.cs
*
* This is free software. See COPYING for details.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyVersion("@ASM_VERSION@")]
[assembly: AssemblyTitle ("SparkleShare")]

View file

@ -15,16 +15,13 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Reflection;
[assembly: AssemblyTitle("SparkleLib")]
[assembly: AssemblyVersion("0.9.0.0")]
namespace SparkleLib {
public class Defines {
public const string VERSION = "@VERSION@";
public const string LOCALE_DIR = "@prefix@/share/locale";
public const string DATAROOTDIR = "@expanded_datadir@";
public const string GETTEXT_PACKAGE = "@GETTEXT_PACKAGE@";
public const string PREFIX = "@prefix@";
}
public class Defines {
public const string INSTALL_DIR = "@expanded_datadir@/sparkleshare";
}
}

View file

@ -1,6 +1,8 @@
ASSEMBLY = SparkleLib.Git
TARGET = library
ASSEMBLY_INFO_SOURCE = ../Defines.cs
LINK = -r:$(DIR_BIN)/SparkleLib.dll
SOURCES = \

View file

@ -11,6 +11,7 @@
<RootNamespace>SparkleLib.Git</RootNamespace>
<AssemblyName>SparkleLib.Git</AssemblyName>
<FileAlignment>512</FileAlignment>
<ReleaseVersion />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -29,43 +30,23 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<None Include="Defines.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>Defines.cs</LastGenOutput>
</None>
<None Include="GlobalAssemblyInfoGit.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>GlobalAssemblyInfoGit.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\Git\SparkleFetcherGit.cs">
<Compile Include="SparkleFetcherGit.cs">
<Link>SparkleFetcherGit.cs</Link>
</Compile>
<Compile Include="..\Git\SparkleGit.cs">
<Link>SparkleGit.cs</Link>
<Compile Include="SparkleGit.cs">
<SubType>Component</SubType>
<Link>SparkleGit.cs</Link>
</Compile>
<Compile Include="..\Git\SparkleRepoGit.cs">
<Compile Include="SparkleRepoGit.cs">
<Link>SparkleRepoGit.cs</Link>
</Compile>
<Compile Include="Defines.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Defines.tt</DependentUpon>
</Compile>
<Compile Include="GlobalAssemblyInfoGit.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>GlobalAssemblyInfoGit.tt</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="SparkleLib.csproj">
<ProjectReference Include="..\SparkleLib.csproj">
<Project>{2C914413-B31C-4362-93C7-1AE34F09112A}</Project>
<Name>SparkleLib</Name>
</ProjectReference>

View file

@ -1,6 +1,8 @@
ASSEMBLY = SparkleLib
TARGET = library
ASSEMBLY_INFO_SOURCE = Defines.cs
SOURCES = \
Defines.cs \
SparkleAnnouncement.cs \

View file

@ -16,7 +16,7 @@
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
namespace SparkleLib {
@ -25,16 +25,11 @@ namespace SparkleLib {
public static string Version {
get {
return Defines.VERSION;
return Assembly.GetExecutingAssembly ().GetName ().Version.ToString ();
}
}
// Strange magic needed by Platform ()
[DllImport ("libc")]
private static extern int uname (IntPtr buf);
// This fixes the PlatformID enumeration for MacOSX in Environment.OSVersion.Platform,
// which is intentionally broken in Mono for historical reasons
public static PlatformID Platform {
@ -56,5 +51,9 @@ namespace SparkleLib {
return Environment.OSVersion.Platform;
}
}
[DllImport ("libc")]
private static extern int uname (IntPtr buf);
}
}

13
SparkleLib/SparkleLib.csproj Executable file → Normal file
View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -9,6 +9,8 @@
<OutputType>Library</OutputType>
<RootNamespace>SparkleLib</RootNamespace>
<AssemblyName>SparkleLib</AssemblyName>
<ReleaseVersion />
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -35,15 +37,10 @@
</ItemGroup>
<ItemGroup>
<Compile Include="SparkleRepoBase.cs" />
<Compile Include="Git/SparkleRepoGit.cs" />
<Compile Include="Hg/SparkleRepoHg.cs" />
<Compile Include="SparkleFetcherBase.cs" />
<Compile Include="Git/SparkleFetcherGit.cs" />
<Compile Include="Hg/SparkleFetcherHg.cs" />
<Compile Include="Defines.cs" />
<Compile Include="SparkleAnnouncement.cs" />
<Compile Include="SparkleHelpers.cs" />
<Compile Include="SparklePaths.cs" />
<Compile Include="SparkleWrappers.cs" />
<Compile Include="SparkleListenerBase.cs" />
<Compile Include="SparkleListenerFactory.cs" />
@ -52,11 +49,13 @@
<Compile Include="SparkleConfig.cs" />
<Compile Include="SparkleWatcher.cs" />
<Compile Include="SparkleExtensions.cs" />
<Compile Include="SparkleExceptions.cs" />
<Compile Include="SparkleUser.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<MonoDevelop>
<Properties InternalTargetFrameworkVersion="3.5">
<Properties>
<MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="Makefile.am">
<BuildFilesVar Sync="true" Name="SOURCES" />
<DeployFilesVar />

View file

@ -1,14 +0,0 @@
/*
* AssemblyInfo.cs
*
* This is free software. See COPYING for details.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle ("SparkleLib")]
[assembly: AssemblyDescription ("SparkleShare is a simple file sharing and collaboration tool.")]
[assembly: Guid ("38092E48-5DCC-4d23-8109-9D994E710ACF")]

View file

@ -1,46 +0,0 @@
// SparkleShare, an instant update workflow to Git.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// 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 3 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, see <http://www.gnu.org/licenses/>.
<#@ template language="C#v3.5" HostSpecific="true" #>
<#@ output extension="cs" #>
<#@ include file="getversion.tt" #>
<#
PlatformID platform = Environment.OSVersion.Platform;
bool IsWindows = (platform == PlatformID.Win32NT
|| platform == PlatformID.Win32S
|| platform == PlatformID.Win32Windows
|| platform == PlatformID.WinCE);
#>
using System;
namespace SparkleLib {
public class Defines {
public const string VERSION = "<#= VERSION #>";
public const string LOCALE_DIR = "@prefix@/share/locale";
public const string DATAROOTDIR = "@expanded_datadir@";
public const string GETTEXT_PACKAGE = "@GETTEXT_PACKAGE@";
public const string PREFIX = "@prefix@";
public const string OPEN_COMMAND = "xdg-open";
}
}

View file

@ -1,25 +0,0 @@
/*
* GlobalAssemblyInfo.cs
*
* This is free software. See COPYING for details.
*/
<#@ template language="C#v3.5" HostSpecific="true" #>
<#@ output extension="cs" #>
<#@ include file="getversion.tt" #>
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyProduct("SparkleLib.Git")]
[assembly: AssemblyVersion("<#= ASM_VERSION #>")]
[assembly: AssemblyFileVersion("<#= ASM_FILE_VERSION #>")]
[assembly: AssemblyInformationalVersion("<#= VERSION #>")]
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif

View file

@ -1,25 +0,0 @@
/*
* GlobalAssemblyInfo.cs
*
* This is free software. See COPYING for details.
*/
<#@ template language="C#v3.5" HostSpecific="true" #>
<#@ output extension="cs" #>
<#@ include file="getversion.tt" #>
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyProduct("SparkleShare")]
[assembly: AssemblyVersion("<#= ASM_VERSION #>")]
[assembly: AssemblyFileVersion("<#= ASM_FILE_VERSION #>")]
[assembly: AssemblyInformationalVersion("<#= VERSION #>")]
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif

View file

@ -1,294 +0,0 @@
<StyleCopSettings Version="105">
<Analyzers>
<Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
<Rules>
<Rule Name="CurlyBracketsForMultiLineStatementsMustNotShareLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="StatementMustNotBeOnSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementMustNotBeOnSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CurlyBracketsMustNotBeOmitted">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="AllAccessorsMustBeMultiLineOrSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="OpeningCurlyBracketsMustNotBeFollowedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationHeadersMustNotBeFollowedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CodeMustNotContainMultipleBlankLinesInARow">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ClosingCurlyBracketsMustNotBePrecededByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="OpeningCurlyBracketsMustNotBePrecededByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ChainedStatementBlocksMustNotBePrecededByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="WhileDoFooterMustNotBePrecededByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SingleLineCommentsMustNotBeFollowedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ClosingCurlyBracketMustBeFollowedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationHeaderMustBePrecededByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SingleLineCommentMustBePrecededByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustBeSeparatedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CodeMustNotContainBlankLinesAtStartOfFile">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CodeMustNotContainBlankLinesAtEndOfFile">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.NamingRules">
<Rules>
<Rule Name="ElementMustBeginWithUpperCaseLetter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementMustBeginWithLowerCaseLetter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="InterfaceNamesMustBeginWithI">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ConstFieldNamesMustBeginWithUpperCaseLetter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FieldNamesMustNotUseHungarianNotation">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FieldNamesMustBeginWithLowerCaseLetter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="AccessibleFieldsMustBeginWithUpperCaseLetter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="VariableNamesMustNotBePrefixed">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FieldNamesMustNotBeginWithUnderscore">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FieldNamesMustNotContainUnderscore">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.OrderingRules">
<Rules>
<Rule Name="UsingDirectivesMustBePlacedWithinNamespace">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustAppearInTheCorrectOrder">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustBeOrderedByAccess">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ConstantsMustAppearBeforeFields">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="StaticElementsMustAppearBeforeInstanceElements">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DeclarationKeywordsMustFollowOrder">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ProtectedMustComeBeforeInternal">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PropertyAccessorsMustFollowOrder">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="EventAccessorsMustFollowOrder">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="UsingDirectivesMustBeOrderedAlphabeticallyByNamespace">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.ReadabilityRules">
<Rules>
<Rule Name="DoNotPrefixCallsWithBaseUnlessLocalImplementationExists">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PrefixLocalCallsWithThis">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="OpeningParenthesisMustBeOnDeclarationLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ClosingParenthesisMustBeOnLineOfLastParameter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ClosingParenthesisMustBeOnLineOfOpeningParenthesis">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CommaMustBeOnSameLineAsPreviousParameter">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ParameterListMustFollowDeclaration">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ParameterMustFollowComma">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SplitParametersMustStartOnLineAfterDeclaration">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ParametersMustBeOnSameLineOrSeparateLines">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ParameterMustNotSpanMultipleLines">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
</Analyzers>
</StyleCopSettings>

View file

@ -1,168 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{2C914413-B31C-4362-93C7-1AE34F09112A}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>SparkleLib</RootNamespace>
<AssemblyName>SparkleLib</AssemblyName>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\bin</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\bin</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SparkleAnnouncement.cs">
<Link>SparkleAnnouncement.cs</Link>
</Compile>
<Compile Include="..\SparkleConfig.cs">
<Link>SparkleConfig.cs</Link>
</Compile>
<Compile Include="..\SparkleExtensions.cs">
<Link>SparkleExtensions.cs</Link>
</Compile>
<Compile Include="..\SparkleListenerFactory.cs">
<Link>SparkleListenerFactory.cs</Link>
</Compile>
<Compile Include="..\SparkleRepoBase.cs">
<Link>SparkleRepoBase.cs</Link>
</Compile>
<Compile Include="..\SparkleUser.cs">
<Link>SparkleUser.cs</Link>
</Compile>
<Compile Include="..\SparkleWatcher.cs">
<Link>SparkleWatcher.cs</Link>
<SubType>Component</SubType>
</Compile>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Defines.cs">
<DependentUpon>Defines.tt</DependentUpon>
<SubType>Code</SubType>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Include="..\SparkleFetcherBase.cs" />
<Compile Include="..\SparkleHelpers.cs" />
<Compile Include="..\SparkleWrappers.cs" />
<Compile Include="..\SparkleListenerBase.cs" />
<Compile Include="..\SparkleListenerTcp.cs" />
<Compile Include="..\SparkleBackend.cs" />
<Compile Include="GlobalAssemblyInfo.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>GlobalAssemblyInfo.tt</DependentUpon>
</Compile>
<Compile Include="..\SparkleExceptions.cs">
<Link>SparkleExceptions.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
<Visible>False</Visible>
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<None Include="Defines.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>Defines.cs</LastGenOutput>
</None>
<None Include="GlobalAssemblyInfo.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>GlobalAssemblyInfo.cs</LastGenOutput>
</None>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<MonoDevelop>
<Properties>
<MonoDevelop.Autotools.MakefileInfo RelativeMakefileName="Makefile.am">
<BuildFilesVar Sync="true" Name="SOURCES" />
<DeployFilesVar />
<ResourcesVar />
<OthersVar />
<GacRefVar />
<AsmRefVar />
<ProjectRefVar />
</MonoDevelop.Autotools.MakefileInfo>
</Properties>
</MonoDevelop>
<VisualStudio />
</ProjectExtensions>
<PropertyGroup>
<PreBuildEvent>"$(ProjectDir)transform_tt.cmd"</PreBuildEvent>
</PropertyGroup>
</Project>

View file

@ -1,15 +0,0 @@
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#
String VERSION;
String ASM_VERSION;
String ASM_FILE_VERSION;
VERSION = ASM_VERSION = ASM_FILE_VERSION = "0.9.0";
#>
// VERSION=<#= VERSION #>
// ASM_VERSION=<#= ASM_VERSION #>

View file

@ -1,11 +0,0 @@
@echo off
cd %~dp0
set TextTransform=..\..\SparkleShare\Windows\tools\TextTemplating\bin\TextTransform.exe
if not exist %TextTransform% call ..\..\SparkleShare\Windows\tools\TextTemplating\build.cmd
echo running texttransform..
%TextTransform% -out Defines.cs Defines.tt
%TextTransform% -out GlobalAssemblyInfo.cs GlobalAssemblyInfo.tt
%TextTransform% -out GlobalAssemblyInfoGit.cs GlobalAssemblyInfoGit.tt

View file

@ -22,6 +22,7 @@ using System.IO;
using MonoMac.Foundation;
using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
using SparkleLib;
namespace SparkleShare {

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
@ -10,9 +10,10 @@
<OutputType>Exe</OutputType>
<RootNamespace>SparkleShare</RootNamespace>
<AssemblyName>SparkleShare</AssemblyName>
<ReleaseVersion>0.9.0</ReleaseVersion>
<ReleaseVersion>
</ReleaseVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
@ -20,19 +21,11 @@
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<CustomCommands>
<CustomCommands>
<Command type="AfterBuild" command="mkdir -p ${TargetDir}/${SolutionName}.app/Contents/Frameworks; cp -r Growl.framework ${TargetDir}/${SolutionName}.app/Contents/Frameworks; cp -r git ${TargetDir}/${SolutionName}.app/Contents/Resources; cp -r SparkleShareInviteOpener.app ${TargetDir}/${SolutionName}.app/Contents/Resources" externalConsole="true" />
</CustomCommands>
</CustomCommands>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
@ -43,12 +36,6 @@
<Reference Include="System.Drawing" />
<Reference Include="MonoMac" />
<Reference Include="System.Net" />
<Reference Include="SparkleLib">
<HintPath>..\..\bin\SparkleLib.dll</HintPath>
</Reference>
<Reference Include="SparkleLib.Git">
<HintPath>..\..\bin\SparkleLib.Git.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AppDelegate.cs">
@ -270,4 +257,14 @@
<Folder Include="HTML\" />
<Folder Include="Plugins\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\SparkleLib\SparkleLib.csproj">
<Project>{2C914413-B31C-4362-93C7-1AE34F09112A}</Project>
<Name>SparkleLib</Name>
</ProjectReference>
<ProjectReference Include="..\..\SparkleLib\Git\SparkleLib.Git.csproj">
<Project>{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}</Project>
<Name>SparkleLib.Git</Name>
</ProjectReference>
</ItemGroup>
</Project>

View file

@ -3,19 +3,29 @@ Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleShare", "SparkleShare.csproj", "{CF5BC8DB-A633-4FCC-8A3E-E3AC9B59FABC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib", "..\..\SparkleLib\SparkleLib.csproj", "{2C914413-B31C-4362-93C7-1AE34F09112A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib.Git", "..\..\SparkleLib\Git\SparkleLib.Git.csproj", "{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Debug|Any CPU = Debug|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CF5BC8DB-A633-4FCC-8A3E-E3AC9B59FABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF5BC8DB-A633-4FCC-8A3E-E3AC9B59FABC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Release|Any CPU.Build.0 = Release|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.Build.0 = Release|Any CPU
{CF5BC8DB-A633-4FCC-8A3E-E3AC9B59FABC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF5BC8DB-A633-4FCC-8A3E-E3AC9B59FABC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = SparkleShare.csproj
version = 0.9.0
version =
EndGlobalSection
EndGlobal

View file

@ -1,25 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons (hylkebons@gmail.com)
//
// 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 3 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, see (http://www.gnu.org/licenses/).
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle ("SparkleShare")]
[assembly: AssemblyDescription ("SparkleShare is a simple file sharing and collaboration tool.")]
[assembly: Guid ("A8F34995-DB20-4bf2-AA27-869B15B8C2F9")]

View file

@ -30,6 +30,7 @@
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<ApplicationIcon>Pixmaps\sparkleshare-app.ico</ApplicationIcon>
<ReleaseVersion />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -70,12 +71,6 @@
<Reference Include="System.Xaml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\SparkleLib\windows\GlobalAssemblyInfo.cs">
<Link>GlobalAssemblyInfo.cs</Link>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>GlobalAssemblyInfo.tt</DependentUpon>
</Compile>
<Compile Include="..\SparkleBubblesController.cs">
<Link>SparkleBubblesController.cs</Link>
</Compile>
@ -94,7 +89,6 @@
<Compile Include="..\SparkleStatusIconController.cs">
<Link>SparkleStatusIconController.cs</Link>
</Compile>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="..\SparkleSetupController.cs" />
<Compile Include="SparkleShortcut.cs" />
<Compile Include="SparkleUI.cs" />
@ -119,12 +113,6 @@
<Compile Include="SparkleNotifyIcon.cs" />
<Compile Include="SparkleSpinner.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\SparkleLib\windows\SparkleLib.csproj">
<Project>{2C914413-B31C-4362-93C7-1AE34F09112A}</Project>
<Name>SparkleLib</Name>
</ProjectReference>
</ItemGroup>
<ProjectExtensions>
<MonoDevelop>
<Properties>
@ -162,13 +150,6 @@
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\SparkleLib\windows\GlobalAssemblyInfo.tt">
<Link>GlobalAssemblyInfo.tt</Link>
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>GlobalAssemblyInfo.cs</LastGenOutput>
</None>
</ItemGroup>
<PropertyGroup>
<PreBuildEvent>"$(ProjectDir)transform_tt.cmd"</PreBuildEvent>
</PropertyGroup>
@ -303,4 +284,10 @@
<EmbeddedResource Include="Pixmaps\tutorial-slide-2.png" />
<EmbeddedResource Include="Pixmaps\tutorial-slide-3.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\SparkleLib\SparkleLib.csproj">
<Project>{2C914413-B31C-4362-93C7-1AE34F09112A}</Project>
<Name>SparkleLib</Name>
</ProjectReference>
</ItemGroup>
</Project>

View file

@ -7,26 +7,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleShare", "SparkleShar
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE} = {009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib", "..\..\SparkleLib\windows\SparkleLib.csproj", "{2C914413-B31C-4362-93C7-1AE34F09112A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib.Git", "..\..\SparkleLib\windows\SparkleLib.Git.csproj", "{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleShareInviteOpener", "SparkleShareInviteOpener\SparkleShareInviteOpener.csproj", "{1DB5492D-B897-4A5E-8DD7-175EC65F52F2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib", "..\..\SparkleLib\SparkleLib.csproj", "{2C914413-B31C-4362-93C7-1AE34F09112A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib.Git", "..\..\SparkleLib\Git\SparkleLib.Git.csproj", "{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Release|Any CPU.Build.0 = Release|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.Build.0 = Release|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -35,13 +27,22 @@ Global
{1DB5492D-B897-4A5E-8DD7-175EC65F52F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1DB5492D-B897-4A5E-8DD7-175EC65F52F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1DB5492D-B897-4A5E-8DD7-175EC65F52F2}.Release|Any CPU.Build.0 = Release|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.Build.0 = Release|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = SparkleShare.csproj
version =
outputpath = bin
name = SparkleShare
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = SparkleShare.csproj
outputpath = bin
name = SparkleShare
EndGlobalSection
EndGlobal

View file

@ -10,10 +10,9 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SparkleShareInviteOpener</RootNamespace>
<AssemblyName>SparkleShareInviteOpener</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ApplicationIcon>..\Pixmaps\sparkleshare-app.ico</ApplicationIcon>
<TargetFrameworkProfile />
<ReleaseVersion />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View file

@ -1,2 +0,0 @@
.gitattributes eol=lf
.gitmodules eol=lf

View file

@ -1,11 +0,0 @@
*~
*.bak
*.suo
*.user
*.sln.cache
bin/
obj/
_ReSharper.*/
_UpgradeReport_Files/
Backup/
UpgradeLog.XML

View file

@ -1,9 +0,0 @@
2009-08-12 Michael Hutchinson <mhutchinson@novell.com>
* Makefile.am:
* TextTransform:
* Mono.TextTemplating:
* Mono.TextTemplating.Tests:
* MonoDevelop.TextTemplating: Include the ASP.NET MVC and
TextTemplating addins in the main solution and build.

View file

@ -1,4 +0,0 @@
SUBDIRS = \
Mono.TextTemplating \
TextTransform \
MonoDevelop.TextTemplating

View file

@ -1,65 +0,0 @@
2009-12-11 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Don't local-copy nunit.
2009-11-27 Olivier Dagenais <olivier.dagenais@gmail.com>
* GenerationTests.cs: Make tests independent of the runtime
they are running under by stripping the "autogenerated"
comment (i.e. the first 9 lines).
2009-10-29 Lluis Sanchez Gual <lluis@novell.com>
* Mono.TextTemplating.Tests.csproj: Flush.
2009-08-13 Lluis Sanchez Gual <lluis@novell.com>
* DummyHost.cs: Fix windows build.
2009-08-13 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Use assembly refs for
nunit.
2009-08-12 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Include the ASP.NET MVC
and TextTemplating addins in the main solution and build.
2009-04-13 Michael Hutchinson <mhutchinson@novell.com>
* GenerationTests.cs: Add tests for Windows/Mac newlines.
2009-04-03 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Updated.
* GenerationTests.cs: Add test for C# output.
* ParsingTests.cs: Track dummy host name change.
* DummyHost.cs: Add more functionality to dummy host.
2009-03-13 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Move output dir from
../bin to ../build.
2009-03-13 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Fix output directory.
2009-03-12 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Updated.
* ParsingTests.cs: Add parser test.
* DummyHost.cs: Dummy templating host.
2009-03-12 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.Tests.csproj: Add tests.
* ParsingTests.cs: Tokeniser state/value/location test.

View file

@ -1,113 +0,0 @@
//
// IncludeFileProviderHost.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using Microsoft.VisualStudio.TextTemplating;
namespace Mono.TextTemplating.Tests
{
public class DummyHost : ITextTemplatingEngineHost
{
public readonly Dictionary<string, string> Locations = new Dictionary<string, string> ();
public readonly Dictionary<string, string> Contents = new Dictionary<string, string> ();
public readonly Dictionary<string, object> HostOptions = new Dictionary<string, object> ();
List<string> standardAssemblyReferences = new List<string> ();
List<string> standardImports = new List<string> ();
public readonly CompilerErrorCollection Errors = new CompilerErrorCollection ();
public readonly Dictionary<string, Type> DirectiveProcessors = new Dictionary<string, Type> ();
public virtual object GetHostOption (string optionName)
{
object o;
HostOptions.TryGetValue (optionName, out o);
return o;
}
public virtual bool LoadIncludeText (string requestFileName, out string content, out string location)
{
content = null;
return Locations.TryGetValue (requestFileName, out location)
&& Contents.TryGetValue (requestFileName, out content);
}
public virtual void LogErrors (CompilerErrorCollection errors)
{
Errors.AddRange (errors);
}
public virtual AppDomain ProvideTemplatingAppDomain (string content)
{
return null;
}
public virtual string ResolveAssemblyReference (string assemblyReference)
{
throw new System.NotImplementedException();
}
public virtual Type ResolveDirectiveProcessor (string processorName)
{
Type t;
DirectiveProcessors.TryGetValue (processorName, out t);
return t;
}
public virtual string ResolveParameterValue (string directiveId, string processorName, string parameterName)
{
throw new System.NotImplementedException();
}
public virtual string ResolvePath (string path)
{
throw new System.NotImplementedException();
}
public virtual void SetFileExtension (string extension)
{
throw new System.NotImplementedException();
}
public virtual void SetOutputEncoding (System.Text.Encoding encoding, bool fromOutputDirective)
{
throw new System.NotImplementedException();
}
public virtual IList<string> StandardAssemblyReferences {
get { return standardAssemblyReferences; }
}
public virtual IList<string> StandardImports {
get { return standardImports; }
}
public virtual string TemplateFile {
get; set;
}
}
}

View file

@ -1,171 +0,0 @@
//
// GenerationTests.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;
using Microsoft.VisualStudio.TextTemplating;
namespace Mono.TextTemplating.Tests
{
[TestFixture]
public class GenerationTests
{
[Test]
public void Generate ()
{
string Input = ParsingTests.ParseSample1;
string Output = OutputSample1;
Generate (Input, Output, "\n");
}
[Test]
public void GenerateMacNewlines ()
{
string MacInput = ParsingTests.ParseSample1.Replace ("\n", "\r");
string MacOutput = OutputSample1.Replace ("\\n", "\\r").Replace ("\n", "\r");;
Generate (MacInput, MacOutput, "\r");
}
[Test]
public void GenerateWindowsNewlines ()
{
string WinInput = ParsingTests.ParseSample1.Replace ("\n", "\r\n");
string WinOutput = OutputSample1.Replace ("\\n", "\\r\\n").Replace ("\n", "\r\n");
Generate (WinInput, WinOutput, "\r\n");
}
//NOTE: we set the newline property on the code generator so that the whole files has matching newlines,
// in order to match the newlines in the verbatim code blocks
void Generate (string input, string expectedOutput, string newline)
{
DummyHost host = new DummyHost ();
string className = "GeneratedTextTransformation4f504ca0";
string code = GenerateCode (host, input, className, newline);
Assert.AreEqual (0, host.Errors.Count);
Assert.AreEqual (expectedOutput, TemplatingEngineHelper.StripHeader (code, newline));
}
#region Helpers
string GenerateCode (ITextTemplatingEngineHost host, string content, string name, string generatorNewline)
{
ParsedTemplate pt = ParsedTemplate.FromText (content, host);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
TemplateSettings settings = TemplatingEngine.GetSettings (host, pt);
if (name != null)
settings.Name = name;
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
var ccu = TemplatingEngine.GenerateCompileUnit (host, content, pt, settings);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
var opts = new System.CodeDom.Compiler.CodeGeneratorOptions ();
using (var writer = new System.IO.StringWriter ()) {
writer.NewLine = generatorNewline;
settings.Provider.GenerateCodeFromCompileUnit (ccu, writer, opts);
return writer.ToString ();
}
}
#endregion
#region Expected output strings
public static string OutputSample1 =
@"
namespace Microsoft.VisualStudio.TextTemplating {
public partial class GeneratedTextTransformation4f504ca0 : global::Microsoft.VisualStudio.TextTemplating.TextTransformation {
#line 9 """"
baz \#>
#line default
#line hidden
public override string TransformText() {
this.GenerationEnvironment = null;
#line 2 """"
this.Write(""Line One\nLine Two\n"");
#line default
#line hidden
#line 4 """"
foo
#line default
#line hidden
#line 7 """"
this.Write(""Line Three "");
#line default
#line hidden
#line 7 """"
this.Write(global::Microsoft.VisualStudio.TextTemplating.ToStringHelper.ToStringWithCulture( bar ));
#line default
#line hidden
#line 7 """"
this.Write(""\nLine Four\n"");
#line default
#line hidden
return this.GenerationEnvironment.ToString();
}
protected override void Initialize() {
base.Initialize();
}
}
}
";
#endregion
}
}

View file

@ -1,55 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{CB590106-8331-4CBE-8131-B154E7BF79E1}</ProjectGuid>
<OutputType>Library</OutputType>
<AssemblyName>Mono.TextTemplating.Tests</AssemblyName>
<RootNamespace>Mono.TextTemplating.Tests</RootNamespace>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="nunit.core">
<HintPath>..\NUnit\lib\nunit.core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\NUnit\lib\nunit.framework.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ParsingTests.cs" />
<Compile Include="DummyHost.cs" />
<Compile Include="GenerationTests.cs" />
<Compile Include="TemplatingEngineHelper.cs" />
<Compile Include="TemplateEnginePreprocessTemplateTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Mono.TextTemplating\Mono.TextTemplating.csproj">
<Project>{A2364D6A-00EF-417C-80A6-815726C70032}</Project>
<Name>Mono.TextTemplating</Name>
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -1,191 +0,0 @@
//
// Test.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using NUnit.Framework;
namespace Mono.TextTemplating.Tests
{
[TestFixture]
public class ParsingTests
{
public static string ParseSample1 =
@"<#@ template language=""C#v3.5"" #>
Line One
Line Two
<#
foo
#>
Line Three <#= bar #>
Line Four
<#+
baz \#>
#>
";
[Test]
public void TokenTest ()
{
string tf = "test.input";
Tokeniser tk = new Tokeniser (tf, ParseSample1);
//line 1
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 1, 1), tk.Location);
Assert.AreEqual (State.Content, tk.State);
Assert.AreEqual ("", tk.Value);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (State.Directive, tk.State);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 1, 5), tk.Location);
Assert.AreEqual (State.DirectiveName, tk.State);
Assert.AreEqual ("template", tk.Value);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (State.Directive, tk.State);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 1, 14), tk.Location);
Assert.AreEqual (State.DirectiveName, tk.State);
Assert.AreEqual ("language", tk.Value);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (State.Directive, tk.State);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (State.DirectiveValue, tk.State);
Assert.AreEqual (new Location (tf, 1, 23), tk.Location);
Assert.AreEqual ("C#v3.5", tk.Value);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (State.Directive, tk.State);
//line 2, 3
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 2, 1), tk.Location);
Assert.AreEqual (State.Content, tk.State);
Assert.AreEqual ("Line One\nLine Two\n", tk.Value);
//line 4, 5, 6
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 4, 1), tk.TagStartLocation);
Assert.AreEqual (new Location (tf, 4, 3), tk.Location);
Assert.AreEqual (new Location (tf, 6, 3), tk.TagEndLocation);
Assert.AreEqual (State.Block, tk.State);
Assert.AreEqual ("\nfoo\n", tk.Value);
//line 7
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 7, 1), tk.Location);
Assert.AreEqual (State.Content, tk.State);
Assert.AreEqual ("Line Three ", tk.Value);
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 7, 12), tk.TagStartLocation);
Assert.AreEqual (new Location (tf, 7, 15), tk.Location);
Assert.AreEqual (new Location (tf, 7, 22), tk.TagEndLocation);
Assert.AreEqual (State.Expression, tk.State);
Assert.AreEqual (" bar ", tk.Value);
//line 8
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 7, 22), tk.Location);
Assert.AreEqual (State.Content, tk.State);
Assert.AreEqual ("\nLine Four\n", tk.Value);
//line 9, 10, 11
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 9, 1), tk.TagStartLocation);
Assert.AreEqual (new Location (tf, 9, 4), tk.Location);
Assert.AreEqual (new Location (tf, 11, 3), tk.TagEndLocation);
Assert.AreEqual (State.Helper, tk.State);
Assert.AreEqual (" \nbaz \\#>\n", tk.Value);
//line 12
Assert.IsTrue (tk.Advance ());
Assert.AreEqual (new Location (tf, 12, 1), tk.Location);
Assert.AreEqual (State.Content, tk.State);
Assert.AreEqual ("", tk.Value);
//EOF
Assert.IsFalse (tk.Advance ());
Assert.AreEqual (new Location (tf, 12, 1), tk.Location);
Assert.AreEqual (State.EOF, tk.State);
}
[Test]
public void ParseTest ()
{
string tf = "test.input";
ParsedTemplate pt = new ParsedTemplate ("test.input");
Tokeniser tk = new Tokeniser (tf, ParseSample1);
DummyHost host = new DummyHost ();
pt.Parse (host, tk);
Assert.AreEqual (0, pt.Errors.Count);
var content = new List<TemplateSegment> (pt.Content);
var dirs = new List<Directive> (pt.Directives);
Assert.AreEqual (1, dirs.Count);
Assert.AreEqual (6, content.Count);
Assert.AreEqual ("template", dirs[0].Name);
Assert.AreEqual (1, dirs[0].Attributes.Count);
Assert.AreEqual ("C#v3.5", dirs[0].Attributes["language"]);
Assert.AreEqual (new Location (tf, 1, 1), dirs[0].TagStartLocation);
Assert.AreEqual (new Location (tf, 1, 34), dirs[0].EndLocation);
Assert.AreEqual ("Line One\nLine Two\n", content[0].Text);
Assert.AreEqual ("\nfoo\n", content[1].Text);
Assert.AreEqual ("Line Three ", content[2].Text);
Assert.AreEqual (" bar ", content[3].Text);
Assert.AreEqual ("\nLine Four\n", content[4].Text);
Assert.AreEqual (" \nbaz \\#>\n", content[5].Text);
Assert.AreEqual (SegmentType.Content, content[0].Type);
Assert.AreEqual (SegmentType.Block, content[1].Type);
Assert.AreEqual (SegmentType.Content, content[2].Type);
Assert.AreEqual (SegmentType.Expression, content[3].Type);
Assert.AreEqual (SegmentType.Content, content[4].Type);
Assert.AreEqual (SegmentType.Helper, content[5].Type);
Assert.AreEqual (new Location (tf, 4, 1), content[1].TagStartLocation);
Assert.AreEqual (new Location (tf, 7, 12), content[3].TagStartLocation);
Assert.AreEqual (new Location (tf, 9, 1), content[5].TagStartLocation);
Assert.AreEqual (new Location (tf, 2, 1), content[0].StartLocation);
Assert.AreEqual (new Location (tf, 4, 3), content[1].StartLocation);
Assert.AreEqual (new Location (tf, 7, 1), content[2].StartLocation);
Assert.AreEqual (new Location (tf, 7, 15), content[3].StartLocation);
Assert.AreEqual (new Location (tf, 7, 22), content[4].StartLocation);
Assert.AreEqual (new Location (tf, 9, 4), content[5].StartLocation);
Assert.AreEqual (new Location (tf, 6, 3), content[1].EndLocation);
Assert.AreEqual (new Location (tf, 7, 22), content[3].EndLocation);
Assert.AreEqual (new Location (tf, 11, 3), content[5].EndLocation);
}
}
}

View file

@ -1,246 +0,0 @@
//
// TemplateEnginePreprocessTemplateTests.cs
//
// Author:
// Matt Ward
//
// Copyright (c) 2010 Matt Ward
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;
using Microsoft.VisualStudio.TextTemplating;
namespace Mono.TextTemplating.Tests
{
[TestFixture]
public class TemplateEnginePreprocessTemplateTests
{
[Test]
public void Preprocess ()
{
string input =
"<#@ template language=\"C#\" #>\r\n" +
"Test\r\n";
string expectedOutput = OutputSample1;
string output = Preprocess (input);
Assert.AreEqual (expectedOutput, output);
}
#region Helpers
string Preprocess (string input)
{
DummyHost host = new DummyHost ();
string className = "PreprocessedTemplate";
string classNamespace = "Templating";
string language = null;
string[] references = null;
TemplatingEngine engine = new TemplatingEngine ();
string output = engine.PreprocessTemplate (input, host, className, classNamespace, out language, out references);
output = output.Replace ("\r\n", "\n");
return TemplatingEngineHelper.StripHeader (output, "\n");
}
#endregion
#region Expected output strings
public static string OutputSample1 =
@"
namespace Templating {
public partial class PreprocessedTemplate : PreprocessedTemplateBase {
public virtual string TransformText() {
this.GenerationEnvironment = null;
#line 2 """"
this.Write(""Test\r\n"");
#line default
#line hidden
return this.GenerationEnvironment.ToString();
}
protected virtual void Initialize() {
}
}
public class PreprocessedTemplateBase {
private global::System.Text.StringBuilder builder;
private global::System.Collections.Generic.IDictionary<string, object> session;
private global::System.CodeDom.Compiler.CompilerErrorCollection errors;
private string currentIndent = string.Empty;
private global::System.Collections.Generic.Stack<int> indents;
private ToStringInstanceHelper _toStringHelper = new ToStringInstanceHelper();
public virtual global::System.Collections.Generic.IDictionary<string, object> Session {
get {
return this.session;
}
set {
this.session = value;
}
}
public global::System.Text.StringBuilder GenerationEnvironment {
get {
if ((this.builder == null)) {
this.builder = new global::System.Text.StringBuilder();
}
return this.builder;
}
set {
this.builder = value;
}
}
protected global::System.CodeDom.Compiler.CompilerErrorCollection Errors {
get {
if ((this.errors == null)) {
this.errors = new global::System.CodeDom.Compiler.CompilerErrorCollection();
}
return this.errors;
}
}
public string CurrentIndent {
get {
return this.currentIndent;
}
}
private global::System.Collections.Generic.Stack<int> Indents {
get {
if ((this.indents == null)) {
this.indents = new global::System.Collections.Generic.Stack<int>();
}
return this.indents;
}
}
public ToStringInstanceHelper ToStringHelper {
get {
return this._toStringHelper;
}
}
public void Error(string message) {
this.Errors.Add(new global::System.CodeDom.Compiler.CompilerError(null, -1, -1, null, message));
}
public void Warning(string message) {
global::System.CodeDom.Compiler.CompilerError val = new global::System.CodeDom.Compiler.CompilerError(null, -1, -1, null, message);
val.IsWarning = true;
this.Errors.Add(val);
}
public string PopIndent() {
if ((this.Indents.Count == 0)) {
return string.Empty;
}
int lastPos = (this.currentIndent.Length - this.Indents.Pop());
string last = this.currentIndent.Substring(lastPos);
this.currentIndent = this.currentIndent.Substring(0, lastPos);
return last;
}
public void PushIndent(string indent) {
this.Indents.Push(indent.Length);
this.currentIndent = (this.currentIndent + indent);
}
public void ClearIndent() {
this.currentIndent = string.Empty;
this.Indents.Clear();
}
public void Write(string textToAppend) {
this.GenerationEnvironment.Append(textToAppend);
}
public void Write(string format, params object[] args) {
this.GenerationEnvironment.AppendFormat(format, args);
}
public void WriteLine(string textToAppend) {
this.GenerationEnvironment.Append(this.currentIndent);
this.GenerationEnvironment.AppendLine(textToAppend);
}
public void WriteLine(string format, params object[] args) {
this.GenerationEnvironment.Append(this.currentIndent);
this.GenerationEnvironment.AppendFormat(format, args);
this.GenerationEnvironment.AppendLine();
}
public class ToStringInstanceHelper {
private global::System.IFormatProvider formatProvider = global::System.Globalization.CultureInfo.InvariantCulture;
public global::System.IFormatProvider FormatProvider {
get {
return this.formatProvider;
}
set {
if ((this.formatProvider == null)) {
throw new global::System.ArgumentNullException(""formatProvider"");
}
this.formatProvider = value;
}
}
public string ToStringWithCulture(object objectToConvert) {
if ((objectToConvert == null)) {
throw new global::System.ArgumentNullException(""objectToConvert"");
}
global::System.Type type = objectToConvert.GetType();
global::System.Type iConvertibleType = typeof(global::System.IConvertible);
if (iConvertibleType.IsAssignableFrom(type)) {
return ((global::System.IConvertible)(objectToConvert)).ToString(this.formatProvider);
}
global::System.Reflection.MethodInfo methInfo = type.GetMethod(""ToString"", new global::System.Type[] {
iConvertibleType});
if ((methInfo != null)) {
return ((string)(methInfo.Invoke(objectToConvert, new object[] {
this.formatProvider})));
}
return objectToConvert.ToString();
}
}
}
}
";
#endregion
}
}

View file

@ -1,51 +0,0 @@
//
// Test.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.IO;
namespace Mono.TextTemplating.Tests
{
public static class TemplatingEngineHelper
{
public static string StripHeader (string input, string newLine)
{
using (var writer = new StringWriter ()) {
using (var reader = new StringReader (input)) {
for (int i = 0; i < 9; i++) {
reader.ReadLine ();
}
string line;
while ((line = reader.ReadLine ()) != null) {
writer.Write (line);
writer.Write (newLine);
}
}
return writer.ToString ();
}
}
}
}

View file

@ -1,37 +0,0 @@
//
// AssemblyInfo.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System.Reflection;
using System.Runtime.CompilerServices;
using System;
[assembly: AssemblyTitle("Mono.TextTemplating")]
[assembly: AssemblyDescription("An implementation of Visual Studio's T4 text templating")]
[assembly: AssemblyCompany("The Mono Project")]
[assembly: AssemblyProduct("MonoDevelop")]
[assembly: AssemblyCopyright("MIT/X11")]
[assembly: CLSCompliant (true)]
//[assembly: AssemblyVersion("1.0.0.0")]

View file

@ -1,212 +0,0 @@
2010-03-15 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplateGenerator.cs: Expose OutputFile
for custom tool to access.
2010-03-01 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs: A
handler for AssemblyResolve events that looks them up in the
domain that created the resolver.
* Makefile.am:
* Mono.TextTemplating.csproj: Added file.
2009-11-27 Olivier Dagenais <olivier.dagenais@gmail.com>
* Mono.TextTemplating/ParsedTemplate.cs: Fixed a bug where the
location of an error was being ignored.
2009-11-27 Olivier Dagenais <olivier.dagenais@gmail.com>
* Mono.TextTemplating/TemplatingEngine.cs: Mark the generated
type as partial.
2009-11-25 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/ParsedTemplate.cs: Don't check if
included file exists before trying to resolve it from the
host, because host may use include paths. Patch from Aaron
Bockover.
2009-08-17 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplatingEngine.cs: Fix NRE when
template fails to compile.
2009-08-12 Michael Hutchinson <mhutchinson@novell.com>
* Makefile.am:
* Mono.TextTemplating.csproj: Include the ASP.NET MVC and
TextTemplating addins in the main solution and build.
2009-08-11 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.csproj:
* Mono.TextTemplating/ParsedTemplate.cs:
* Mono.TextTemplating/CompiledTemplate.cs:
* Mono.TextTemplating/TemplatingEngine.cs:
* Mono.TextTemplating/TemplateGenerator.cs:
* Mono.TextTemplating/IExtendedTextTemplatingEngineHost.cs:
Add support for caching compiled templates, and a couple of
bugfixes. Patch from Nathan Baulch
(nathan.baulch@gmail.com).
2009-06-25 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplatingEngine.cs: Handle expressions
and content in helpers, based on patch from Nathan Baulch.
Liberally add C# 3 sugar to neaten up CodeDOM usage.
2009-06-25 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplateGenerator.cs: Added overload for
Process template that uses input/output strings directly,
avoiding file read/write. Expose engine to subclasses.
* Mono.TextTemplating/Tokeniser.cs: Remove outdated TODO.
2009-04-13 Michael Hutchinson <mhutchinson@novell.com>
* Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs: Use
IConvertible.ToString (formatProvider) when possible.
Thanks to Stuart Carnie for this patch.
2009-04-13 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/Tokeniser.cs: Add support for Mac and
Windows newlines.
* Mono.TextTemplating/TemplatingEngine.cs: Keep temp files
when in debug mode, so that the generated code can be
debugged.
* Mono.TextTemplating/ParsedTemplate.cs: Fixes for csc
compilation.
Thanks to Stuart Carnie for this patch.
2009-04-03 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.csproj:
* Mono.TextTemplating/TemplatingEngine.cs:
* Mono.TextTemplating/TemplateSettings.cs:
* Microsoft.VisualStudio.TextTemplating/Engine.cs: Move the
real engine into the Mono.TextTemplating namespace and
expose helper methods so that they can be tested.
2009-03-13 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.csproj: Move output dir from ../bin to
../build.
2009-03-12 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/Tokeniser.cs: Tweaked location of next
state after directive.
2009-03-12 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/Tokeniser.cs: Location tweaks within
directives.
* Mono.TextTemplating/ParsedTemplate.cs: Make Location
equatable.
2009-03-10 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/Tokeniser.cs:
* Mono.TextTemplating/ParsedTemplate.cs: Fix end location
capture after newline handling changes.
2009-03-10 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/Tokeniser.cs:
* Microsoft.VisualStudio.TextTemplating/Engine.cs: Match T4's
newline handling.
2009-03-10 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/ParsedTemplate.cs: Fix logic that
prevented adding directives.
2009-03-09 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/Tokeniser.cs:
* Mono.TextTemplating/ParsedTemplate.cs: More accurate
location captures. Capture start of tags as well as start of
content.
2009-03-09 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplateGenerator.cs: Report exceptions
in errors.
* Mono.TextTemplating/Tokeniser.cs: Make API public.
* Mono.TextTemplating/ParsedTemplate.cs: Unify segment types.
Track end locations. Make API public. Allow parsing without
includes.
* Microsoft.VisualStudio.TextTemplating/Engine.cs: Track
location API.
2009-03-06 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplateGenerator.cs: Fix
SetFileExtension.
* Microsoft.VisualStudio.TextTemplating/Engine.cs: Capture
hostspecific attribute from template directive.
2009-03-05 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating/TemplateGenerator.cs: Fix output
extension changing.
* Mono.TextTemplating/Tokeniser.cs: Fix helper regions.
2009-03-05 Michael Hutchinson <mhutchinson@novell.com>
* Mono.TextTemplating.csproj: Updated.
* Mono.TextTemplating/TemplateGenerator.cs: Simple template
host implementation. Doesn't handle everything yet.
* Mono.TextTemplating/Tokeniser.cs: Fix a number of offset
issues that broke most captures. Only allow EOF in content
regions, and in this case capture the last content. Track
current column, for error reporting.
* Mono.TextTemplating/ParsedTemplate.cs: Overhaul location
tracking for error reporting. Don't record empty segments.
* Microsoft.VisualStudio.TextTemplating/Engine.cs: Use run
method instead of runner, since the whole thing's done in
the appdomain now. Catch errors from the runner. Use host's
default assemblies and imports. Track ParsedTemplate error
reporting changes. Filter out content regions with only a
single newline.
* Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs:
Don't cache delegates; this won't work for instances. Maybe
IL generation is called for.
2009-03-04 Michael Hutchinson <mhutchinson@novell.com>
* AssemblyInfo.cs:
* Mono.TextTemplating:
* Mono.TextTemplating.csproj:
* Mono.TextTemplating/Tokeniser.cs:
* Microsoft.VisualStudio.TextTemplating:
* Mono.TextTemplating/ParsedTemplate.cs:
* Microsoft.VisualStudio.TextTemplating/Engine.cs:
* Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs:
* Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs:
* Microsoft.VisualStudio.TextTemplating/TextTransformation.cs:
* Microsoft.VisualStudio.TextTemplating/ITextTemplatingEngineHost.cs:
* Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs:
* Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs:
Move T4 implementation to its own assembly. Tweak some
appdomain stuff.

View file

@ -1,55 +0,0 @@
ADDIN_BUILD = $(top_builddir)/build/AddIns/MonoDevelop.TextTemplating
ASSEMBLY = $(ADDIN_BUILD)/Mono.TextTemplating.dll
DEPS =
REFS = \
-r:System \
-r:System.Core
FILES = \
AssemblyInfo.cs \
Microsoft.VisualStudio.TextTemplating/AssemblyCacheMonitor.cs \
Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs \
Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs \
Microsoft.VisualStudio.TextTemplating/EncodingHelper.cs \
Microsoft.VisualStudio.TextTemplating/Engine.cs \
Microsoft.VisualStudio.TextTemplating/Interfaces.cs \
Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs \
Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs \
Microsoft.VisualStudio.TextTemplating/TextTemplatingSession.cs \
Microsoft.VisualStudio.TextTemplating/TextTransformation.cs \
Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs \
Mono.TextTemplating/CompiledTemplate.cs \
Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs \
Mono.TextTemplating/ParsedTemplate.cs \
Mono.TextTemplating/TemplateGenerator.cs \
Mono.TextTemplating/TemplateSettings.cs \
Mono.TextTemplating/TemplatingEngine.cs \
Mono.TextTemplating/Tokeniser.cs
RES =
all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD)
$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS)
mkdir -p $(ADDIN_BUILD)
$(CSC) $(CSC_FLAGS) -debug -out:$@ -target:library $(REFS) $(build_deps) \
$(build_resources:%=/resource:%) $(build_sources)
$(ASSEMBLY).mdb: $(ASSEMBLY)
$(DATA_FILE_BUILD): $(srcdir)$(subst $(ADDIN_BUILD),, $@)
mkdir -p $(ADDIN_BUILD)/Schemas
cp $(srcdir)/$(subst $(ADDIN_BUILD),,$@) $@
check: all
assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.TextTemplating
assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb
CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb
EXTRA_DIST = $(FILES) $(RES)
include $(top_srcdir)/Makefile.include

View file

@ -1,43 +0,0 @@
//
// AssemblyCacheMonitor.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2010 Novell, Inc.
//
// 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, publish, 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.
using System;
namespace Microsoft.VisualStudio.TextTemplating
{
public sealed class AssemblyCacheMonitor : MarshalByRefObject
{
public AssemblyCacheMonitor ()
{
}
public int GetStaleAssembliesCount (TimeSpan assemblyStaleTime)
{
throw new NotImplementedException ();
}
}
}

View file

@ -1,63 +0,0 @@
//
// DirectiveProcessor.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
namespace Microsoft.VisualStudio.TextTemplating
{
public abstract class DirectiveProcessor
{
protected DirectiveProcessor ()
{
}
public virtual void Initialize (ITextTemplatingEngineHost host)
{
if (host == null)
throw new ArgumentNullException ("host");
}
public virtual void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors)
{
if (languageProvider == null)
throw new ArgumentNullException ("languageProvider");
this.Errors = errors;
}
public abstract void FinishProcessingRun ();
public abstract string GetClassCodeForProcessingRun ();
public abstract string[] GetImportsForProcessingRun ();
public abstract string GetPostInitializationCodeForProcessingRun ();
public abstract string GetPreInitializationCodeForProcessingRun ();
public abstract string[] GetReferencesForProcessingRun ();
public abstract bool IsDirectiveSupported (string directiveName);
public abstract void ProcessDirective (string directiveName, IDictionary<string, string> arguments);
protected CompilerErrorCollection Errors { get; private set; }
}
}

View file

@ -1,56 +0,0 @@
//
// DirectiveProcessorException.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Runtime.Serialization;
namespace Microsoft.VisualStudio.TextTemplating
{
[Serializable]
public class DirectiveProcessorException : Exception
{
public DirectiveProcessorException ()
{
}
public DirectiveProcessorException (string message)
: base (message)
{
}
public DirectiveProcessorException (SerializationInfo info, StreamingContext context)
: base (info, context)
{
}
public DirectiveProcessorException (string message, Exception inner)
: base (message, inner)
{
}
}
}

View file

@ -1,40 +0,0 @@
//
// EncodingHelper.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2010 Novell, Inc.
//
// 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, publish, 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.
using System;
using System.Text;
namespace Microsoft.VisualStudio.TextTemplating
{
public static class EncodingHelper
{
public static Encoding GetEncoding (string filePath)
{
throw new NotImplementedException ();
}
}
}

View file

@ -1,58 +0,0 @@
//
// Engine.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.CodeDom;
using System.CodeDom.Compiler;
using Mono.TextTemplating;
namespace Microsoft.VisualStudio.TextTemplating
{
public class Engine : ITextTemplatingEngine
{
TemplatingEngine engine = new TemplatingEngine ();
public Engine ()
{
}
public string ProcessTemplate (string content, ITextTemplatingEngineHost host)
{
return engine.ProcessTemplate (content, host);
}
public string PreprocessTemplate (string content, ITextTemplatingEngineHost host, string className,
string classNamespace, out string language, out string[] references)
{
return engine.PreprocessTemplate (content, host, className, classNamespace, out language, out references);
}
public const string CacheAssembliesOptionString = "CacheAssemblies";
}
}

View file

@ -1,84 +0,0 @@
//
// ITextTemplatingEngineHost.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009-2010 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Text;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections;
using System.Runtime.Serialization;
namespace Microsoft.VisualStudio.TextTemplating
{
public interface IRecognizeHostSpecific
{
void SetProcessingRunIsHostSpecific (bool hostSpecific);
bool RequiresProcessingRunIsHostSpecific { get; }
}
[CLSCompliant(true)]
public interface ITextTemplatingEngine
{
string ProcessTemplate (string content, ITextTemplatingEngineHost host);
string PreprocessTemplate (string content, ITextTemplatingEngineHost host, string className,
string classNamespace, out string language, out string[] references);
}
[CLSCompliant(true)]
public interface ITextTemplatingEngineHost
{
object GetHostOption (string optionName);
bool LoadIncludeText (string requestFileName, out string content, out string location);
void LogErrors (CompilerErrorCollection errors);
AppDomain ProvideTemplatingAppDomain (string content);
string ResolveAssemblyReference (string assemblyReference);
Type ResolveDirectiveProcessor (string processorName);
string ResolveParameterValue (string directiveId, string processorName, string parameterName);
string ResolvePath (string path);
void SetFileExtension (string extension);
void SetOutputEncoding (Encoding encoding, bool fromOutputDirective);
IList<string> StandardAssemblyReferences { get; }
IList<string> StandardImports { get; }
string TemplateFile { get; }
}
[CLSCompliant(true)]
public interface ITextTemplatingSession :
IEquatable<ITextTemplatingSession>, IEquatable<Guid>, IDictionary<string, Object>,
ICollection<KeyValuePair<string, Object>>,
IEnumerable<KeyValuePair<string, Object>>,
IEnumerable, ISerializable
{
Guid Id { get; }
}
[CLSCompliant(true)]
public interface ITextTemplatingSessionHost
{
ITextTemplatingSession CreateSession ();
ITextTemplatingSession Session { get; set; }
}
}

View file

@ -1,268 +0,0 @@
//
// ParameterDirectiveProcessor.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2010 Novell, Inc.
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.CodeDom;
using System.IO;
using System.Linq;
using System.Reflection;
namespace Microsoft.VisualStudio.TextTemplating
{
public sealed class ParameterDirectiveProcessor : DirectiveProcessor, IRecognizeHostSpecific
{
CodeDomProvider provider;
bool isCSharp;
bool useMonoHack;
bool hostSpecific;
List<CodeStatement> postStatements = new List<CodeStatement> ();
CodeTypeMemberCollection members = new CodeTypeMemberCollection ();
public ParameterDirectiveProcessor ()
{
}
public override void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors)
{
base.StartProcessingRun (languageProvider, templateContents, errors);
this.provider = languageProvider;
//HACK: Mono as of 2.10.2 doesn't implement GenerateCodeFromMember
if (Type.GetType ("Mono.Runtime") != null)
useMonoHack = true;
if (languageProvider is Microsoft.CSharp.CSharpCodeProvider)
isCSharp = true;
postStatements.Clear ();
members.Clear ();
}
public override void FinishProcessingRun ()
{
var statement = new CodeConditionStatement (
new CodeBinaryOperatorExpression (
new CodePropertyReferenceExpression (
new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "Errors"), "HasErrors"),
CodeBinaryOperatorType.ValueEquality,
new CodePrimitiveExpression (false)),
postStatements.ToArray ());
postStatements.Clear ();
postStatements.Add (statement);
}
public override string GetClassCodeForProcessingRun ()
{
var options = new CodeGeneratorOptions ();
using (var sw = new StringWriter ()) {
GenerateCodeFromMembers (sw, options);
return Indent (sw.ToString (), " ");
}
}
string Indent (string s, string indent)
{
if (isCSharp)
return Mono.TextTemplating.TemplatingEngine.IndentSnippetText (s, indent);
return s;
}
public override string[] GetImportsForProcessingRun ()
{
return null;
}
public override string GetPostInitializationCodeForProcessingRun ()
{
return Indent (StatementsToCode (postStatements), " ");
}
public override string GetPreInitializationCodeForProcessingRun ()
{
return null;
}
string StatementsToCode (List<CodeStatement> statements)
{
var options = new CodeGeneratorOptions ();
using (var sw = new StringWriter ()) {
foreach (var statement in statements)
provider.GenerateCodeFromStatement (statement, sw, options);
return sw.ToString ();
}
}
public override string[] GetReferencesForProcessingRun ()
{
return null;
}
public override bool IsDirectiveSupported (string directiveName)
{
return directiveName == "parameter";
}
public override void ProcessDirective (string directiveName, IDictionary<string, string> arguments)
{
string name = arguments["name"];
string type = arguments["type"];
if (string.IsNullOrEmpty (name))
throw new DirectiveProcessorException ("Parameter directive has no name argument");
if (string.IsNullOrEmpty (type))
throw new DirectiveProcessorException ("Parameter directive has no type argument");
string fieldName = "_" + name + "Field";
var typeRef = new CodeTypeReference (type);
var thisRef = new CodeThisReferenceExpression ();
var fieldRef = new CodeFieldReferenceExpression (thisRef, fieldName);
var property = new CodeMemberProperty () {
Name = name,
Attributes = MemberAttributes.Public | MemberAttributes.Final,
HasGet = true,
HasSet = false,
Type = typeRef
};
property.GetStatements.Add (new CodeMethodReturnStatement (fieldRef));
members.Add (new CodeMemberField (typeRef, fieldName));
members.Add (property);
string acquiredName = "_" + name + "Acquired";
var valRef = new CodeVariableReferenceExpression ("data");
var namePrimitive = new CodePrimitiveExpression (name);
var sessionRef = new CodePropertyReferenceExpression (thisRef, "Session");
var callContextTypeRefExpr = new CodeTypeReferenceExpression ("System.Runtime.Remoting.Messaging.CallContext");
var nullPrim = new CodePrimitiveExpression (null);
var acquiredVariable = new CodeVariableDeclarationStatement (typeof (bool), acquiredName, new CodePrimitiveExpression (false));
var acquiredVariableRef = new CodeVariableReferenceExpression (acquiredVariable.Name);
this.postStatements.Add (acquiredVariable);
//checks the local called "data" can be cast and assigned to the field, and if successful, sets acquiredVariable to true
var checkCastThenAssignVal = new CodeConditionStatement (
new CodeMethodInvokeExpression (
new CodeTypeOfExpression (typeRef), "IsAssignableFrom", new CodeMethodInvokeExpression (valRef, "GetType")),
new CodeStatement[] {
new CodeAssignStatement (fieldRef, new CodeCastExpression (typeRef, valRef)),
new CodeAssignStatement (acquiredVariableRef, new CodePrimitiveExpression (true)),
},
new CodeStatement[] {
new CodeExpressionStatement (new CodeMethodInvokeExpression (thisRef, "Error",
new CodePrimitiveExpression ("The type '" + type + "' of the parameter '" + name +
"' did not match the type passed to the template"))),
});
//tries to gets the value from the session
var checkSession = new CodeConditionStatement (
new CodeBinaryOperatorExpression (NotNull (sessionRef), CodeBinaryOperatorType.BooleanAnd,
new CodeMethodInvokeExpression (sessionRef, "ContainsKey", namePrimitive)),
new CodeVariableDeclarationStatement (typeof (object), "data", new CodeIndexerExpression (sessionRef, namePrimitive)),
checkCastThenAssignVal);
this.postStatements.Add (checkSession);
//if acquiredVariable is false, tries to gets the value from the host
if (hostSpecific) {
var hostRef = new CodePropertyReferenceExpression (thisRef, "Host");
var checkHost = new CodeConditionStatement (
BooleanAnd (IsFalse (acquiredVariableRef), NotNull (hostRef)),
new CodeVariableDeclarationStatement (typeof (string), "data",
new CodeMethodInvokeExpression (hostRef, "ResolveParameterValue", nullPrim, nullPrim, namePrimitive)),
new CodeConditionStatement (NotNull (valRef), checkCastThenAssignVal));
this.postStatements.Add (checkHost);
}
//if acquiredVariable is false, tries to gets the value from the call context
var checkCallContext = new CodeConditionStatement (
IsFalse (acquiredVariableRef),
new CodeVariableDeclarationStatement (typeof (object), "data",
new CodeMethodInvokeExpression (callContextTypeRefExpr, "LogicalGetData", namePrimitive)),
new CodeConditionStatement (NotNull (valRef), checkCastThenAssignVal));
this.postStatements.Add (checkCallContext);
}
static CodeBinaryOperatorExpression NotNull (CodeExpression reference)
{
return new CodeBinaryOperatorExpression (reference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression (null));
}
static CodeBinaryOperatorExpression IsFalse (CodeExpression expr)
{
return new CodeBinaryOperatorExpression (expr, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (false));
}
static CodeBinaryOperatorExpression BooleanAnd (CodeExpression expr1, CodeExpression expr2)
{
return new CodeBinaryOperatorExpression (expr1, CodeBinaryOperatorType.BooleanAnd, expr2);
}
void IRecognizeHostSpecific.SetProcessingRunIsHostSpecific (bool hostSpecific)
{
this.hostSpecific = hostSpecific;
}
public bool RequiresProcessingRunIsHostSpecific {
get { return false; }
}
void GenerateCodeFromMembers (StringWriter sw, CodeGeneratorOptions options)
{
if (!useMonoHack) {
foreach (CodeTypeMember member in members)
provider.GenerateCodeFromMember (member, sw, options);
}
var cgType = typeof (CodeGenerator);
var cgInit = cgType.GetMethod ("InitOutput", BindingFlags.NonPublic | BindingFlags.Instance);
var cgFieldGen = cgType.GetMethod ("GenerateField", BindingFlags.NonPublic | BindingFlags.Instance);
var cgPropGen = cgType.GetMethod ("GenerateProperty", BindingFlags.NonPublic | BindingFlags.Instance);
#pragma warning disable 0618
var generator = (CodeGenerator) provider.CreateGenerator ();
#pragma warning restore 0618
var dummy = new CodeTypeDeclaration ("Foo");
foreach (CodeTypeMember member in members) {
var f = member as CodeMemberField;
if (f != null) {
cgInit.Invoke (generator, new object[] { sw, options });
cgFieldGen.Invoke (generator, new object[] { f });
continue;
}
var p = member as CodeMemberProperty;
if (p != null) {
cgInit.Invoke (generator, new object[] { sw, options });
cgPropGen.Invoke (generator, new object[] { p, dummy });
continue;
}
}
}
}
}

View file

@ -1,196 +0,0 @@
//
// RequiresProvidesDirectiveProcessor.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.Text;
namespace Microsoft.VisualStudio.TextTemplating
{
public abstract class RequiresProvidesDirectiveProcessor : DirectiveProcessor
{
bool isInProcessingRun;
ITextTemplatingEngineHost host;
StringBuilder preInitBuffer = new StringBuilder ();
StringBuilder postInitBuffer = new StringBuilder ();
StringBuilder codeBuffer = new StringBuilder ();
CodeDomProvider languageProvider;
protected RequiresProvidesDirectiveProcessor ()
{
}
public override void Initialize (ITextTemplatingEngineHost host)
{
base.Initialize (host);
this.host = host;
}
protected abstract void InitializeProvidesDictionary (string directiveName, IDictionary<string, string> providesDictionary);
protected abstract void InitializeRequiresDictionary (string directiveName, IDictionary<string, string> requiresDictionary);
protected abstract string FriendlyName { get; }
protected abstract void GeneratePostInitializationCode (string directiveName, StringBuilder codeBuffer, CodeDomProvider languageProvider,
IDictionary<string, string> requiresArguments, IDictionary<string, string> providesArguments);
protected abstract void GeneratePreInitializationCode (string directiveName, StringBuilder codeBuffer, CodeDomProvider languageProvider,
IDictionary<string, string> requiresArguments, IDictionary<string, string> providesArguments);
protected abstract void GenerateTransformCode (string directiveName, StringBuilder codeBuffer, CodeDomProvider languageProvider,
IDictionary<string, string> requiresArguments, IDictionary<string, string> providesArguments);
protected virtual void PostProcessArguments (string directiveName, IDictionary<string, string> requiresArguments,
IDictionary<string, string> providesArguments)
{
}
public override string GetClassCodeForProcessingRun ()
{
AssertNotProcessing ();
return codeBuffer.ToString ();
}
public override string[] GetImportsForProcessingRun ()
{
AssertNotProcessing ();
return null;
}
public override string[] GetReferencesForProcessingRun ()
{
AssertNotProcessing ();
return null;
}
public override string GetPostInitializationCodeForProcessingRun ()
{
AssertNotProcessing ();
return postInitBuffer.ToString ();
}
public override string GetPreInitializationCodeForProcessingRun ()
{
AssertNotProcessing ();
return preInitBuffer.ToString ();
}
public override void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors)
{
AssertNotProcessing ();
isInProcessingRun = true;
base.StartProcessingRun (languageProvider, templateContents, errors);
this.languageProvider = languageProvider;
codeBuffer.Length = 0;
preInitBuffer.Length = 0;
postInitBuffer.Length = 0;
}
public override void FinishProcessingRun ()
{
isInProcessingRun = false;
}
void AssertNotProcessing ()
{
if (isInProcessingRun)
throw new InvalidOperationException ();
}
//FIXME: handle escaping
IEnumerable<KeyValuePair<string,string>> ParseArgs (string args)
{
var pairs = args.Split (';');
foreach (var p in pairs) {
int eq = p.IndexOf ('=');
var k = p.Substring (0, eq);
var v = p.Substring (eq);
yield return new KeyValuePair<string, string> (k, v);
}
}
public override void ProcessDirective (string directiveName, IDictionary<string, string> arguments)
{
if (directiveName == null)
throw new ArgumentNullException ("directiveName");
if (arguments == null)
throw new ArgumentNullException ("arguments");
var providesDictionary = new Dictionary<string,string> ();
var requiresDictionary = new Dictionary<string,string> ();
string provides;
if (arguments.TryGetValue ("provides", out provides)) {
foreach (var arg in ParseArgs (provides)) {
providesDictionary.Add (arg.Key, arg.Value);
}
}
string requires;
if (arguments.TryGetValue ("requires", out requires)) {
foreach (var arg in ParseArgs (requires)) {
requiresDictionary.Add (arg.Key, arg.Value);
}
}
InitializeRequiresDictionary (directiveName, requiresDictionary);
InitializeProvidesDictionary (directiveName, providesDictionary);
var id = ProvideUniqueId (directiveName, arguments, requiresDictionary, providesDictionary);
foreach (var req in requiresDictionary) {
var val = host.ResolveParameterValue (id, FriendlyName, req.Key);
if (val != null)
requiresDictionary[req.Key] = val;
else if (req.Value == null)
throw new DirectiveProcessorException ("Could not resolve required value '" + req.Key + "'");
}
foreach (var req in providesDictionary) {
var val = host.ResolveParameterValue (id, FriendlyName, req.Key);
if (val != null)
providesDictionary[req.Key] = val;
}
PostProcessArguments (directiveName, requiresDictionary, providesDictionary);
GeneratePreInitializationCode (directiveName, preInitBuffer, languageProvider, requiresDictionary, providesDictionary);
GeneratePostInitializationCode (directiveName, postInitBuffer, languageProvider, requiresDictionary, providesDictionary);
GenerateTransformCode (directiveName, codeBuffer, languageProvider, requiresDictionary, providesDictionary);
}
protected virtual string ProvideUniqueId (string directiveName, IDictionary<string, string> arguments,
IDictionary<string, string> requiresArguments, IDictionary<string, string> providesArguments)
{
return directiveName;
}
protected ITextTemplatingEngineHost Host {
get { return host; }
}
}
}

View file

@ -1,71 +0,0 @@
//
// TextTemplatingSession.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2010 Novell, Inc.
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Runtime.Serialization;
namespace Microsoft.VisualStudio.TextTemplating
{
[Serializable]
public sealed class TextTemplatingSession : Dictionary<string, Object>, ITextTemplatingSession
{
public TextTemplatingSession () : this (Guid.NewGuid ())
{
}
public TextTemplatingSession (Guid id)
{
this.Id = id;
}
public Guid Id {
get; private set;
}
public override int GetHashCode ()
{
return Id.GetHashCode ();
}
public override bool Equals (object obj)
{
var o = obj as TextTemplatingSession;
return o != null && o.Equals (this);
}
public bool Equals (Guid other)
{
return other.Equals (Id);
}
public bool Equals (ITextTemplatingSession other)
{
return other != null && other.Id == this.Id;
}
}
}

View file

@ -1,219 +0,0 @@
//
// TextTransformation.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Text;
namespace Microsoft.VisualStudio.TextTemplating
{
public abstract class TextTransformation : IDisposable
{
Stack<int> indents;
string currentIndent = string.Empty;
CompilerErrorCollection errors;
StringBuilder builder;
bool endsWithNewline;
public TextTransformation ()
{
}
protected internal virtual void Initialize ()
{
}
public abstract string TransformText ();
public virtual IDictionary<string, object> Session { get; set; }
#region Errors
public void Error (string message)
{
Errors.Add (new CompilerError (null, -1, -1, null, message));
}
public void Warning (string message)
{
var err = new CompilerError (null, -1, -1, null, message) {
IsWarning = true,
};
Errors.Add (err);
}
protected internal CompilerErrorCollection Errors {
get {
if (errors == null)
errors = new CompilerErrorCollection ();
return errors;
}
}
Stack<int> Indents {
get {
if (indents == null)
indents = new Stack<int> ();
return indents;
}
}
#endregion
#region Indents
public string PopIndent ()
{
if (Indents.Count == 0)
return "";
int lastPos = currentIndent.Length - Indents.Pop ();
string last = currentIndent.Substring (lastPos);
currentIndent = currentIndent.Substring (0, lastPos);
return last;
}
public void PushIndent (string indent)
{
if (indent == null)
throw new ArgumentNullException ("indent");
Indents.Push (indent.Length);
currentIndent += indent;
}
public void ClearIndent ()
{
currentIndent = string.Empty;
Indents.Clear ();
}
public string CurrentIndent {
get { return currentIndent; }
}
#endregion
#region Writing
protected StringBuilder GenerationEnvironment {
get {
if (builder == null)
builder = new StringBuilder ();
return builder;
}
set {
builder = value;
}
}
public void Write (string textToAppend)
{
if (string.IsNullOrEmpty (textToAppend))
return;
if ((GenerationEnvironment.Length == 0 || endsWithNewline) && CurrentIndent.Length > 0) {
GenerationEnvironment.Append (CurrentIndent);
}
endsWithNewline = false;
char last = textToAppend[textToAppend.Length-1];
if (last == '\n' || last == '\r') {
endsWithNewline = true;
}
if (CurrentIndent.Length == 0) {
GenerationEnvironment.Append (textToAppend);
return;
}
//insert CurrentIndent after every newline (\n, \r, \r\n)
//but if there's one at the end of the string, ignore it, it'll be handled next time thanks to endsWithNewline
int lastNewline = 0;
for (int i = 0; i < textToAppend.Length - 1; i++) {
char c = textToAppend[i];
if (c == '\r') {
if (textToAppend[i + 1] == '\n') {
i++;
if (i == textToAppend.Length - 1)
break;
}
} else if (c != '\n') {
continue;
}
i++;
int len = i - lastNewline;
if (len > 0) {
GenerationEnvironment.Append (textToAppend, lastNewline, i - lastNewline);
}
GenerationEnvironment.Append (CurrentIndent);
lastNewline = i;
}
if (lastNewline > 0)
GenerationEnvironment.Append (textToAppend, lastNewline, textToAppend.Length - lastNewline);
else
GenerationEnvironment.Append (textToAppend);
}
public void Write (string format, params object[] args)
{
Write (string.Format (format, args));
}
public void WriteLine (string textToAppend)
{
Write (textToAppend);
GenerationEnvironment.AppendLine ();
endsWithNewline = true;
}
public void WriteLine (string format, params object[] args)
{
WriteLine (string.Format (format, args));
}
#endregion
#region Dispose
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
protected virtual void Dispose (bool disposing)
{
}
~TextTransformation ()
{
Dispose (false);
}
#endregion
}
}

View file

@ -1,69 +0,0 @@
//
// ToStringHelper.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.Reflection;
namespace Microsoft.VisualStudio.TextTemplating
{
public static class ToStringHelper
{
static object [] formatProviderAsParameterArray;
static IFormatProvider formatProvider = System.Globalization.CultureInfo.InvariantCulture;
static ToStringHelper ()
{
formatProviderAsParameterArray = new object[] { formatProvider };
}
public static string ToStringWithCulture (object objectToConvert)
{
if (objectToConvert == null)
throw new ArgumentNullException ("objectToConvert");
IConvertible conv = objectToConvert as IConvertible;
if (conv != null)
return conv.ToString (formatProvider);
var str = objectToConvert as string;
if (str != null)
return str;
//TODO: implement a cache of types and DynamicMethods
MethodInfo mi = objectToConvert.GetType ().GetMethod ("ToString", new Type[] { typeof (IFormatProvider) });
if (mi != null)
return (string) mi.Invoke (objectToConvert, formatProviderAsParameterArray);
return objectToConvert.ToString ();
}
public static IFormatProvider FormatProvider {
get { return (IFormatProvider)formatProviderAsParameterArray[0]; }
set { formatProviderAsParameterArray[0] = formatProvider = value; }
}
}
}

View file

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{A2364D6A-00EF-417C-80A6-815726C70032}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>Mono.TextTemplating</RootNamespace>
<AssemblyName>Mono.TextTemplating</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Microsoft.VisualStudio.TextTemplating\DirectiveProcessor.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\DirectiveProcessorException.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\Engine.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\RequiresProvidesDirectiveProcessor.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\TextTransformation.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\ToStringHelper.cs" />
<Compile Include="Mono.TextTemplating\CompiledTemplate.cs" />
<Compile Include="Mono.TextTemplating\ParsedTemplate.cs" />
<Compile Include="Mono.TextTemplating\Tokeniser.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Mono.TextTemplating\TemplateGenerator.cs" />
<Compile Include="Mono.TextTemplating\TemplatingEngine.cs" />
<Compile Include="Mono.TextTemplating\TemplateSettings.cs" />
<Compile Include="Mono.TextTemplating\CrossAppDomainAssemblyResolver.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\AssemblyCacheMonitor.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\EncodingHelper.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\ParameterDirectiveProcessor.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\TextTemplatingSession.cs" />
<Compile Include="Microsoft.VisualStudio.TextTemplating\Interfaces.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="Microsoft.VisualStudio.TextTemplating\" />
<Folder Include="Mono.TextTemplating\" />
</ItemGroup>
<ProjectExtensions>
<MonoDevelop>
<Properties>
<Policies>
<DotNetNamingPolicy DirectoryNamespaceAssociation="Flat" ResourceNamePolicy="FileName" />
</Policies>
<MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="Makefile.am" BuildTargetName="" CleanTargetName="" SyncReferences="true" IsAutotoolsProject="true" RelativeConfigureInPath="..">
<BuildFilesVar Sync="true" Name="FILES" />
<DeployFilesVar />
<ResourcesVar Sync="true" Name="RES" />
<OthersVar />
<GacRefVar Sync="true" Name="REFS" Prefix="-r:" />
<AsmRefVar Sync="true" Name="REFS" Prefix="-r:" />
<ProjectRefVar Sync="true" Name="DEPS" />
</MonoDevelop.Autotools.MakefileInfo>
</Properties>
</MonoDevelop>
</ProjectExtensions>
</Project>

View file

@ -1,113 +0,0 @@
//
// CompiledTemplate.cs
//
// Author:
// Nathan Baulch <nathan.baulch@gmail.com>
//
// Copyright (c) 2009 Nathan Baulch
//
// 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, publish, 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.
using System;
using System.Reflection;
using Microsoft.VisualStudio.TextTemplating;
using System.CodeDom.Compiler;
using System.Globalization;
namespace Mono.TextTemplating
{
public sealed class CompiledTemplate : MarshalByRefObject, IDisposable
{
ITextTemplatingEngineHost host;
TextTransformation tt;
CultureInfo culture;
string[] assemblyFiles;
public CompiledTemplate (ITextTemplatingEngineHost host, CompilerResults results, string fullName, CultureInfo culture,
string[] assemblyFiles)
{
AppDomain.CurrentDomain.AssemblyResolve += ResolveReferencedAssemblies;
this.host = host;
this.culture = culture;
this.assemblyFiles = assemblyFiles;
Load (results, fullName);
}
void Load (CompilerResults results, string fullName)
{
var assembly = results.CompiledAssembly;
Type transformType = assembly.GetType (fullName);
tt = (TextTransformation) Activator.CreateInstance (transformType);
//set the host property if it exists
var hostProp = transformType.GetProperty ("Host", typeof (ITextTemplatingEngineHost));
if (hostProp != null && hostProp.CanWrite)
hostProp.SetValue (tt, host, null);
var sessionHost = host as ITextTemplatingSessionHost;
if (sessionHost != null) {
//FIXME: should we create a session if it's null?
tt.Session = sessionHost.Session;
}
}
public string Process ()
{
tt.Errors.Clear ();
//set the culture
if (culture != null)
ToStringHelper.FormatProvider = culture;
else
ToStringHelper.FormatProvider = CultureInfo.InvariantCulture;
tt.Initialize ();
string output = null;
try {
output = tt.TransformText ();
} catch (Exception ex) {
tt.Error ("Error running transform: " + ex.ToString ());
}
host.LogErrors (tt.Errors);
ToStringHelper.FormatProvider = CultureInfo.InvariantCulture;
return output;
}
System.Reflection.Assembly ResolveReferencedAssemblies (object sender, ResolveEventArgs args)
{
System.Reflection.Assembly asm = null;
foreach (var asmFile in assemblyFiles) {
var name = System.IO.Path.GetFileNameWithoutExtension (asmFile);
if (args.Name.StartsWith (name))
asm = System.Reflection.Assembly.LoadFrom (asmFile);
}
return asm;
}
public void Dispose ()
{
if (host != null) {
host = null;
AppDomain.CurrentDomain.AssemblyResolve -= ResolveReferencedAssemblies;
}
}
}
}

View file

@ -1,59 +0,0 @@
//
// CrossAppDomainAssemblyResolver.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2010 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
namespace Mono.TextTemplating
{
[Serializable]
/// <summary>
/// Provides a handler for AssemblyResolve events that looks them up in the domain that created the resolver.
/// </summary>
public class CrossAppDomainAssemblyResolver
{
ParentDomainLookup parent = new ParentDomainLookup ();
public System.Reflection.Assembly Resolve (object sender, ResolveEventArgs args)
{
var location = parent.GetAssemblyPath (args.Name);
if (location != null)
return System.Reflection.Assembly.LoadFrom (location);
return null;
}
class ParentDomainLookup : MarshalByRefObject
{
public string GetAssemblyPath (string name)
{
var assem = System.Reflection.Assembly.Load (name);
if (assem != null)
return assem.Location;
return null;
}
}
}
}

View file

@ -1,320 +0,0 @@
//
// Template.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using Microsoft.VisualStudio.TextTemplating;
namespace Mono.TextTemplating
{
public class ParsedTemplate
{
List<ISegment> segments = new List<ISegment> ();
CompilerErrorCollection errors = new CompilerErrorCollection ();
string rootFileName;
public ParsedTemplate (string rootFileName)
{
this.rootFileName = rootFileName;
}
public List<ISegment> RawSegments {
get { return segments; }
}
public IEnumerable<Directive> Directives {
get {
foreach (ISegment seg in segments) {
Directive dir = seg as Directive;
if (dir != null)
yield return dir;
}
}
}
public IEnumerable<TemplateSegment> Content {
get {
foreach (ISegment seg in segments) {
TemplateSegment ts = seg as TemplateSegment;
if (ts != null)
yield return ts;
}
}
}
public CompilerErrorCollection Errors {
get { return errors; }
}
public static ParsedTemplate FromText (string content, ITextTemplatingEngineHost host)
{
ParsedTemplate template = new ParsedTemplate (host.TemplateFile);
try {
template.Parse (host, new Tokeniser (host.TemplateFile, content));
} catch (ParserException ex) {
template.LogError (ex.Message, ex.Location);
}
return template;
}
public void Parse (ITextTemplatingEngineHost host, Tokeniser tokeniser)
{
Parse (host, tokeniser, true);
}
public void ParseWithoutIncludes (Tokeniser tokeniser)
{
Parse (null, tokeniser, false);
}
void Parse (ITextTemplatingEngineHost host, Tokeniser tokeniser, bool parseIncludes)
{
bool skip = false;
while ((skip || tokeniser.Advance ()) && tokeniser.State != State.EOF) {
skip = false;
ISegment seg = null;
switch (tokeniser.State) {
case State.Block:
if (!String.IsNullOrEmpty (tokeniser.Value))
seg = new TemplateSegment (SegmentType.Block, tokeniser.Value, tokeniser.Location);
break;
case State.Content:
if (!String.IsNullOrEmpty (tokeniser.Value))
seg = new TemplateSegment (SegmentType.Content, tokeniser.Value, tokeniser.Location);
break;
case State.Expression:
if (!String.IsNullOrEmpty (tokeniser.Value))
seg = new TemplateSegment (SegmentType.Expression, tokeniser.Value, tokeniser.Location);
break;
case State.Helper:
if (!String.IsNullOrEmpty (tokeniser.Value))
seg = new TemplateSegment (SegmentType.Helper, tokeniser.Value, tokeniser.Location);
break;
case State.Directive:
Directive directive = null;
string attName = null;
while (!skip && tokeniser.Advance ()) {
switch (tokeniser.State) {
case State.DirectiveName:
if (directive == null) {
directive = new Directive (tokeniser.Value.ToLower (), tokeniser.Location);
directive.TagStartLocation = tokeniser.TagStartLocation;
if (!parseIncludes || directive.Name != "include")
segments.Add (directive);
} else
attName = tokeniser.Value;
break;
case State.DirectiveValue:
if (attName != null && directive != null)
directive.Attributes[attName.ToLower ()] = tokeniser.Value;
else
LogError ("Directive value without name", tokeniser.Location);
attName = null;
break;
case State.Directive:
if (directive != null)
directive.EndLocation = tokeniser.TagEndLocation;
break;
default:
skip = true;
break;
}
}
if (parseIncludes && directive.Name == "include")
Import (host, directive, Path.GetDirectoryName (tokeniser.Location.FileName));
break;
default:
throw new InvalidOperationException ();
}
if (seg != null) {
seg.TagStartLocation = tokeniser.TagStartLocation;
seg.EndLocation = tokeniser.TagEndLocation;
segments.Add (seg);
}
}
}
void Import (ITextTemplatingEngineHost host, Directive includeDirective, string relativeToDirectory)
{
string fileName;
if (includeDirective.Attributes.Count > 1 || !includeDirective.Attributes.TryGetValue ("file", out fileName)) {
LogError ("Unexpected attributes in include directive", includeDirective.StartLocation);
return;
}
//try to resolve path relative to the file that included it
if (!Path.IsPathRooted (fileName)) {
string possible = Path.Combine (relativeToDirectory, fileName);
if (File.Exists (possible))
fileName = possible;
}
string content, resolvedName;
if (host.LoadIncludeText (fileName, out content, out resolvedName))
Parse (host, new Tokeniser (resolvedName, content), true);
else
LogError ("Could not resolve include file '" + fileName + "'.", includeDirective.StartLocation);
}
void LogError (string message, Location location, bool isWarning)
{
CompilerError err = new CompilerError ();
err.ErrorText = message;
if (location.FileName != null) {
err.Line = location.Line;
err.Column = location.Column;
err.FileName = location.FileName ?? string.Empty;
} else {
err.FileName = rootFileName ?? string.Empty;
}
err.IsWarning = isWarning;
errors.Add (err);
}
public void LogError (string message)
{
LogError (message, Location.Empty, false);
}
public void LogWarning (string message)
{
LogError (message, Location.Empty, true);
}
public void LogError (string message, Location location)
{
LogError (message, location, false);
}
public void LogWarning (string message, Location location)
{
LogError (message, location, true);
}
}
public interface ISegment
{
Location StartLocation { get; }
Location EndLocation { get; set; }
Location TagStartLocation {get; set; }
}
public class TemplateSegment : ISegment
{
public TemplateSegment (SegmentType type, string text, Location start)
{
this.Type = type;
this.StartLocation = start;
this.Text = text;
}
public SegmentType Type { get; private set; }
public string Text { get; private set; }
public Location TagStartLocation { get; set; }
public Location StartLocation { get; private set; }
public Location EndLocation { get; set; }
}
public class Directive : ISegment
{
public Directive (string name, Location start)
{
this.Name = name;
this.Attributes = new Dictionary<string, string> ();
this.StartLocation = start;
}
public string Name { get; private set; }
public Dictionary<string,string> Attributes { get; private set; }
public Location TagStartLocation { get; set; }
public Location StartLocation { get; private set; }
public Location EndLocation { get; set; }
public string Extract (string key)
{
string value;
if (!Attributes.TryGetValue (key, out value))
return null;
Attributes.Remove (key);
return value;
}
}
public enum SegmentType
{
Block,
Expression,
Content,
Helper
}
public struct Location : IEquatable<Location>
{
public Location (string fileName, int line, int column) : this()
{
FileName = fileName;
Column = column;
Line = line;
}
public int Line { get; private set; }
public int Column { get; private set; }
public string FileName { get; private set; }
public static Location Empty {
get { return new Location (null, -1, -1); }
}
public Location AddLine ()
{
return new Location (this.FileName, this.Line + 1, 1);
}
public Location AddCol ()
{
return AddCols (1);
}
public Location AddCols (int number)
{
return new Location (this.FileName, this.Line, this.Column + number);
}
public override string ToString ()
{
return string.Format("[{0} ({1},{2})]", FileName, Line, Column);
}
public bool Equals (Location other)
{
return other.Line == Line && other.Column == Column && other.FileName == FileName;
}
}
}

View file

@ -1,373 +0,0 @@
//
// TemplatingHost.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.IO;
using System.Text;
using Microsoft.VisualStudio.TextTemplating;
namespace Mono.TextTemplating
{
public class TemplateGenerator : MarshalByRefObject, ITextTemplatingEngineHost
{
//re-usable
TemplatingEngine engine;
//per-run variables
string inputFile, outputFile;
Encoding encoding;
//host fields
CompilerErrorCollection errors = new CompilerErrorCollection ();
List<string> refs = new List<string> ();
List<string> imports = new List<string> ();
List<string> includePaths = new List<string> ();
List<string> referencePaths = new List<string> ();
//host properties for consumers to access
public CompilerErrorCollection Errors { get { return errors; } }
public List<string> Refs { get { return refs; } }
public List<string> Imports { get { return imports; } }
public List<string> IncludePaths { get { return includePaths; } }
public List<string> ReferencePaths { get { return referencePaths; } }
public string OutputFile { get { return outputFile; } }
public TemplateGenerator ()
{
Refs.Add (typeof (TextTransformation).Assembly.Location);
Refs.Add (typeof(System.Uri).Assembly.Location);
Imports.Add ("System");
}
public CompiledTemplate CompileTemplate (string content)
{
if (String.IsNullOrEmpty (content))
throw new ArgumentNullException ("content");
errors.Clear ();
encoding = Encoding.UTF8;
return Engine.CompileTemplate (content, this);
}
protected TemplatingEngine Engine {
get {
if (engine == null)
engine = new TemplatingEngine ();
return engine;
}
}
public bool ProcessTemplate (string inputFile, string outputFile)
{
if (String.IsNullOrEmpty (inputFile))
throw new ArgumentNullException ("inputFile");
if (String.IsNullOrEmpty (outputFile))
throw new ArgumentNullException ("outputFile");
string content;
try {
content = File.ReadAllText (inputFile);
} catch (IOException ex) {
errors.Clear ();
AddError ("Could not read input file '" + inputFile + "':\n" + ex.ToString ());
return false;
}
string output;
ProcessTemplate (inputFile, content, ref outputFile, out output);
try {
if (!errors.HasErrors)
File.WriteAllText (outputFile, output, encoding);
} catch (IOException ex) {
AddError ("Could not write output file '" + outputFile + "':\n" + ex.ToString ());
}
return !errors.HasErrors;
}
public bool ProcessTemplate (string inputFileName, string inputContent, ref string outputFileName, out string outputContent)
{
errors.Clear ();
encoding = Encoding.UTF8;
this.outputFile = outputFileName;
this.inputFile = inputFileName;
outputContent = Engine.ProcessTemplate (inputContent, this);
outputFileName = this.outputFile;
return !errors.HasErrors;
}
public bool PreprocessTemplate (string inputFile, string className, string classNamespace,
string outputFile, System.Text.Encoding encoding, out string language, out string[] references)
{
language = null;
references = null;
if (string.IsNullOrEmpty (inputFile))
throw new ArgumentNullException ("inputFile");
if (string.IsNullOrEmpty (outputFile))
throw new ArgumentNullException ("outputFile");
string content;
try {
content = File.ReadAllText (inputFile);
} catch (IOException ex) {
errors.Clear ();
AddError ("Could not read input file '" + inputFile + "':\n" + ex.ToString ());
return false;
}
string output;
PreprocessTemplate (inputFile, className, classNamespace, content, out language, out references, out output);
try {
if (!errors.HasErrors)
File.WriteAllText (outputFile, output, encoding);
} catch (IOException ex) {
AddError ("Could not write output file '" + outputFile + "':\n" + ex.ToString ());
}
return !errors.HasErrors;
}
public bool PreprocessTemplate (string inputFileName, string className, string classNamespace, string inputContent,
out string language, out string[] references, out string outputContent)
{
errors.Clear ();
encoding = Encoding.UTF8;
this.inputFile = inputFileName;
outputContent = Engine.PreprocessTemplate (inputContent, this, className, classNamespace, out language, out references);
return !errors.HasErrors;
}
CompilerError AddError (string error)
{
CompilerError err = new CompilerError ();
err.ErrorText = error;
Errors.Add (err);
return err;
}
#region Virtual members
public virtual object GetHostOption (string optionName)
{
return null;
}
public virtual AppDomain ProvideTemplatingAppDomain (string content)
{
return null;
}
//FIXME: implement
protected virtual string ResolveAssemblyReference (string assemblyReference)
{
//foreach (string referencePath in ReferencePaths) {
//
//}
return assemblyReference;
}
protected virtual string ResolveParameterValue (string directiveId, string processorName, string parameterName)
{
var key = new ParameterKey (processorName, directiveId, parameterName);
string value;
if (parameters.TryGetValue (key, out value))
return value;
if (processorName != null || directiveId != null)
return ResolveParameterValue (null, null, parameterName);
return null;
}
protected virtual Type ResolveDirectiveProcessor (string processorName)
{
KeyValuePair<string,string> value;
if (!directiveProcessors.TryGetValue (processorName, out value))
throw new Exception (string.Format ("No directive processor registered as '{0}'", processorName));
var asmPath = ResolveAssemblyReference (value.Value);
if (asmPath == null)
throw new Exception (string.Format ("Could not resolve assembly '{0}' for directive processor '{1}'", value.Value, processorName));
var asm = System.Reflection.Assembly.LoadFrom (asmPath);
return asm.GetType (value.Key, true);
}
protected virtual string ResolvePath (string path)
{
path = System.Environment.ExpandEnvironmentVariables (path);
if (Path.IsPathRooted (path))
return path;
var dir = Path.GetDirectoryName (inputFile);
var test = Path.Combine (dir, path);
if (File.Exists (test))
return test;
return null;
}
#endregion
Dictionary<ParameterKey,string> parameters = new Dictionary<ParameterKey, string> ();
Dictionary<string,KeyValuePair<string,string>> directiveProcessors = new Dictionary<string, KeyValuePair<string,string>> ();
public void AddDirectiveProcessor (string name, string klass, string assembly)
{
directiveProcessors.Add (name, new KeyValuePair<string,string> (klass,assembly));
}
public void AddParameter (string processorName, string directiveName, string parameterName, string value)
{
parameters.Add (new ParameterKey (processorName, directiveName, parameterName), value);
}
protected virtual bool LoadIncludeText (string requestFileName, out string content, out string location)
{
content = "";
location = ResolvePath (requestFileName);
if (location == null) {
foreach (string path in includePaths) {
string f = Path.Combine (path, requestFileName);
if (File.Exists (f)) {
location = f;
break;
}
}
}
if (location == null)
return false;
try {
content = File.ReadAllText (location);
return true;
} catch (IOException ex) {
AddError ("Could not read included file '" + location + "':\n" + ex.ToString ());
}
return false;
}
#region Explicit ITextTemplatingEngineHost implementation
bool ITextTemplatingEngineHost.LoadIncludeText (string requestFileName, out string content, out string location)
{
return LoadIncludeText (requestFileName, out content, out location);
}
void ITextTemplatingEngineHost.LogErrors (CompilerErrorCollection errors)
{
this.errors.AddRange (errors);
}
string ITextTemplatingEngineHost.ResolveAssemblyReference (string assemblyReference)
{
return ResolveAssemblyReference (assemblyReference);
}
string ITextTemplatingEngineHost.ResolveParameterValue (string directiveId, string processorName, string parameterName)
{
return ResolveParameterValue (directiveId, processorName, parameterName);
}
Type ITextTemplatingEngineHost.ResolveDirectiveProcessor (string processorName)
{
return ResolveDirectiveProcessor (processorName);
}
string ITextTemplatingEngineHost.ResolvePath (string path)
{
return ResolvePath (path);
}
void ITextTemplatingEngineHost.SetFileExtension (string extension)
{
extension = extension.TrimStart ('.');
if (Path.HasExtension (outputFile)) {
outputFile = Path.ChangeExtension (outputFile, extension);
} else {
outputFile = outputFile + "." + extension;
}
}
void ITextTemplatingEngineHost.SetOutputEncoding (System.Text.Encoding encoding, bool fromOutputDirective)
{
this.encoding = encoding;
}
IList<string> ITextTemplatingEngineHost.StandardAssemblyReferences {
get { return refs; }
}
IList<string> ITextTemplatingEngineHost.StandardImports {
get { return imports; }
}
string ITextTemplatingEngineHost.TemplateFile {
get { return inputFile; }
}
#endregion
struct ParameterKey : IEquatable<ParameterKey>
{
public ParameterKey (string processorName, string directiveName, string parameterName)
{
this.processorName = processorName ?? "";
this.directiveName = directiveName ?? "";
this.parameterName = parameterName ?? "";
unchecked {
hashCode = this.processorName.GetHashCode ()
^ this.directiveName.GetHashCode ()
^ this.parameterName.GetHashCode ();
}
}
string processorName, directiveName, parameterName;
int hashCode;
public override bool Equals (object obj)
{
return obj != null && obj is ParameterKey && Equals ((ParameterKey)obj);
}
public bool Equals (ParameterKey other)
{
return processorName == other.processorName && directiveName == other.directiveName && parameterName == other.parameterName;
}
public override int GetHashCode ()
{
return hashCode;
}
}
}
}

View file

@ -1,75 +0,0 @@
//
// TemplateSettings.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TextTemplating;
namespace Mono.TextTemplating
{
public class TemplateSettings
{
public TemplateSettings ()
{
Imports = new HashSet<string> ();
Assemblies = new HashSet<string> ();
CustomDirectives = new List<CustomDirective> ();
DirectiveProcessors = new Dictionary<string, DirectiveProcessor> ();
}
public bool HostSpecific { get; set; }
public bool Debug { get; set; }
public string Inherits { get; set; }
public string Name { get; set; }
public string Namespace { get; set; }
public HashSet<string> Imports { get; private set; }
public HashSet<string> Assemblies { get; private set; }
public System.CodeDom.Compiler.CodeDomProvider Provider { get; set; }
public string Language { get; set; }
public string CompilerOptions { get; set; }
public Encoding Encoding { get; set; }
public string Extension { get; set; }
public System.Globalization.CultureInfo Culture { get; set; }
public List<CustomDirective> CustomDirectives { get; private set; }
public Dictionary<string,DirectiveProcessor> DirectiveProcessors { get; private set; }
public bool IncludePreprocessingHelpers { get; set; }
public bool IsPreprocessed { get; set; }
}
public class CustomDirective
{
public CustomDirective (string processorName, Directive directive)
{
this.ProcessorName = processorName;
this.Directive = directive;
}
public string ProcessorName { get; set; }
public Directive Directive { get; set; }
}
}

View file

@ -1,963 +0,0 @@
//
// Engine.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using Microsoft.VisualStudio.TextTemplating;
using System.Linq;
using System.Reflection;
namespace Mono.TextTemplating
{
public class TemplatingEngine : MarshalByRefObject, Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngine
{
public string ProcessTemplate (string content, ITextTemplatingEngineHost host)
{
var tpl = CompileTemplate (content, host);
try {
if (tpl != null)
return tpl.Process ();
return null;
} finally {
if (tpl != null)
tpl.Dispose ();
}
}
public string PreprocessTemplate (string content, ITextTemplatingEngineHost host, string className,
string classNamespace, out string language, out string[] references)
{
if (content == null)
throw new ArgumentNullException ("content");
if (host == null)
throw new ArgumentNullException ("host");
if (className == null)
throw new ArgumentNullException ("className");
if (classNamespace == null)
throw new ArgumentNullException ("classNamespace");
language = null;
references = null;
var pt = ParsedTemplate.FromText (content, host);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
var settings = GetSettings (host, pt);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
settings.Name = className;
settings.Namespace = classNamespace;
settings.IncludePreprocessingHelpers = string.IsNullOrEmpty (settings.Inherits);
settings.IsPreprocessed = true;
language = settings.Language;
var ccu = GenerateCompileUnit (host, content, pt, settings);
references = ProcessReferences (host, pt, settings).ToArray ();
host.LogErrors (pt.Errors);
if (pt.Errors.HasErrors) {
return null;
}
var options = new CodeGeneratorOptions ();
using (var sw = new StringWriter ()) {
settings.Provider.GenerateCodeFromCompileUnit (ccu, sw, options);
return sw.ToString ();
};
}
public CompiledTemplate CompileTemplate (string content, ITextTemplatingEngineHost host)
{
if (content == null)
throw new ArgumentNullException ("content");
if (host == null)
throw new ArgumentNullException ("host");
var pt = ParsedTemplate.FromText (content, host);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
var settings = GetSettings (host, pt);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
if (!string.IsNullOrEmpty (settings.Extension)) {
host.SetFileExtension (settings.Extension);
}
if (settings.Encoding != null) {
//FIXME: when is this called with false?
host.SetOutputEncoding (settings.Encoding, true);
}
var ccu = GenerateCompileUnit (host, content, pt, settings);
var references = ProcessReferences (host, pt, settings);
if (pt.Errors.HasErrors) {
host.LogErrors (pt.Errors);
return null;
}
var results = GenerateCode (host, references, settings, ccu);
if (results.Errors.HasErrors) {
host.LogErrors (pt.Errors);
host.LogErrors (results.Errors);
return null;
}
var templateClassFullName = settings.Namespace + "." + settings.Name;
var domain = host.ProvideTemplatingAppDomain (content);
if (domain != null) {
var type = typeof (CompiledTemplate);
var obj = domain.CreateInstanceAndUnwrap (type.Assembly.FullName, type.FullName, false,
BindingFlags.CreateInstance, null,
new object[] { host, results, templateClassFullName, settings.Culture, references.ToArray () },
null, null);
return (CompiledTemplate) obj;
} else {
return new CompiledTemplate (host, results, templateClassFullName, settings.Culture, references.ToArray ());
}
}
static CompilerResults GenerateCode (ITextTemplatingEngineHost host, IEnumerable<string> references, TemplateSettings settings, CodeCompileUnit ccu)
{
var pars = new CompilerParameters () {
GenerateExecutable = false,
CompilerOptions = settings.CompilerOptions,
IncludeDebugInformation = settings.Debug,
GenerateInMemory = false,
};
foreach (var r in references)
pars.ReferencedAssemblies.Add (r);
if (settings.Debug)
pars.TempFiles.KeepFiles = true;
return settings.Provider.CompileAssemblyFromDom (pars, ccu);
}
static HashSet<string> ProcessReferences (ITextTemplatingEngineHost host, ParsedTemplate pt, TemplateSettings settings)
{
var resolved = new HashSet<string> ();
foreach (string assem in settings.Assemblies.Union (host.StandardAssemblyReferences)) {
if (resolved.Contains (assem))
continue;
string resolvedAssem = host.ResolveAssemblyReference (assem);
if (!string.IsNullOrEmpty (resolvedAssem)) {
resolved.Add (resolvedAssem);
} else {
pt.LogError ("Could not resolve assembly reference '" + assem + "'");
return null;
}
}
return resolved;
}
public static TemplateSettings GetSettings (ITextTemplatingEngineHost host, ParsedTemplate pt)
{
var settings = new TemplateSettings ();
foreach (Directive dt in pt.Directives) {
switch (dt.Name) {
case "template":
string val = dt.Extract ("language");
if (val != null)
settings.Language = val;
val = dt.Extract ("debug");
if (val != null)
settings.Debug = string.Compare (val, "true", StringComparison.OrdinalIgnoreCase) == 0;
val = dt.Extract ("inherits");
if (val != null)
settings.Inherits = val;
val = dt.Extract ("culture");
if (val != null) {
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.GetCultureInfo (val);
if (culture == null)
pt.LogWarning ("Could not find culture '" + val + "'", dt.StartLocation);
else
settings.Culture = culture;
}
val = dt.Extract ("hostspecific");
if (val != null) {
settings.HostSpecific = string.Compare (val, "true", StringComparison.OrdinalIgnoreCase) == 0;
}
val = dt.Extract ("CompilerOptions");
if (val != null) {
settings.CompilerOptions = val;
}
break;
case "assembly":
string name = dt.Extract ("name");
if (name == null)
pt.LogError ("Missing name attribute in assembly directive", dt.StartLocation);
else
settings.Assemblies.Add (name);
break;
case "import":
string namespac = dt.Extract ("namespace");
if (namespac == null)
pt.LogError ("Missing namespace attribute in import directive", dt.StartLocation);
else
settings.Imports.Add (namespac);
break;
case "output":
settings.Extension = dt.Extract ("extension");
string encoding = dt.Extract ("encoding");
if (encoding != null)
settings.Encoding = Encoding.GetEncoding (encoding);
break;
case "include":
throw new InvalidOperationException ("Include is handled in the parser");
case "parameter":
AddDirective (settings, host, "ParameterDirectiveProcessor", dt);
continue;
default:
string processorName = dt.Extract ("Processor");
if (processorName == null)
throw new InvalidOperationException ("Custom directive '" + dt.Name + "' does not specify a processor");
AddDirective (settings, host, processorName, dt);
continue;
}
ComplainExcessAttributes (dt, pt);
}
//initialize the custom processors
foreach (var kv in settings.DirectiveProcessors) {
kv.Value.Initialize (host);
var hs = kv.Value as IRecognizeHostSpecific;
if (hs == null)
continue;
if (hs.RequiresProcessingRunIsHostSpecific && !settings.HostSpecific) {
settings.HostSpecific = true;
pt.LogWarning ("Directive processor '" + kv.Key + "' requires hostspecific=true, forcing on.");
}
hs.SetProcessingRunIsHostSpecific (settings.HostSpecific);
}
if (settings.Name == null)
settings.Name = string.Format ("GeneratedTextTransformation{0:x}", new System.Random ().Next ());
if (settings.Namespace == null)
settings.Namespace = typeof (TextTransformation).Namespace;
//resolve the CodeDOM provider
if (String.IsNullOrEmpty (settings.Language)) {
pt.LogError ("No language was specified for the template");
return settings;
}
if (settings.Language == "C#v3.5") {
Dictionary<string, string> providerOptions = new Dictionary<string, string> ();
providerOptions.Add ("CompilerVersion", "v3.5");
settings.Provider = new CSharpCodeProvider (providerOptions);
}
else {
settings.Provider = CodeDomProvider.CreateProvider (settings.Language);
}
if (settings.Provider == null) {
pt.LogError ("A provider could not be found for the language '" + settings.Language + "'");
return settings;
}
return settings;
}
public static string IndentSnippetText (string text, string indent)
{
var builder = new StringBuilder (text.Length);
builder.Append (indent);
int lastNewline = 0;
for (int i = 0; i < text.Length - 1; i++) {
char c = text[i];
if (c == '\r') {
if (text[i + 1] == '\n') {
i++;
if (i == text.Length - 1)
break;
}
} else if (c != '\n') {
continue;
}
i++;
int len = i - lastNewline;
if (len > 0) {
builder.Append (text, lastNewline, i - lastNewline);
}
builder.Append (indent);
lastNewline = i;
}
if (lastNewline > 0)
builder.Append (text, lastNewline, text.Length - lastNewline);
else
builder.Append (text);
return builder.ToString ();
}
static void AddDirective (TemplateSettings settings, ITextTemplatingEngineHost host, string processorName, Directive directive)
{
DirectiveProcessor processor;
if (!settings.DirectiveProcessors.TryGetValue (processorName, out processor)) {
switch (processorName) {
case "ParameterDirectiveProcessor":
processor = new ParameterDirectiveProcessor ();
break;
default:
Type processorType = host.ResolveDirectiveProcessor (processorName);
processor = (DirectiveProcessor) Activator.CreateInstance (processorType);
break;
}
if (!processor.IsDirectiveSupported (directive.Name))
throw new InvalidOperationException ("Directive processor '" + processorName + "' does not support directive '" + directive.Name + "'");
settings.DirectiveProcessors [processorName] = processor;
}
settings.CustomDirectives.Add (new CustomDirective (processorName, directive));
}
static bool ComplainExcessAttributes (Directive dt, ParsedTemplate pt)
{
if (dt.Attributes.Count == 0)
return false;
StringBuilder sb = new StringBuilder ("Unknown attributes ");
bool first = true;
foreach (string key in dt.Attributes.Keys) {
if (!first) {
sb.Append (", ");
} else {
first = false;
}
sb.Append (key);
}
sb.Append (" found in ");
sb.Append (dt.Name);
sb.Append (" directive.");
pt.LogWarning (sb.ToString (), dt.StartLocation);
return false;
}
static void ProcessDirectives (ITextTemplatingEngineHost host, string content, ParsedTemplate pt, TemplateSettings settings)
{
foreach (var processor in settings.DirectiveProcessors.Values) {
processor.StartProcessingRun (settings.Provider, content, pt.Errors);
}
foreach (var dt in settings.CustomDirectives) {
var processor = settings.DirectiveProcessors[dt.ProcessorName];
if (processor is RequiresProvidesDirectiveProcessor)
throw new NotImplementedException ("RequiresProvidesDirectiveProcessor");
processor.ProcessDirective (dt.Directive.Name, dt.Directive.Attributes);
}
foreach (var processor in settings.DirectiveProcessors.Values) {
processor.FinishProcessingRun ();
var imports = processor.GetImportsForProcessingRun ();
if (imports != null)
settings.Imports.UnionWith (imports);
var references = processor.GetReferencesForProcessingRun ();
if (references != null)
settings.Assemblies.UnionWith (references);
}
}
public static CodeCompileUnit GenerateCompileUnit (ITextTemplatingEngineHost host, string content, ParsedTemplate pt, TemplateSettings settings)
{
ProcessDirectives (host, content, pt, settings);
//prep the compile unit
var ccu = new CodeCompileUnit ();
var namespac = new CodeNamespace (settings.Namespace);
ccu.Namespaces.Add (namespac);
foreach (string ns in settings.Imports.Union (host.StandardImports))
namespac.Imports.Add (new CodeNamespaceImport (ns));
//prep the type
var type = new CodeTypeDeclaration (settings.Name);
type.IsPartial = true;
if (!string.IsNullOrEmpty (settings.Inherits)) {
type.BaseTypes.Add (new CodeTypeReference (settings.Inherits));
} else if (!settings.IncludePreprocessingHelpers) {
type.BaseTypes.Add (TypeRef<TextTransformation> ());
} else {
type.BaseTypes.Add (new CodeTypeReference (settings.Name + "Base"));
}
namespac.Types.Add (type);
//prep the transform method
var transformMeth = new CodeMemberMethod () {
Name = "TransformText",
ReturnType = new CodeTypeReference (typeof (String)),
Attributes = MemberAttributes.Public,
};
if (!settings.IncludePreprocessingHelpers)
transformMeth.Attributes |= MemberAttributes.Override;
transformMeth.Statements.Add (new CodeAssignStatement (
new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "GenerationEnvironment"),
new CodePrimitiveExpression (null)));
CodeExpression toStringHelper;
if (settings.IsPreprocessed) {
toStringHelper = new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "ToStringHelper");
} else {
toStringHelper = new CodeTypeReferenceExpression (
new CodeTypeReference (typeof (ToStringHelper), CodeTypeReferenceOptions.GlobalReference));
}
//method references that will need to be used multiple times
var writeMeth = new CodeMethodReferenceExpression (new CodeThisReferenceExpression (), "Write");
var toStringMeth = new CodeMethodReferenceExpression (toStringHelper, "ToStringWithCulture");
bool helperMode = false;
//build the code from the segments
foreach (TemplateSegment seg in pt.Content) {
CodeStatement st = null;
var location = new CodeLinePragma (seg.StartLocation.FileName ?? host.TemplateFile, seg.StartLocation.Line);
switch (seg.Type) {
case SegmentType.Block:
if (helperMode)
//TODO: are blocks permitted after helpers?
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);
st = new CodeSnippetStatement (seg.Text);
break;
case SegmentType.Expression:
st = new CodeExpressionStatement (
new CodeMethodInvokeExpression (writeMeth,
new CodeMethodInvokeExpression (toStringMeth, new CodeSnippetExpression (seg.Text))));
break;
case SegmentType.Content:
st = new CodeExpressionStatement (new CodeMethodInvokeExpression (writeMeth, new CodePrimitiveExpression (seg.Text)));
break;
case SegmentType.Helper:
type.Members.Add (new CodeSnippetTypeMember (seg.Text) { LinePragma = location });
helperMode = true;
break;
default:
throw new InvalidOperationException ();
}
if (st != null) {
if (helperMode) {
//convert the statement into a snippet member and attach it to the top level type
//TODO: is there a way to do this for languages that use indentation for blocks, e.g. python?
using (var writer = new StringWriter ()) {
settings.Provider.GenerateCodeFromStatement (st, writer, null);
type.Members.Add (new CodeSnippetTypeMember (writer.ToString ()) { LinePragma = location });
}
} else {
st.LinePragma = location;
transformMeth.Statements.Add (st);
continue;
}
}
}
//complete the transform method
transformMeth.Statements.Add (new CodeMethodReturnStatement (
new CodeMethodInvokeExpression (
new CodePropertyReferenceExpression (
new CodeThisReferenceExpression (),
"GenerationEnvironment"),
"ToString")));
type.Members.Add (transformMeth);
//class code from processors
foreach (var processor in settings.DirectiveProcessors.Values) {
string classCode = processor.GetClassCodeForProcessingRun ();
if (classCode != null)
type.Members.Add (new CodeSnippetTypeMember (classCode));
}
//generate the Host property if needed
if (settings.HostSpecific) {
GenerateHostProperty (type, settings);
}
GenerateInitializationMethod (type, settings);
if (settings.IncludePreprocessingHelpers) {
var baseClass = new CodeTypeDeclaration (settings.Name + "Base");
GenerateProcessingHelpers (baseClass, settings);
AddToStringHelper (baseClass, settings);
namespac.Types.Add (baseClass);
}
return ccu;
}
static void GenerateHostProperty (CodeTypeDeclaration type, TemplateSettings settings)
{
var hostField = new CodeMemberField (TypeRef<ITextTemplatingEngineHost> (), "hostValue");
hostField.Attributes = (hostField.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private;
type.Members.Add (hostField);
var hostProp = GenerateGetterSetterProperty ("Host", hostField);
hostProp.Attributes = MemberAttributes.Public | MemberAttributes.Final;
type.Members.Add (hostProp);
}
static void GenerateInitializationMethod (CodeTypeDeclaration type, TemplateSettings settings)
{
//initialization method
var initializeMeth = new CodeMemberMethod () {
Name = "Initialize",
ReturnType = new CodeTypeReference (typeof (void), CodeTypeReferenceOptions.GlobalReference),
Attributes = MemberAttributes.Family
};
if (!settings.IncludePreprocessingHelpers)
initializeMeth.Attributes |= MemberAttributes.Override;
//pre-init code from processors
foreach (var processor in settings.DirectiveProcessors.Values) {
string code = processor.GetPreInitializationCodeForProcessingRun ();
if (code != null)
initializeMeth.Statements.Add (new CodeSnippetStatement (code));
}
//base call
if (!settings.IncludePreprocessingHelpers) {
initializeMeth.Statements.Add (
new CodeMethodInvokeExpression (
new CodeMethodReferenceExpression (
new CodeBaseReferenceExpression (),
"Initialize")));
}
//post-init code from processors
foreach (var processor in settings.DirectiveProcessors.Values) {
string code = processor.GetPostInitializationCodeForProcessingRun ();
if (code != null)
initializeMeth.Statements.Add (new CodeSnippetStatement (code));
}
type.Members.Add (initializeMeth);
}
static void GenerateProcessingHelpers (CodeTypeDeclaration type, TemplateSettings settings)
{
var thisRef = new CodeThisReferenceExpression ();
var sbTypeRef = TypeRef<StringBuilder> ();
var sessionField = PrivateField (TypeRef<IDictionary<string,object>> (), "session");
var sessionProp = GenerateGetterSetterProperty ("Session", sessionField);
sessionProp.Attributes = MemberAttributes.Public;
var builderField = PrivateField (sbTypeRef, "builder");
var builderFieldRef = new CodeFieldReferenceExpression (thisRef, builderField.Name);
var generationEnvironmentProp = GenerateGetterSetterProperty ("GenerationEnvironment", builderField);
AddPropertyGetterInitializationIfFieldIsNull (generationEnvironmentProp, builderFieldRef, TypeRef<StringBuilder> ());
type.Members.Add (builderField);
type.Members.Add (sessionField);
type.Members.Add (sessionProp);
type.Members.Add (generationEnvironmentProp);
AddErrorHelpers (type, settings);
AddIndentHelpers (type, settings);
AddWriteHelpers (type, settings);
}
static void AddPropertyGetterInitializationIfFieldIsNull (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef, CodeTypeReference typeRef)
{
var fieldInit = FieldInitializationIfNull (fieldRef, typeRef);
property.GetStatements.Insert (0, fieldInit);
}
static CodeConditionStatement FieldInitializationIfNull (CodeFieldReferenceExpression fieldRef, CodeTypeReference typeRef)
{
return new CodeConditionStatement (
new CodeBinaryOperatorExpression (fieldRef,
CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (null)),
new CodeAssignStatement (fieldRef, new CodeObjectCreateExpression (typeRef)));
}
static void AddErrorHelpers (CodeTypeDeclaration type, TemplateSettings settings)
{
var cecTypeRef = TypeRef<CompilerErrorCollection> ();
var thisRef = new CodeThisReferenceExpression ();
var stringTypeRef = TypeRef<string> ();
var nullPrim = new CodePrimitiveExpression (null);
var minusOnePrim = new CodePrimitiveExpression (-1);
var errorsField = PrivateField (cecTypeRef, "errors");
var errorsFieldRef = new CodeFieldReferenceExpression (thisRef, errorsField.Name);
var errorsProp = GenerateGetterProperty ("Errors", errorsField);
errorsProp.Attributes = MemberAttributes.Family | MemberAttributes.Final;
errorsProp.GetStatements.Insert (0, FieldInitializationIfNull (errorsFieldRef, TypeRef<CompilerErrorCollection>()));
var errorsPropRef = new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "Errors");
var compilerErrorTypeRef = TypeRef<CompilerError> ();
var errorMeth = new CodeMemberMethod () {
Name = "Error",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
errorMeth.Parameters.Add (new CodeParameterDeclarationExpression (stringTypeRef, "message"));
errorMeth.Statements.Add (new CodeMethodInvokeExpression (errorsPropRef, "Add",
new CodeObjectCreateExpression (compilerErrorTypeRef, nullPrim, minusOnePrim, minusOnePrim, nullPrim,
new CodeArgumentReferenceExpression ("message"))));
var warningMeth = new CodeMemberMethod () {
Name = "Warning",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
warningMeth.Parameters.Add (new CodeParameterDeclarationExpression (stringTypeRef, "message"));
warningMeth.Statements.Add (new CodeVariableDeclarationStatement (compilerErrorTypeRef, "val",
new CodeObjectCreateExpression (compilerErrorTypeRef, nullPrim, minusOnePrim, minusOnePrim, nullPrim,
new CodeArgumentReferenceExpression ("message"))));
warningMeth.Statements.Add (new CodeAssignStatement (new CodePropertyReferenceExpression (
new CodeVariableReferenceExpression ("val"), "IsWarning"), new CodePrimitiveExpression (true)));
warningMeth.Statements.Add (new CodeMethodInvokeExpression (errorsPropRef, "Add",
new CodeVariableReferenceExpression ("val")));
type.Members.Add (errorsField);
type.Members.Add (errorMeth);
type.Members.Add (warningMeth);
type.Members.Add (errorsProp);
}
static void AddIndentHelpers (CodeTypeDeclaration type, TemplateSettings settings)
{
var stringTypeRef = TypeRef<string> ();
var thisRef = new CodeThisReferenceExpression ();
var zeroPrim = new CodePrimitiveExpression (0);
var stringEmptyRef = new CodeFieldReferenceExpression (new CodeTypeReferenceExpression (stringTypeRef), "Empty");
var intTypeRef = TypeRef<int> ();
var stackIntTypeRef = TypeRef<Stack<int>> ();
var indentsField = PrivateField (stackIntTypeRef, "indents");
var indentsFieldRef = new CodeFieldReferenceExpression (thisRef, indentsField.Name);
var indentsProp = GenerateGetterProperty ("Indents", indentsField);
indentsProp.Attributes = MemberAttributes.Private;
AddPropertyGetterInitializationIfFieldIsNull (indentsProp, indentsFieldRef, TypeRef<Stack<int>> ());
var indentsPropRef = new CodeFieldReferenceExpression (thisRef, indentsProp.Name);
var currentIndentField = PrivateField (stringTypeRef, "currentIndent");
currentIndentField.InitExpression = stringEmptyRef;
var currentIndentFieldRef = new CodeFieldReferenceExpression (thisRef, currentIndentField.Name);
var popIndentMeth = new CodeMemberMethod () {
Name = "PopIndent",
ReturnType = stringTypeRef,
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
popIndentMeth.Statements.Add (new CodeConditionStatement (
new CodeBinaryOperatorExpression (new CodePropertyReferenceExpression (indentsPropRef, "Count"),
CodeBinaryOperatorType.ValueEquality, zeroPrim),
new CodeMethodReturnStatement (stringEmptyRef)));
popIndentMeth.Statements.Add (new CodeVariableDeclarationStatement (intTypeRef, "lastPos",
new CodeBinaryOperatorExpression (
new CodePropertyReferenceExpression (currentIndentFieldRef, "Length"),
CodeBinaryOperatorType.Subtract,
new CodeMethodInvokeExpression (indentsPropRef, "Pop"))));
popIndentMeth.Statements.Add (new CodeVariableDeclarationStatement (stringTypeRef, "last",
new CodeMethodInvokeExpression (currentIndentFieldRef, "Substring", new CodeVariableReferenceExpression ("lastPos"))));
popIndentMeth.Statements.Add (new CodeAssignStatement (currentIndentFieldRef,
new CodeMethodInvokeExpression (currentIndentFieldRef, "Substring", zeroPrim, new CodeVariableReferenceExpression ("lastPos"))));
popIndentMeth.Statements.Add (new CodeMethodReturnStatement (new CodeVariableReferenceExpression ("last")));
var pushIndentMeth = new CodeMemberMethod () {
Name = "PushIndent",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
pushIndentMeth.Parameters.Add (new CodeParameterDeclarationExpression (stringTypeRef, "indent"));
pushIndentMeth.Statements.Add (new CodeMethodInvokeExpression (indentsPropRef, "Push",
new CodePropertyReferenceExpression (new CodeArgumentReferenceExpression ("indent"), "Length")));
pushIndentMeth.Statements.Add (new CodeAssignStatement (currentIndentFieldRef,
new CodeBinaryOperatorExpression (currentIndentFieldRef, CodeBinaryOperatorType.Add, new CodeArgumentReferenceExpression ("indent"))));
var clearIndentMeth = new CodeMemberMethod () {
Name = "ClearIndent",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
clearIndentMeth.Statements.Add (new CodeAssignStatement (currentIndentFieldRef, stringEmptyRef));
clearIndentMeth.Statements.Add (new CodeMethodInvokeExpression (indentsPropRef, "Clear"));
var currentIndentProp = GenerateGetterProperty ("CurrentIndent", currentIndentField);
type.Members.Add (currentIndentField);
type.Members.Add (indentsField);
type.Members.Add (popIndentMeth);
type.Members.Add (pushIndentMeth);
type.Members.Add (clearIndentMeth);
type.Members.Add (currentIndentProp);
type.Members.Add (indentsProp);
}
static void AddWriteHelpers (CodeTypeDeclaration type, TemplateSettings settings)
{
var stringTypeRef = TypeRef<string> ();
var thisRef = new CodeThisReferenceExpression ();
var genEnvPropRef = new CodePropertyReferenceExpression (thisRef, "GenerationEnvironment");
var currentIndentFieldRef = new CodeFieldReferenceExpression (thisRef, "currentIndent");
var textToAppendParam = new CodeParameterDeclarationExpression (stringTypeRef, "textToAppend");
var formatParam = new CodeParameterDeclarationExpression (stringTypeRef, "format");
var argsParam = new CodeParameterDeclarationExpression (TypeRef<object[]> (), "args");
argsParam.CustomAttributes.Add (new CodeAttributeDeclaration (TypeRef<System.ParamArrayAttribute> ()));
var textToAppendParamRef = new CodeArgumentReferenceExpression ("textToAppend");
var formatParamRef = new CodeArgumentReferenceExpression ("format");
var argsParamRef = new CodeArgumentReferenceExpression ("args");
var writeMeth = new CodeMemberMethod () {
Name = "Write",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
writeMeth.Parameters.Add (textToAppendParam);
writeMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "Append", new CodeArgumentReferenceExpression ("textToAppend")));
var writeArgsMeth = new CodeMemberMethod () {
Name = "Write",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
writeArgsMeth.Parameters.Add (formatParam);
writeArgsMeth.Parameters.Add (argsParam);
writeArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendFormat", formatParamRef, argsParamRef));
var writeLineMeth = new CodeMemberMethod () {
Name = "WriteLine",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
writeLineMeth.Parameters.Add (textToAppendParam);
writeLineMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "Append", currentIndentFieldRef));
writeLineMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendLine", textToAppendParamRef));
var writeLineArgsMeth = new CodeMemberMethod () {
Name = "WriteLine",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
};
writeLineArgsMeth.Parameters.Add (formatParam);
writeLineArgsMeth.Parameters.Add (argsParam);
writeLineArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "Append", currentIndentFieldRef));
writeLineArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendFormat", formatParamRef, argsParamRef));
writeLineArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendLine"));
type.Members.Add (writeMeth);
type.Members.Add (writeArgsMeth);
type.Members.Add (writeLineMeth);
type.Members.Add (writeLineArgsMeth);
}
static void AddToStringHelper (CodeTypeDeclaration type, TemplateSettings settings)
{
var helperCls = new CodeTypeDeclaration ("ToStringInstanceHelper") {
IsClass = true,
TypeAttributes = System.Reflection.TypeAttributes.NestedPublic,
};
var formatProviderField = PrivateField (TypeRef<IFormatProvider> (), "formatProvider");
formatProviderField.InitExpression = new CodePropertyReferenceExpression (
new CodeTypeReferenceExpression (TypeRef<System.Globalization.CultureInfo> ()), "InvariantCulture");
var formatProviderFieldRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), formatProviderField.Name);
var formatProviderProp = GenerateGetterSetterProperty ("FormatProvider", formatProviderField);
AddSetterNullCheck (formatProviderProp, formatProviderFieldRef);
helperCls.Members.Add (formatProviderField);
helperCls.Members.Add (formatProviderProp);
var meth = new CodeMemberMethod () {
Name = "ToStringWithCulture",
Attributes = MemberAttributes.Public | MemberAttributes.Final,
ReturnType = TypeRef<string> (),
};
meth.Parameters.Add (new CodeParameterDeclarationExpression (TypeRef<object> (), "objectToConvert"));
var paramRef = new CodeArgumentReferenceExpression ("objectToConvert");
meth.Statements.Add (NullCheck (paramRef, paramRef.ParameterName));
var typeLocal = new CodeVariableDeclarationStatement (TypeRef<Type> (), "type", new CodeMethodInvokeExpression (paramRef, "GetType"));
var typeLocalRef = new CodeVariableReferenceExpression (typeLocal.Name);
meth.Statements.Add (typeLocal);
var iConvertibleTypeLocal = new CodeVariableDeclarationStatement (TypeRef<Type> (), "iConvertibleType",
new CodeTypeOfExpression (TypeRef<IConvertible> ()));
var iConvertibleTypeLocalRef = new CodeVariableReferenceExpression (iConvertibleTypeLocal.Name);
meth.Statements.Add (iConvertibleTypeLocal);
meth.Statements.Add (new CodeConditionStatement (
new CodeMethodInvokeExpression (iConvertibleTypeLocalRef, "IsAssignableFrom", typeLocalRef),
new CodeMethodReturnStatement (new CodeMethodInvokeExpression (
new CodeCastExpression (TypeRef<IConvertible> (), paramRef), "ToString", formatProviderFieldRef))));
var methInfoLocal = new CodeVariableDeclarationStatement (TypeRef<MethodInfo> (), "methInfo",
new CodeMethodInvokeExpression (typeLocalRef, "GetMethod",
new CodePrimitiveExpression ("ToString"),
new CodeArrayCreateExpression (TypeRef<Type> (), new CodeExpression [] { iConvertibleTypeLocalRef })));
meth.Statements.Add (methInfoLocal);
var methInfoLocalRef = new CodeVariableReferenceExpression (methInfoLocal.Name);
meth.Statements.Add (new CodeConditionStatement (NotNull (methInfoLocalRef),
new CodeMethodReturnStatement (new CodeCastExpression (TypeRef<string> (),
new CodeMethodInvokeExpression (
methInfoLocalRef, "Invoke", paramRef,
new CodeArrayCreateExpression (TypeRef<object> (), new CodeExpression [] { formatProviderFieldRef } ))))));
meth.Statements.Add (new CodeMethodReturnStatement (new CodeMethodInvokeExpression (paramRef, "ToString")));
helperCls.Members.Add (meth);
var helperFieldName = settings.Provider.CreateValidIdentifier ("_toStringHelper");
var helperField = PrivateField (new CodeTypeReference (helperCls.Name), helperFieldName);
helperField.InitExpression = new CodeObjectCreateExpression (helperField.Type);
type.Members.Add (helperField);
type.Members.Add (GenerateGetterProperty ("ToStringHelper", helperField));
type.Members.Add (helperCls);
}
#region CodeDom helpers
static CodeTypeReference TypeRef<T> ()
{
return new CodeTypeReference (typeof (T), CodeTypeReferenceOptions.GlobalReference);
}
static CodeMemberProperty GenerateGetterSetterProperty (string propertyName, CodeMemberField field)
{
var prop = new CodeMemberProperty () {
Name = propertyName,
Attributes = MemberAttributes.Public | MemberAttributes.Final,
Type = field.Type
};
var fieldRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), field.Name);
AddGetter (prop, fieldRef);
AddSetter (prop, fieldRef);
return prop;
}
static CodeMemberProperty GenerateGetterProperty (string propertyName, CodeMemberField field)
{
var prop = new CodeMemberProperty () {
Name = propertyName,
Attributes = MemberAttributes.Public | MemberAttributes.Final,
HasSet = false,
Type = field.Type
};
var fieldRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), field.Name);
AddGetter (prop, fieldRef);
return prop;
}
static void AddSetter (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef)
{
property.HasSet = true;
property.SetStatements.Add (new CodeAssignStatement (fieldRef, new CodePropertySetValueReferenceExpression ()));
}
static void AddGetter (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef)
{
property.HasGet = true;
property.GetStatements.Add (new CodeMethodReturnStatement (fieldRef));
}
static void MakeGetterLazy (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef, CodeExpression initExpression)
{
property.GetStatements.Insert (0, new CodeConditionStatement (
NotNull (fieldRef),
new CodeAssignStatement (fieldRef, initExpression))
);
}
static void AddSetterNullCheck (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef)
{
property.SetStatements.Insert (0, NullCheck (fieldRef, fieldRef.FieldName));
}
static CodeStatement NullCheck (CodeExpression expr, string exceptionMessage)
{
return new CodeConditionStatement (
IsNull (expr),
new CodeThrowExceptionStatement (new CodeObjectCreateExpression (
new CodeTypeReference (typeof (ArgumentNullException), CodeTypeReferenceOptions.GlobalReference),
new CodePrimitiveExpression (exceptionMessage)))
);
}
static CodeBinaryOperatorExpression NotNull (CodeExpression reference)
{
return new CodeBinaryOperatorExpression (reference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression (null));
}
static CodeBinaryOperatorExpression IsNull (CodeExpression reference)
{
return new CodeBinaryOperatorExpression (reference, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (null));
}
static CodeBinaryOperatorExpression IsFalse (CodeExpression expr)
{
return new CodeBinaryOperatorExpression (expr, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (false));
}
static CodeBinaryOperatorExpression BooleanAnd (CodeExpression expr1, CodeExpression expr2)
{
return new CodeBinaryOperatorExpression (expr1, CodeBinaryOperatorType.BooleanAnd, expr2);
}
static CodeStatement ArgNullCheck (CodeExpression value, params CodeExpression[] argNullExcArgs)
{
return new CodeConditionStatement (
new CodeBinaryOperatorExpression (value,
CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (null)),
new CodeThrowExceptionStatement (new CodeObjectCreateExpression (typeof (ArgumentNullException), argNullExcArgs)));
}
static CodeMemberField PrivateField (CodeTypeReference typeRef, string name)
{
return new CodeMemberField (typeRef, name) {
Attributes = MemberAttributes.Private
};
}
#endregion
}
}

View file

@ -1,295 +0,0 @@
//
// Tokeniser.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.IO;
using System.Diagnostics;
namespace Mono.TextTemplating
{
public class Tokeniser
{
string content;
int position = 0;
string value;
State nextState = State.Content;
Location nextStateLocation;
Location nextStateTagStartLocation;
public Tokeniser (string fileName, string content)
{
State = State.Content;
this.content = content;
this.Location = this.nextStateLocation = this.nextStateTagStartLocation = new Location (fileName, 1, 1);
}
public bool Advance ()
{
value = null;
State = nextState;
Location = nextStateLocation;
TagStartLocation = nextStateTagStartLocation;
if (nextState == State.EOF)
return false;
nextState = GetNextStateAndCurrentValue ();
return true;
}
State GetNextStateAndCurrentValue ()
{
switch (State) {
case State.Block:
case State.Expression:
case State.Helper:
return GetBlockEnd ();
case State.Directive:
return NextStateInDirective ();
case State.Content:
return NextStateInContent ();
case State.DirectiveName:
return GetDirectiveName ();
case State.DirectiveValue:
return GetDirectiveValue ();
default:
throw new InvalidOperationException ("Unexpected state '" + State.ToString () + "'");
}
}
State GetBlockEnd ()
{
int start = position;
for (; position < content.Length; position++) {
char c = content[position];
nextStateTagStartLocation = nextStateLocation;
nextStateLocation = nextStateLocation.AddCol ();
if (c == '\r') {
if (position + 1 < content.Length && content[position + 1] == '\n')
position++;
nextStateLocation = nextStateLocation.AddLine();
} else if (c == '\n') {
nextStateLocation = nextStateLocation.AddLine();
} else if (c =='>' && content[position-1] == '#' && content[position-2] != '\\') {
value = content.Substring (start, position - start - 1);
position++;
TagEndLocation = nextStateLocation;
//skip newlines directly after blocks, unless they're expressions
if (State != State.Expression && (position += IsNewLine()) > 0) {
nextStateLocation = nextStateLocation.AddLine ();
}
return State.Content;
}
}
throw new ParserException ("Unexpected end of file.", nextStateLocation);
}
State GetDirectiveName ()
{
int start = position;
for (; position < content.Length; position++) {
char c = content[position];
if (!Char.IsLetterOrDigit (c)) {
value = content.Substring (start, position - start);
return State.Directive;
} else {
nextStateLocation = nextStateLocation.AddCol ();
}
}
throw new ParserException ("Unexpected end of file.", nextStateLocation);
}
State GetDirectiveValue ()
{
int start = position;
int delimiter = '\0';
for (; position < content.Length; position++) {
char c = content[position];
nextStateLocation = nextStateLocation.AddCol ();
if (c == '\r') {
if (position + 1 < content.Length && content[position + 1] == '\n')
position++;
nextStateLocation = nextStateLocation.AddLine();
} else if (c == '\n')
nextStateLocation = nextStateLocation.AddLine();
if (delimiter == '\0') {
if (c == '\'' || c == '"') {
start = position;
delimiter = c;
} else if (!Char.IsWhiteSpace (c)) {
throw new ParserException ("Unexpected character '" + c + "'. Expecting attribute value.", nextStateLocation);
}
continue;
}
if (c == delimiter) {
value = content.Substring (start + 1, position - start - 1);
position++;
return State.Directive;
}
}
throw new ParserException ("Unexpected end of file.", nextStateLocation);;
}
State NextStateInContent ()
{
int start = position;
for (; position < content.Length; position++) {
char c = content[position];
nextStateTagStartLocation = nextStateLocation;
nextStateLocation = nextStateLocation.AddCol ();
if (c == '\r') {
if (position + 1 < content.Length && content[position + 1] == '\n')
position++;
nextStateLocation = nextStateLocation.AddLine();
} else if (c == '\n') {
nextStateLocation = nextStateLocation.AddLine();
} else if (c =='<' && position + 2 < content.Length && content[position+1] == '#') {
TagEndLocation = nextStateLocation;
char type = content[position+2];
if (type == '@') {
nextStateLocation = nextStateLocation.AddCols (2);
value = content.Substring (start, position - start);
position += 3;
return State.Directive;
} else if (type == '=') {
nextStateLocation = nextStateLocation.AddCols (2);
value = content.Substring (start, position - start);
position += 3;
return State.Expression;
} else if (type == '+') {
nextStateLocation = nextStateLocation.AddCols (2);
value = content.Substring (start, position - start);
position += 3;
return State.Helper;
} else {
value = content.Substring (start, position - start);
nextStateLocation = nextStateLocation.AddCol ();
position += 2;
return State.Block;
}
}
}
//EOF is only valid when we're in content
value = content.Substring (start);
return State.EOF;
}
int IsNewLine() {
int found = 0;
if (position < content.Length && content[position] == '\r') {
found++;
}
if (position+found < content.Length && content[position+found] == '\n') {
found++;
}
return found;
}
State NextStateInDirective () {
for (; position < content.Length; position++) {
char c = content[position];
if (c == '\r') {
if (position + 1 < content.Length && content[position + 1] == '\n')
position++;
nextStateLocation = nextStateLocation.AddLine();
} else if (c == '\n') {
nextStateLocation = nextStateLocation.AddLine();
} else if (Char.IsLetter (c)) {
return State.DirectiveName;
} else if (c == '=') {
nextStateLocation = nextStateLocation.AddCol ();
position++;
return State.DirectiveValue;
} else if (c == '#' && position + 1 < content.Length && content[position+1] == '>') {
position+=2;
TagEndLocation = nextStateLocation.AddCols (2);
nextStateLocation = nextStateLocation.AddCols (3);
//skip newlines directly after directives
if ((position += IsNewLine()) > 0) {
nextStateLocation = nextStateLocation.AddLine();
}
return State.Content;
} else if (!Char.IsWhiteSpace (c)) {
throw new ParserException ("Directive ended unexpectedly with character '" + c + "'", nextStateLocation);
} else {
nextStateLocation = nextStateLocation.AddCol ();
}
}
throw new ParserException ("Unexpected end of file.", nextStateLocation);
}
public State State {
get; private set;
}
public int Position {
get { return position; }
}
public string Content {
get { return content; }
}
public string Value {
get { return value; }
}
public Location Location { get; private set; }
public Location TagStartLocation { get; private set; }
public Location TagEndLocation { get; private set; }
}
public enum State
{
Content = 0,
Directive,
Expression,
Block,
Helper,
DirectiveName,
DirectiveValue,
Name,
EOF
}
public class ParserException : Exception
{
public ParserException (string message, Location location) : base (message)
{
Location = location;
}
public Location Location { get; private set; }
}
}

View file

@ -1,19 +0,0 @@
TextTemplating
==============
This is the TextTemplating tool inluded in MonoDevelop.
The original location of these files is
https://github.com/mono/monodevelop/tree/master/main/src/addins/TextTemplating
Building on Windows
-------------------
Run build.cmd or open TextTemplating.sln in visual studio 2010
Dotnet framework 4 must be installed.
License
-------
Licensed under the MIT/X11 license: http://www.opensource.org/licenses/mit-license.php

View file

@ -1,26 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.TextTemplating", "Mono.TextTemplating\Mono.TextTemplating.csproj", "{A2364D6A-00EF-417C-80A6-815726C70032}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTransform", "TextTransform\TextTransform.csproj", "{D1D35409-C814-47F6-B038-B9B5BF0FE490}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Any CPU = Release|Any CPU
Debug|Any CPU = Debug|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A2364D6A-00EF-417C-80A6-815726C70032}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.Release|Any CPU.Build.0 = Release|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2364D6A-00EF-417C-80A6-815726C70032}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|Any CPU.Build.0 = Release|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -1,39 +0,0 @@
//
// AssemblyInfo.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle("TextTransform")]
[assembly: AssemblyDescription("T4 text transformation tool")]
[assembly: AssemblyCompany("The Mono Project")]
[assembly: AssemblyProduct("MonoDevelop")]
[assembly: AssemblyCopyright("MIT/X11")]
//[assembly: AssemblyVersion("1.0.0.0")]

View file

@ -1,25 +0,0 @@
2009-08-12 Michael Hutchinson <mhutchinson@novell.com>
* Makefile.am:
* TextTransform.csproj: Include the ASP.NET MVC and
TextTemplating addins in the main solution and build.
2009-03-13 Michael Hutchinson <mhutchinson@novell.com>
* TextTransform.csproj: Move output dir from ../bin to
../build.
2009-03-05 Michael Hutchinson <mhutchinson@novell.com>
* TextTransform.csproj: Updated.
* TextTransform.cs: Complete the runner implementation.
2009-03-04 Michael Hutchinson <mhutchinson@novell.com>
* Options.cs:
* AssemblyInfo.cs:
* TextTransform.cs:
* TextTransform.csproj: Stub out the command-line
TextTransform tool.

View file

@ -1,35 +0,0 @@
ADDIN_BUILD = $(top_builddir)/build/AddIns/MonoDevelop.TextTemplating
ASSEMBLY = $(ADDIN_BUILD)/TextTransform.exe
DEPS = $(top_builddir)/build/AddIns/MonoDevelop.TextTemplating/Mono.TextTemplating.dll
REFS = \
-r:System \
-r:System.Core
FILES = \
AssemblyInfo.cs \
Options.cs \
TextTransform.cs
RES =
all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD)
$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS)
mkdir -p $(ADDIN_BUILD)
$(CSC) $(CSC_FLAGS) -debug -out:$@ -target:exe $(REFS) $(build_deps) \
$(build_resources:%=/resource:%) $(build_sources)
$(ASSEMBLY).mdb: $(ASSEMBLY)
check: all
assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.TextTemplating
assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb
CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb
EXTRA_DIST = $(FILES) $(RES)
include $(top_srcdir)/Makefile.include

View file

@ -1,174 +0,0 @@
//
// Main.cs
//
// Author:
// Michael Hutchinson <mhutchinson@novell.com>
//
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
//
// 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, publish, 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.
using System;
using System.IO;
using System.Collections.Generic;
using Mono.Options;
namespace Mono.TextTemplating
{
class TextTransform
{
static OptionSet optionSet;
const string name ="TextTransform.exe";
public static int Main (string[] args)
{
if (args.Length == 0) {
ShowHelp (true);
}
var generator = new TemplateGenerator ();
string outputFile = null, inputFile = null;
var directives = new List<string> ();
var parameters = new List<string> ();
var session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession ();
string preprocess = null;
optionSet = new OptionSet () {
{ "o=|out=", "The name of the output {file}", s => outputFile = s },
{ "r=", "Assemblies to reference", s => generator.Refs.Add (s) },
{ "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add (s) },
{ "I=", "Paths to search for included files", s => generator.IncludePaths.Add (s) },
{ "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add (s) },
{ "dp=", "Directive processor (name!class!assembly)", s => directives.Add (s) },
{ "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add (s) },
{ "h|?|help", "Show help", s => ShowHelp (false) },
// { "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) },
{ "c=", "Preprocess the template into {0:class}", (s) => preprocess = s },
};
var remainingArgs = optionSet.Parse (args);
if (string.IsNullOrEmpty (outputFile)) {
Console.Error.WriteLine ("No output file specified.");
return -1;
}
if (remainingArgs.Count != 1) {
Console.Error.WriteLine ("No input file specified.");
return -1;
}
inputFile = remainingArgs [0];
if (!File.Exists (inputFile)) {
Console.Error.WriteLine ("Input file '{0}' does not exist.");
return -1;
}
//FIXME: implement quoting and escaping for values
foreach (var par in parameters) {
var split = par.Split ('!');
if (split.Length < 2) {
Console.Error.WriteLine ("Parameter does not have enough values: {0}", par);
return -1;
}
if (split.Length > 2) {
Console.Error.WriteLine ("Parameter has too many values: {0}", par);
return -1;
}
string name = split[split.Length-2];
string val = split[split.Length-1];
if (string.IsNullOrEmpty (name)) {
Console.Error.WriteLine ("Parameter has no name: {0}", par);
return -1;
}
generator.AddParameter (split.Length > 3? split[0] : null, split.Length > 2? split[split.Length-3] : null, name, val);
}
foreach (var dir in directives) {
var split = dir.Split ('!');
if (split.Length != 3) {
Console.Error.WriteLine ("Directive does not have correct number of values: {0}", dir);
return -1;
}
foreach (var s in split) {
if (string.IsNullOrEmpty (s)) {
Console.Error.WriteLine ("Directive has missing value: {0}", dir);
return -1;
}
}
generator.AddDirectiveProcessor (split[0], split[1], split[2]);
}
if (preprocess == null) {
Console.Write ("Processing '{0}'... ", inputFile);
generator.ProcessTemplate (inputFile, outputFile);
if (generator.Errors.HasErrors) {
Console.WriteLine ("failed.");
} else {
Console.WriteLine ("completed successfully.");
}
} else {
string className = preprocess;
string classNamespace = null;
int s = preprocess.LastIndexOf ('.');
if (s > 0) {
classNamespace = preprocess.Substring (0, s);
className = preprocess.Substring (s + 1);
}
Console.Write ("Preprocessing '{0}' into class '{1}.{2}'... ", inputFile, classNamespace, className);
string language;
string[] references;
generator.PreprocessTemplate (inputFile, className, classNamespace, outputFile, System.Text.Encoding.UTF8,
out language, out references);
if (generator.Errors.HasErrors) {
Console.WriteLine ("failed.");
} else {
Console.WriteLine ("completed successfully:");
Console.WriteLine (" Language: {0}", language);
if (references != null && references.Length > 0) {
Console.WriteLine (" References:");
foreach (string r in references)
Console.WriteLine (" {0}", r);
}
}
}
foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors)
Console.Error.WriteLine ("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column,
err.IsWarning? "WARNING" : "ERROR", err.ErrorText);
return generator.Errors.HasErrors? -1 : 0;
}
static void ShowHelp (bool concise)
{
Console.WriteLine ("TextTransform command line T4 processor");
Console.WriteLine ("Usage: {0} [options] input-file", name);
if (concise) {
Console.WriteLine ("Use --help to display options.");
} else {
Console.WriteLine ("Options:");
optionSet.WriteOptionDescriptions (System.Console.Out);
}
Console.WriteLine ();
Environment.Exit (0);
}
}
}

View file

@ -1,62 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D1D35409-C814-47F6-B038-B9B5BF0FE490}</ProjectGuid>
<OutputType>Exe</OutputType>
<AssemblyName>TextTransform</AssemblyName>
<RootNamespace>Mono.TextTemplating</RootNamespace>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin</OutputPath>
<DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Commandlineparameters>-o:out.txt in.tt</Commandlineparameters>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="TextTransform.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Options.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Mono.TextTemplating\Mono.TextTemplating.csproj">
<Project>{A2364D6A-00EF-417C-80A6-815726C70032}</Project>
<Name>Mono.TextTemplating</Name>
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<MonoDevelop>
<Properties>
<MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="Makefile.am" BuildTargetName="" CleanTargetName="" SyncReferences="true" IsAutotoolsProject="true" RelativeConfigureInPath="..">
<BuildFilesVar Sync="true" Name="FILES" />
<DeployFilesVar />
<ResourcesVar Sync="true" Name="RES" />
<OthersVar />
<GacRefVar Sync="true" Name="REFS" Prefix="-r:" />
<AsmRefVar Sync="true" Name="REFS" Prefix="-r:" />
<ProjectRefVar Sync="true" Name="DEPS" />
</MonoDevelop.Autotools.MakefileInfo>
</Properties>
</MonoDevelop>
</ProjectExtensions>
</Project>

View file

@ -1,5 +0,0 @@
@echo off
set WinDirNet=%WinDir%\Microsoft.NET\Framework
set msbuild="%WinDirNet%\v4.0.30319\msbuild.exe"
%msbuild% /t:Rebuild /p:Configuration=Release /p:Platform="Any CPU" "%~dp0\TextTemplating.sln"

View file

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="wix:DirectoryRef">
<xsl:copy>
<xsl:attribute name="DiskId">2</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,67 +0,0 @@
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{C4B4300B-5B96-4F43-BD7D-517A29693B30}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Gettext.Cs.Tests</RootNamespace>
<AssemblyName>Gettext.Cs.Tests</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="PoParserTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Gettext.Cs\Gettext.Cs.csproj">
<Project>{D8869765-AB47-4C03-B2C5-E5498A55CA79}</Project>
<Name>Gettext.Cs</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -1,64 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using Gettext.Cs;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Collections.Generic;
using System;
using System.Linq;
namespace Gettext.Cs.Tests
{
/// <summary>
///This is a test class for PoParserTest and is intended
///to contain all PoParserTest Unit Tests
///</summary>
[TestClass()]
public class PoParserTest
{
///<summary>
/// Tests slashes in parsed strings
/// <see href="http://code.google.com/p/gettext-cs-utils/issues/detail?id=1"/>
///</summary>
[TestMethod()]
public void ParseIntoDictionaryStringWithSlashesTest()
{
string msgid = @"The type of parameter \""${0}\"" is not supported";
string msgstr = @"Il tipo del parametro \""${0}\"" non è supportato";
string parsedMsgid = @"The type of parameter ""${0}"" is not supported";
string parsedMsgstr = @"Il tipo del parametro ""${0}"" non è supportato";
PoParser target = new PoParser();
TextReader reader = new StringReader(String.Format(@"
msgid ""{0}""
msgstr ""{1}""
", msgid, msgstr));
var actual = target.ParseIntoDictionary(reader);
Assert.AreEqual(1, actual.Count, "Parsed dictionary entries count do not match");
Assert.AreEqual(parsedMsgid, actual.Keys.ToArray()[0], "Key does not match");
Assert.AreEqual(parsedMsgstr, actual.Values.ToArray()[0], "Value does not match");
}
}
}

View file

@ -1,57 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
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("Gettext.Cs.Tests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Gettext.Cs.Tests")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM componenets. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("532f2d56-549a-474c-b46b-82fc90f1db64")]
// 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 Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -1,48 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System.Web.UI;
namespace Gettext.Cs.Web
{
[ParseChildren(false)]
public abstract class AspTranslate : Control
{
string content;
protected override void AddParsedSubObject(object obj)
{
if (obj is LiteralControl)
{
content = Translate(((LiteralControl)obj).Text);
}
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write(content);
}
protected abstract string Translate(string text);
}
}

View file

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{38474466-DA21-4D19-A4D8-E2E7918480D6}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Gettext.Cs.Web</RootNamespace>
<AssemblyName>Gettext.Cs.Web</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Controls\AspTranslate.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -1,58 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
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("Gettext.Cs.Web")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Gettext.Cs.Web")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
[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)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("efc9a6d8-33cd-4cc5-8984-90847fea390e")]
// 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")]

View file

@ -1,83 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D8869765-AB47-4C03-B2C5-E5498A55CA79}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Gettext.Cs</RootNamespace>
<AssemblyName>Gettext.Cs</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\..\..\..\..\bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\..\..\..\..\..\bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Resource\DatabaseResourceManager.cs" />
<Compile Include="Resource\DatabaseResourceReader.cs" />
<Compile Include="Resource\DatabaseResourceSet.cs" />
<Compile Include="Resource\FileBasedResourceManager.cs" />
<Compile Include="Parser\ParserRequestor.cs" />
<Compile Include="Parser\PoParser.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resource\GettextResourceManager.cs" />
<Compile Include="Resource\GettextResourceReader.cs" />
<Compile Include="Resource\GettextResourceSet.cs" />
<Compile Include="Templates\Strings.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Strings.tt</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="Templates\Strings.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>Strings.cs</LastGenOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -1,55 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Gettext.Cs
{
/// <summary>
/// Interface for retrieving data from the parser.
/// </summary>
public interface IGettextParserRequestor
{
/// <summary>
/// Handles a key value pair parsed from the po file.
/// </summary>
void Handle(string key, string value);
}
/// <summary>
/// Collects data from the parser into a dictionary.
/// </summary>
public class DictionaryGettextParserRequestor : Dictionary<String, String>, IGettextParserRequestor
{
#region IGettextParserRequestor Members
public void Handle(string key, string value)
{
this[key] = value;
}
#endregion
}
}

View file

@ -1,149 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Gettext.Cs
{
/// <summary>
/// Parses standard po files.
/// </summary>
public class PoParser
{
/// <summary>
/// Parses an input po file.
/// </summary>
public void Parse(TextReader reader, IGettextParserRequestor requestor)
{
const int StateWaitingKey = 1;
const int StateConsumingKey = 2;
const int StateConsumingValue = 3;
int state = StateWaitingKey;
StringBuilder currentKey = null;
StringBuilder currentValue = null;
string line;
while(true) {
line = reader.ReadLine();
line = line == null ? null : line.Trim();
if (line == null || line.Length == 0)
{
if (state == StateConsumingValue &&
currentKey != null &&
currentValue != null)
{
requestor.Handle(currentKey.ToString().Replace("\\n", "\n").Replace("\\\"", "\""),
currentValue.ToString().Replace("\\n", "\n").Replace("\\\"", "\""));
currentKey = null;
currentValue = null;
}
if (line == null)
break;
state = StateWaitingKey;
continue;
}
else if (line[0] == '#')
{
continue;
}
bool isMsgId = line.StartsWith("msgid ");
bool isMsgStr = !isMsgId && line.StartsWith("msgstr ");
if (isMsgId || isMsgStr)
{
state = isMsgId ? StateConsumingKey : StateConsumingValue;
int firstQuote = line.IndexOf('"');
if (firstQuote == -1)
continue;
int secondQuote = line.IndexOf('"', firstQuote + 1);
while (secondQuote != -1 && line[secondQuote - 1] == '\\')
secondQuote = line.IndexOf('"', secondQuote + 1);
if (secondQuote == -1)
continue;
string piece = line.Substring(firstQuote + 1, secondQuote - firstQuote - 1);
if (isMsgId)
{
currentKey = new StringBuilder();
currentKey.Append(piece);
}
else
{
currentValue = new StringBuilder();
currentValue.Append(piece);
}
}
else if (line[0] == '"')
{
if (line[line.Length - 1] == '"')
{
line = line.Substring(1, line.Length - 2);
}
else
{
line = line.Substring(1, line.Length - 1);
}
switch (state)
{
case StateConsumingKey:
currentKey.Append(line);
break;
case StateConsumingValue:
currentValue.Append(line);
break;
}
}
}
}
/// <summary>
/// Parses an input po file.
/// </summary>
public void Parse(string text, IGettextParserRequestor requestor)
{
Parse(new StringReader(text), requestor);
}
/// <summary>
/// Parses an input po file into a dictionary.
/// </summary>
public Dictionary<String, String> ParseIntoDictionary(TextReader reader)
{
var requestor = new DictionaryGettextParserRequestor();
Parse(reader, requestor);
return requestor;
}
}
}

View file

@ -1,58 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
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("Gettext.Cs")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Gettext.Cs")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
[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)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1c3b8e32-0c8d-4d0f-ae9b-d38e4b45690a")]
// 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")]

View file

@ -1,86 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Globalization;
using System.Resources;
using System.Configuration;
namespace Gettext.Cs
{
public class DatabaseResourceManager : System.Resources.ResourceManager
{
private string dsn;
private string sp;
public DatabaseResourceManager()
: base()
{
this.dsn = ConfigurationManager.AppSettings["Gettext.ConnectionString"] ?? ConfigurationManager.ConnectionStrings["Gettext"].ConnectionString;
ResourceSets = new System.Collections.Hashtable();
}
public DatabaseResourceManager(string storedProcedure)
: this()
{
this.sp = storedProcedure;
}
// Hack: kept for compatibility
public DatabaseResourceManager(string name, string path, string fileformat)
: this()
{
}
protected override ResourceSet InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)
{
DatabaseResourceSet rs = null;
if (ResourceSets.Contains(culture.Name))
{
rs = ResourceSets[culture.Name] as DatabaseResourceSet;
}
else
{
lock (ResourceSets)
{
// Check hash table once again after lock is set
if (ResourceSets.Contains(culture.Name))
{
rs = ResourceSets[culture.Name] as DatabaseResourceSet;
}
else
{
rs = new DatabaseResourceSet(dsn, culture, sp);
ResourceSets.Add(culture.Name, rs);
}
}
}
return rs;
}
}
}

View file

@ -1,121 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Resources;
using System.Collections;
using System.Data.SqlClient;
using System.Globalization;
using System.Configuration;
namespace Gettext.Cs
{
public class DatabaseResourceReader : IResourceReader
{
private string dsn;
private string language;
private string sp;
public DatabaseResourceReader(string dsn, CultureInfo culture)
{
this.dsn = dsn;
this.language = culture.Name;
}
public DatabaseResourceReader(string dsn, CultureInfo culture, string sp)
{
this.sp = sp;
this.dsn = dsn;
this.language = culture.Name;
}
public System.Collections.IDictionaryEnumerator GetEnumerator()
{
Hashtable dict = new Hashtable();
SqlConnection connection = new SqlConnection(dsn);
SqlCommand command = connection.CreateCommand();
if (language == "")
language = CultureInfo.InvariantCulture.Name;
// Use stored procedure or plain text
if (sp == null)
{
command.CommandText = string.Format("SELECT MessageKey, MessageValue FROM Message WHERE Culture = '{0}'", language);
}
else
{
command.CommandText = sp;
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.AddWithValue("@culture", language);
}
try
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
if (reader.GetValue(1) != System.DBNull.Value)
{
dict[reader.GetString(0)] = reader.GetString(1);
}
}
}
}
catch
{
bool raise = false;
if (bool.TryParse(ConfigurationManager.AppSettings["Gettext.Throw"], out raise) && raise)
{
throw;
}
}
finally
{
connection.Close();
}
return dict.GetEnumerator();
}
public void Close()
{
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
void IDisposable.Dispose()
{
}
}
}

View file

@ -1,50 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Resources;
using System.Globalization;
namespace Gettext.Cs
{
public class DatabaseResourceSet : ResourceSet
{
internal DatabaseResourceSet(string dsn, CultureInfo culture)
: base (new DatabaseResourceReader(dsn, culture))
{
}
internal DatabaseResourceSet(string dsn, CultureInfo culture, string sp)
: base(new DatabaseResourceReader(dsn, culture, sp))
{
}
public override Type GetDefaultReader()
{
return typeof(DatabaseResourceReader);
}
}
}

View file

@ -1,295 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Reflection;
using System.IO;
using System.Collections;
namespace Gettext.Cs
{
/// <summary>
/// Extendable file based resource manager.
/// </summary>
public class FileBasedResourceManager : System.Resources.ResourceManager
{
#region Properties
string path;
string fileformat;
/// <summary>
/// Path to retrieve the files from.
/// </summary>
public string Path
{
get { return path; }
set { path = value; }
}
/// <summary>
/// Format of the resource set po file based on {{culture}} and {{resource}} placeholders.
/// </summary>
public string FileFormat
{
get { return fileformat; }
set { fileformat = value; }
}
#endregion
#region Notification Events
/// <summary>
/// Arguments for events related to the creation, successful or not, of a resource set.
/// </summary>
public class ResourceSetCreationEventArgs : EventArgs
{
/// <summary>
/// Exception in case of error, null on success.
/// </summary>
public Exception Exception { get; set; }
/// <summary>
/// FileName from where the resource set was loaded.
/// </summary>
public String FileName { get; set; }
/// <summary>
/// Type of the resource set being initialized.
/// </summary>
public Type ResourceSetType { get; set; }
/// <summary>
/// Instance of the resource set created, may be null on error.
/// </summary>
public System.Resources.ResourceSet ResourceSet { get; set; }
/// <summary>
/// Whether the creation was successful.
/// </summary>
public bool Success { get; set; }
}
/// <summary>
/// Event that notifies the successful creation of a resource set.
/// </summary>
public event EventHandler<ResourceSetCreationEventArgs> CreatedResourceSet;
/// <summary>
/// Event that notifies an error creating a resource set.
/// </summary>
public event EventHandler<ResourceSetCreationEventArgs> FailedResourceSet;
protected void RaiseCreatedResourceSet(string filename, System.Resources.ResourceSet set)
{
var handler = CreatedResourceSet;
if (handler != null)
{
handler(this, new ResourceSetCreationEventArgs
{
FileName = filename,
ResourceSet = set,
ResourceSetType = this.ResourceSetType,
Success = true
});
}
}
protected void RaiseFailedResourceSet(string filename, Exception ex)
{
var handler = FailedResourceSet;
if (handler != null)
{
handler(this, new ResourceSetCreationEventArgs
{
FileName = filename,
ResourceSet = null,
ResourceSetType = this.ResourceSetType,
Success = false,
Exception = ex
});
}
}
#endregion
/// <summary>
/// Creates a new instance.
/// </summary>
/// <param name="name">Name of the resource</param>
/// <param name="path">Path to retrieve the files from</param>
/// <param name="fileformat">Format of the file name using {{resource}} and {{culture}} placeholders.</param>
public FileBasedResourceManager(string name, string path, string fileformat)
: base()
{
this.path = path;
this.fileformat = fileformat;
this.BaseNameField = name;
base.IgnoreCase = false;
base.ResourceSets = new System.Collections.Hashtable();
}
protected override string GetResourceFileName(System.Globalization.CultureInfo culture)
{
return fileformat.Replace("{{culture}}", culture.Name).Replace("{{resource}}", BaseNameField);
}
protected override System.Resources.ResourceSet InternalGetResourceSet(System.Globalization.CultureInfo culture, bool createIfNotExists, bool tryParents)
{
if (path == null && fileformat == null) return null;
if (culture == null || culture.Equals(CultureInfo.InvariantCulture)) return null;
System.Resources.ResourceSet rs = null;
Hashtable resourceSets = this.ResourceSets;
if (!TryFetchResourceSet(resourceSets, culture, out rs))
{
string resourceFileName = this.FindResourceFile(culture);
if (resourceFileName == null)
{
if (tryParents)
{
CultureInfo parent = culture.Parent;
rs = this.InternalGetResourceSet(parent, createIfNotExists, tryParents);
AddResourceSet(resourceSets, culture, ref rs);
return rs;
}
}
else
{
rs = this.CreateResourceSet(resourceFileName);
AddResourceSet(resourceSets, culture, ref rs);
return rs;
}
}
return rs;
}
protected virtual System.Resources.ResourceSet InternalCreateResourceSet(string resourceFileName)
{
object[] args = new object[] { resourceFileName };
return (System.Resources.ResourceSet)Activator.CreateInstance(this.ResourceSetType, args);
}
private System.Resources.ResourceSet CreateResourceSet(string resourceFileName)
{
System.Resources.ResourceSet set = null;
try
{
set = InternalCreateResourceSet(resourceFileName);
RaiseCreatedResourceSet(resourceFileName, set);
}
catch (Exception ex)
{
RaiseFailedResourceSet(resourceFileName, ex);
}
return set;
}
private string FindResourceFile(CultureInfo culture)
{
string resourceFileName = this.GetResourceFileName(culture);
string path = this.path ?? String.Empty;
// Try with simple path + filename combination
string fullpath = System.IO.Path.Combine(path, resourceFileName);
if (File.Exists(fullpath)) return fullpath;
// If path is relative, attempt different directories
if (path == String.Empty || !System.IO.Path.IsPathRooted(path))
{
// Try the entry assembly dir
if (Assembly.GetEntryAssembly() != null)
{
string dir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), path);
fullpath = System.IO.Path.Combine(dir, resourceFileName);
if (File.Exists(fullpath)) return fullpath;
}
// Else try the executing assembly dir
if (Assembly.GetExecutingAssembly() != null)
{
if (Assembly.GetEntryAssembly() == null || System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) != System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
{
string dir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), path);
fullpath = System.IO.Path.Combine(dir, resourceFileName);
if (File.Exists(fullpath)) return fullpath;
}
}
}
return null;
}
private void AddResourceSet(Hashtable localResourceSets, CultureInfo culture, ref System.Resources.ResourceSet rs)
{
lock (localResourceSets)
{
if (localResourceSets.Contains(culture))
{
var existing = (System.Resources.ResourceSet)localResourceSets[culture];
if (existing != null && !object.Equals(existing, rs))
{
rs.Dispose();
rs = existing;
var a = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");
}
}
else
{
localResourceSets.Add(culture, rs);
}
}
}
private bool TryFetchResourceSet(Hashtable localResourceSets, CultureInfo culture, out System.Resources.ResourceSet set)
{
lock (localResourceSets)
{
if (ResourceSets.Contains(culture))
{
set = (System.Resources.ResourceSet)ResourceSets[culture];
return true;
}
set = null;
return false;
}
}
private bool ValidateGetResourceSet(CultureInfo culture)
{
return !(culture == null || culture.Equals(CultureInfo.InvariantCulture) || String.IsNullOrEmpty(culture.Name));
}
}
}

View file

@ -1,150 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Diagnostics;
using System.Globalization;
using System.Configuration;
using System.Collections.Specialized;
using System.Security.Permissions;
using System.Collections;
namespace Gettext.Cs
{
/// <summary>
/// Gettext based resource manager that reads from po files.
/// </summary>
public class GettextResourceManager : FileBasedResourceManager
{
#region Defaults
const string defaultFileFormat = "{{culture}}\\{{resource}}.po";
const string defaultPath = "";
#endregion
#region Properties
/// <summary>
/// Returns the Gettext resource set type used.
/// </summary>
public override Type ResourceSetType
{
get { return typeof(GettextResourceSet); }
}
#endregion
#region Constructos
/// <summary>
/// Creates a new instance.
/// </summary>
/// <param name="name">Name of the resource</param>
/// <param name="path">Path to retrieve the files from</param>
/// <param name="fileformat">Format of the file name using {{resource}} and {{culture}} placeholders.</param>
public GettextResourceManager(string name, string path, string fileformat)
: base(name, path, fileformat)
{
}
/// <summary>
/// Creates a new instance using local path and "{{culture}}\{{resource}}.po" file format.
/// </summary>
/// <param name="name">Name of the resource</param>
public GettextResourceManager(string name)
: base(name, defaultPath, defaultFileFormat)
{
}
#endregion
#region Configuration
/// <summary>
/// Loads the named configuration section and retrieves file format and path from "fileformat" and "path" settings.
/// </summary>
/// <param name="section">Name of the section to retrieve.</param>
/// <returns>True if the configuration section was loaded.</returns>
public bool LoadConfiguration(string section)
{
var config = ConfigurationManager.GetSection(section) as NameValueCollection;
if (config == null) return false;
this.FileFormat = config["fileformat"] ?? FileFormat;
this.Path = config["path"] ?? Path;
return true;
}
/// <summary>
/// Creates a new instance retrieving path and fileformat from the specified configuration section.
/// </summary>
/// <param name="name">Name of the resource</param>
/// <param name="section">Name of the configuration section</param>
/// <returns>New instance of ResourceManager</returns>
public static FileBasedResourceManager CreateFromConfiguration(string name, string section)
{
return CreateFromConfiguration(name, section, defaultFileFormat, defaultPath);
}
/// <summary>
/// Creates a new instance retrieving path and fileformat from the specified configuration section.
/// </summary>
/// <param name="name">Name of the resource</param>
/// <param name="section">Name of the configuration section with fileformat and path settings</param>
/// <param name="fallbackFileFormat">File format to be used if configuration could not be retrieved</param>
/// <param name="fallbackPath">Path to be used if configuration could not be retrieved</param>
/// <returns>New instance of ResourceManager</returns>
public static FileBasedResourceManager CreateFromConfiguration(string name, string section, string fallbackFileFormat, string fallbackPath)
{
var config = ConfigurationManager.GetSection(section) as NameValueCollection;
string fileformat = null;
string path = null;
if (config == null)
{
fileformat = fallbackFileFormat;
path = fallbackPath;
}
else
{
fileformat = config["fileformat"] ?? fallbackFileFormat;
path = config["path"] ?? fallbackPath;
}
return new FileBasedResourceManager(name, path, fileformat);
}
#endregion
}
}

View file

@ -1,87 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Resources;
using System.IO;
namespace Gettext.Cs
{
public class GettextResourceReader : IResourceReader
{
Stream stream;
public GettextResourceReader(Stream stream)
{
this.stream = stream;
}
#region IResourceReader Members
public void Close()
{
if (stream != null)
{
this.stream.Close();
}
}
public System.Collections.IDictionaryEnumerator GetEnumerator()
{
if (stream == null)
{
throw new ArgumentNullException("Input stream cannot be null");
}
using (var reader = new StreamReader(stream))
{
return new PoParser().ParseIntoDictionary(reader).GetEnumerator();
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
#endregion
#region IDisposable Members
public void Dispose()
{
if (stream != null)
{
stream.Dispose();
}
}
#endregion
}
}

View file

@ -1,49 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;
namespace Gettext.Cs
{
public class GettextResourceSet : System.Resources.ResourceSet
{
public GettextResourceSet(string filename)
: base(new GettextResourceReader(File.OpenRead(filename)))
{
}
public GettextResourceSet(Stream stream)
: base(new GettextResourceReader(stream))
{
}
public override Type GetDefaultReader()
{
return typeof(Gettext.Cs.GettextResourceReader);
}
}
}

View file

@ -1,166 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
// <autogenerated>
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// </autogenerated>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Threading;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace Gettext
{
public class Strings
{
private static Object resourceManLock = new Object();
private static System.Resources.ResourceManager resourceMan;
private static System.Globalization.CultureInfo resourceCulture;
public const string ResourceName = "Strings";
private static string resourcesDir = GetSetting("ResourcesDir", "Po");
private static string fileFormat = GetSetting("ResourcesFileFormat", "{{culture}}/{{resource}}.po");
private static string GetSetting(string setting, string defaultValue)
{
var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");
if (section == null) return defaultValue;
else return section[setting] ?? defaultValue;
}
/// <summary>
/// Resources directory used to retrieve files from.
/// </summary>
public static string ResourcesDirectory
{
get { return resourcesDir; }
set { resourcesDir = value; }
}
/// <summary>
/// Format of the file based on culture and resource name.
/// </summary>
public static string FileFormat
{
get { return fileFormat; }
set { fileFormat = value; }
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
public static System.Resources.ResourceManager ResourceManager
{
get
{
if (object.ReferenceEquals(resourceMan, null))
{
lock (resourceManLock)
{
if (object.ReferenceEquals(resourceMan, null))
{
var directory = resourcesDir;
var mgr = new global::Gettext.Cs.GettextResourceManager(ResourceName, directory, fileFormat);
resourceMan = mgr;
}
}
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
public static System.Globalization.CultureInfo Culture
{
get { return resourceCulture; }
set { resourceCulture = value; }
}
/// <summary>
/// Looks up a localized string; used to mark string for translation as well.
/// </summary>
public static string T(string t)
{
return T(null, t);
}
/// <summary>
/// Looks up a localized string; used to mark string for translation as well.
/// </summary>
public static string T(CultureInfo info, string t)
{
if (String.IsNullOrEmpty(t)) return t;
var translated = ResourceManager.GetString(t, info ?? resourceCulture);
return String.IsNullOrEmpty(translated) ? t : translated;
}
/// <summary>
/// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well.
/// </summary>
public static string T(string t, params object[] parameters)
{
return T(null, t, parameters);
}
/// <summary>
/// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well.
/// </summary>
public static string T(CultureInfo info, string t, params object[] parameters)
{
if (String.IsNullOrEmpty(t)) return t;
return String.Format(T(info, t), parameters);
}
/// <summary>
/// Marks a string for future translation, does not translate it now.
/// </summary>
public static string M(string t)
{
return t;
}
/// <summary>
/// Returns the resource set available for the specified culture.
/// </summary>
public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture)
{
return ResourceManager.GetResourceSet(culture, true, true);
}
}
}

View file

@ -1,196 +0,0 @@
<#@ template language="C#v3.5" hostspecific="True" #>
// <autogenerated>
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// </autogenerated>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Threading;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace <#= this.NamespaceName #>
{
public class <#= this.ClassName #>
{
private static Object resourceManLock = new Object();
private static System.Resources.ResourceManager resourceMan;
private static System.Globalization.CultureInfo resourceCulture;
public const string ResourceName = "<#= this.ResourceName #>";
<# if (!UseDatabase) { #>
private static string resourcesDir = GetSetting("ResourcesDir", "<#= this.DefaultResourceDir #>");
private static string fileFormat = GetSetting("ResourcesFileFormat", "<#= this.DefaultFileFormat #>");
<# } #>
private static string GetSetting(string setting, string defaultValue)
{
var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("<#= this.ConfigurationSection #>");
if (section == null) return defaultValue;
else return section[setting] ?? defaultValue;
}
<# if (!UseDatabase) { #>
/// <summary>
/// Resources directory used to retrieve files from.
/// </summary>
public static string ResourcesDirectory
{
get { return resourcesDir; }
set { resourcesDir = value; }
}
/// <summary>
/// Format of the file based on culture and resource name.
/// </summary>
public static string FileFormat
{
get { return fileFormat; }
set { fileFormat = value; }
}
<# } #>
<# if (ResourceManagerExpires) { #>
private static DateTime resourceManagerLoadedAt = DateTime.Now;
<# } #>
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
public static System.Resources.ResourceManager ResourceManager
{
get
{
<# if (ResourceManagerExpires) { #>
if (resourceMan != null && DateTime.Now.Subtract(resourceManagerLoadedAt).TotalMinutes >= <#= ResourceManagerTTL #>)
{
lock (resourceManLock)
{
if (resourceMan != null && DateTime.Now.Subtract(resourceManagerLoadedAt).TotalMinutes >= <#= ResourceManagerTTL #>)
{
resourceMan.ReleaseAllResources();
resourceMan = null;
}
}
}
<# } #>
if (object.ReferenceEquals(resourceMan, null))
{
lock (resourceManLock)
{
if (object.ReferenceEquals(resourceMan, null))
{
<# if (UseDatabase) { #>
var mgr = new global::Gettext.Cs.DatabaseResourceManager("<#= this.StoredProcedureName #>");
<# } else { #>
var directory = resourcesDir;
<# if (ServerMapPath) { #>
if (System.Web.HttpContext.Current != null)
directory = System.Web.HttpContext.Current.Server.MapPath(directory);
<# } #>
var mgr = <#= String.Format(this.ResourceManagerCtor, this.ResourceManagerType) #>;
<# if (ResourceManagerExpires) { #>
resourceManagerLoadedAt = DateTime.Now;
<# } #>
<# } #>
resourceMan = mgr;
}
}
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
public static System.Globalization.CultureInfo Culture
{
get { return resourceCulture; }
set { resourceCulture = value; }
}
/// <summary>
/// Looks up a localized string; used to mark string for translation as well.
/// </summary>
public static string T(string t)
{
return T(null, t);
}
/// <summary>
/// Looks up a localized string; used to mark string for translation as well.
/// </summary>
public static string T(CultureInfo info, string t)
{
if (String.IsNullOrEmpty(t)) return t;
var translated = ResourceManager.GetString(t, info ?? resourceCulture);
return String.IsNullOrEmpty(translated) ? t : translated;
}
/// <summary>
/// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well.
/// </summary>
public static string T(string t, params object[] parameters)
{
return T(null, t, parameters);
}
/// <summary>
/// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well.
/// </summary>
public static string T(CultureInfo info, string t, params object[] parameters)
{
if (String.IsNullOrEmpty(t)) return t;
return String.Format(T(info, t), parameters);
}
/// <summary>
/// Marks a string for future translation, does not translate it now.
/// </summary>
public static string M(string t)
{
return t;
}
/// <summary>
/// Returns the resource set available for the specified culture.
/// </summary>
public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture)
{
return ResourceManager.GetResourceSet(culture, true, true);
}
}
}
<#+
// Template parameters
string ClassName = "Strings";
string ResourceName = "Strings";
string NamespaceName = "Gettext";
string ResourceManagerType = "global::Gettext.Cs.GettextResourceManager";
string ResourceManagerCtor = "new {0}(ResourceName, directory, fileFormat)";
string DefaultResourceDir = "Po";
string DefaultFileFormat = "{{culture}}/{{resource}}.po";
string ConfigurationSection = "appSettings";
bool ServerMapPath = false;
bool ResourceManagerExpires = false;
int ResourceManagerTTL = 0;
bool UseDatabase = false;
string StoredProcedureName = "GettextGetResourceSet";
#>

View file

@ -1,125 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{64737816-54EF-4891-A58D-0642F07F09AD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gnu.Getopt", "Lib\Gnu.Getopt\Gnu.Getopt.csproj", "{379BC478-7D84-4E0E-A4B8-197905C824AE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.AspExtract", "Tools\Gettext.AspExtract\Gettext.AspExtract.csproj", "{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Msgfmt", "Tools\Gettext.Msgfmt\Gettext.Msgfmt.csproj", "{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.ResourcesReplacer", "Tools\Gettext.ResourcesReplacer\Gettext.ResourcesReplacer.csproj", "{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{380A3584-88CB-4153-9BC1-C18CFAE9EF26}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Cs", "Core\Gettext.Cs\Gettext.Cs.csproj", "{D8869765-AB47-4C03-B2C5-E5498A55CA79}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gnu.Gettext", "Lib\Gnu.Gettext\Gnu.Gettext.csproj", "{859A653A-7728-4F02-BAF2-A5CD8F991916}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Cs.Web", "Core\Gettext.Cs.Web\Gettext.Cs.Web.csproj", "{38474466-DA21-4D19-A4D8-E2E7918480D6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.DatabaseResourceGenerator", "Tools\Gettext.DatabaseResourceGenerator\Gettext.DatabaseResourceGenerator.csproj", "{B19D8863-C5C2-4A13-B24A-566EB7498D17}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{DF21B331-8022-4958-AEF7-D7897814038A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Console", "Samples\Gettext.Samples.Console\Gettext.Samples.Console.csproj", "{470FDBA5-04E5-4A9F-80EA-987D1F8D9074}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Cs.Tests", "Core\Gettext.Cs.Tests\Gettext.Cs.Tests.csproj", "{C4B4300B-5B96-4F43-BD7D-517A29693B30}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Iconv", "Tools\Gettext.Iconv\Gettext.Iconv.csproj", "{7578444A-E104-4D72-94B5-DDCB1DA0D63F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Mvc", "Samples\Gettext.Samples.Mvc\Gettext.Samples.Mvc.csproj", "{208D43F3-84E6-45B9-B6CC-6E3F48E42A82}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Database", "Samples\Gettext.Samples.Database\Gettext.Samples.Database.csproj", "{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Spanish", "Samples\Gettext.Samples.Spanish\Gettext.Samples.Spanish.csproj", "{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}"
EndProject
Global
GlobalSection(TestCaseManagementSettings) = postSolution
CategoryFile = Gettext.CsUtils.vsmdi
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{379BC478-7D84-4E0E-A4B8-197905C824AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{379BC478-7D84-4E0E-A4B8-197905C824AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{379BC478-7D84-4E0E-A4B8-197905C824AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{379BC478-7D84-4E0E-A4B8-197905C824AE}.Release|Any CPU.Build.0 = Release|Any CPU
{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Release|Any CPU.Build.0 = Release|Any CPU
{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Release|Any CPU.Build.0 = Release|Any CPU
{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Release|Any CPU.Build.0 = Release|Any CPU
{D8869765-AB47-4C03-B2C5-E5498A55CA79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D8869765-AB47-4C03-B2C5-E5498A55CA79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D8869765-AB47-4C03-B2C5-E5498A55CA79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D8869765-AB47-4C03-B2C5-E5498A55CA79}.Release|Any CPU.Build.0 = Release|Any CPU
{859A653A-7728-4F02-BAF2-A5CD8F991916}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{859A653A-7728-4F02-BAF2-A5CD8F991916}.Debug|Any CPU.Build.0 = Debug|Any CPU
{859A653A-7728-4F02-BAF2-A5CD8F991916}.Release|Any CPU.ActiveCfg = Release|Any CPU
{859A653A-7728-4F02-BAF2-A5CD8F991916}.Release|Any CPU.Build.0 = Release|Any CPU
{38474466-DA21-4D19-A4D8-E2E7918480D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{38474466-DA21-4D19-A4D8-E2E7918480D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38474466-DA21-4D19-A4D8-E2E7918480D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{38474466-DA21-4D19-A4D8-E2E7918480D6}.Release|Any CPU.Build.0 = Release|Any CPU
{B19D8863-C5C2-4A13-B24A-566EB7498D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B19D8863-C5C2-4A13-B24A-566EB7498D17}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B19D8863-C5C2-4A13-B24A-566EB7498D17}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B19D8863-C5C2-4A13-B24A-566EB7498D17}.Release|Any CPU.Build.0 = Release|Any CPU
{470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Debug|Any CPU.Build.0 = Debug|Any CPU
{470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Release|Any CPU.ActiveCfg = Release|Any CPU
{470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Release|Any CPU.Build.0 = Release|Any CPU
{C4B4300B-5B96-4F43-BD7D-517A29693B30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C4B4300B-5B96-4F43-BD7D-517A29693B30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C4B4300B-5B96-4F43-BD7D-517A29693B30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C4B4300B-5B96-4F43-BD7D-517A29693B30}.Release|Any CPU.Build.0 = Release|Any CPU
{7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Release|Any CPU.Build.0 = Release|Any CPU
{208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Release|Any CPU.ActiveCfg = Release|Any CPU
{208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Release|Any CPU.Build.0 = Release|Any CPU
{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Release|Any CPU.Build.0 = Release|Any CPU
{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}
{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}
{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}
{B19D8863-C5C2-4A13-B24A-566EB7498D17} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}
{7578444A-E104-4D72-94B5-DDCB1DA0D63F} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}
{379BC478-7D84-4E0E-A4B8-197905C824AE} = {64737816-54EF-4891-A58D-0642F07F09AD}
{859A653A-7728-4F02-BAF2-A5CD8F991916} = {64737816-54EF-4891-A58D-0642F07F09AD}
{D8869765-AB47-4C03-B2C5-E5498A55CA79} = {380A3584-88CB-4153-9BC1-C18CFAE9EF26}
{38474466-DA21-4D19-A4D8-E2E7918480D6} = {380A3584-88CB-4153-9BC1-C18CFAE9EF26}
{C4B4300B-5B96-4F43-BD7D-517A29693B30} = {380A3584-88CB-4153-9BC1-C18CFAE9EF26}
{470FDBA5-04E5-4A9F-80EA-987D1F8D9074} = {DF21B331-8022-4958-AEF7-D7897814038A}
{208D43F3-84E6-45B9-B6CC-6E3F48E42A82} = {DF21B331-8022-4958-AEF7-D7897814038A}
{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313} = {DF21B331-8022-4958-AEF7-D7897814038A}
{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5} = {DF21B331-8022-4958-AEF7-D7897814038A}
EndGlobalSection
EndGlobal

View file

@ -1,88 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security.Permissions;
//
// 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("GNU Getopt Argument Parser")]
[assembly: AssemblyDescription("This is a C# port of a Java port of GNU " +
"Getopt, a class for parsing command line arguments passed to programs. " +
"It is based on the C getopt() functions in glibc 2.0.6 and should " +
"parse options in a 100% compatible manner.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Free Software Foundation, Inc.")]
[assembly: AssemblyProduct("GNU Getopt")]
[assembly: AssemblyCopyright("Copyright (c) 1987-1997 Free Software " +
"Foundation, Inc., Java Port Copyright (c) 1998 by Aaron M. Renn " +
"(arenn@urbanophile.com), C#.NET Port of the Java Port Copyright (c) " +
"2004 by Klaus Prückl (klaus.prueckl@aon.at)")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//
// 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 Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("0.9.1.*")]
//
// In order to sign your assembly you must specify a key to use. Refer to the
// Microsoft .NET Framework documentation for more information on assembly signing.
//
// Use the attributes below to control which key is used for signing.
//
// Notes:
// (*) If no key is specified, the assembly is not signed.
// (*) KeyName refers to a key that has been installed in the Crypto Service
// Provider (CSP) on your machine. KeyFile refers to a file which contains
// a key.
// (*) If the KeyFile and the KeyName values are both specified, the
// following processing occurs:
// (1) If the KeyName can be found in the CSP, that key is used.
// (2) If the KeyName does not exist and the KeyFile does exist, the key
// in the KeyFile is installed into the CSP and used.
// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
// When specifying the KeyFile, the location of the KeyFile should be
// relative to the project output directory which is
// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
// located in the project directory, you would specify the AssemblyKeyFile
// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
// documentation for more information on this.
//
[assembly:CLSCompliant(true)]
[assembly:ComVisible(true)]

View file

@ -1,122 +0,0 @@
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{379BC478-7D84-4E0E-A4B8-197905C824AE}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<AssemblyName>Gnu.Getopt</AssemblyName>
<AssemblyOriginatorKeyFile>
</AssemblyOriginatorKeyFile>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<DelaySign>false</DelaySign>
<OutputType>Library</OutputType>
<RootNamespace>Gnu.Getopt</RootNamespace>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<StartupObject>
</StartupObject>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>0.0</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>bin\Debug\</OutputPath>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DocumentationFile>bin\Debug\Gnu.Getopt.XML</DocumentationFile>
<DebugSymbols>true</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<NoStdLib>false</NoStdLib>
<NoWarn>
</NoWarn>
<Optimize>false</Optimize>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<DebugType>full</DebugType>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE</DefineConstants>
<DocumentationFile>bin\Release\Gnu.Getopt.XML</DocumentationFile>
<DebugSymbols>false</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<NoStdLib>false</NoStdLib>
<NoWarn>
</NoWarn>
<Optimize>true</Optimize>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<DebugType>none</DebugType>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="System">
<Name>System</Name>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Getopt.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LongOpt.cs">
<SubType>Code</SubType>
</Compile>
<EmbeddedResource Include="MessagesBundle.cs.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.de.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.fr.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.hu.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.ja.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.nl.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.no.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MessagesBundle.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View file

@ -1,239 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
/**************************************************************************
/* LongOpt.cs -- C#.NET port of Long option object for Getopt
/*
/* Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com)
/* C#.NET Port Copyright (c) 2004 by Klaus Prückl (klaus.prueckl@aon.at)
/*
/* This program is free software; you can redistribute it and/or modify
/* it under the terms of the GNU Library 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 Library General Public License for more details.
/*
/* You should have received a copy of the GNU Library General Public License
/* along with this program; see the file COPYING.LIB. If not, write to
/* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
/* Boston, MA 02111-1307 USA
/**************************************************************************/
using System;
using System.Configuration;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Text;
namespace Gnu.Getopt
{
/// <summary>
/// Constant enumeration values used for the LongOpt <c>hasArg</c>
/// constructor argument.
/// </summary>
public enum Argument
{
/// <summary>
/// This value indicates that the option takes no argument.
/// </summary>
No = 0,
/// <summary>
/// This value indicates that the option takes an argument that is
/// required.
/// </summary>
Required = 1,
/// <summary>
/// This value indicates that the option takes an argument that is
/// optional.
/// </summary>
Optional = 2
}
/// <summary>
/// This object represents the definition of a long option in the C# port
/// of GNU getopt. An array of LongOpt objects is passed to the
/// <see cref="Getopt"/> object to define the list of valid long options
/// for a given parsing session. Refer to the <see cref="Getopt"/>
/// documentation for details on the format of long options.
/// </summary>
/// <seealso cref="Getopt">Getopt</seealso>
/// <author>Aaron M. Renn (arenn@urbanophile.com)</author>
/// <author>Klaus Prückl (klaus.prueckl@aon.at)</author>
public class LongOpt
{
#region Instance Variables
/// <summary>
/// The name of the long option.
/// </summary>
private string name;
/// <summary>
/// Indicates whether the option has no argument, a required argument,
/// or an optional argument.
/// </summary>
private Argument hasArg;
/// <summary>
/// If this variable is not null, then the value stored in <c>val</c>
/// is stored here when this long option is encountered. If this is
/// null, the value stored in <c>val</c> is treated as the name of an
/// equivalent short option.
/// </summary>
private StringBuilder flag;
/// <summary>
/// The value to store in <c>flag</c> if flag is not null, otherwise
/// the equivalent short option character for this long option.
/// </summary>
private int val;
/// <summary>
/// The localized strings are kept in the resources, which can be
/// accessed by the <see cref="ResourceManager"/> class.
/// </summary>
private ResourceManager resManager = new ResourceManager(
"Gnu.Getopt.MessagesBundle", Assembly.GetExecutingAssembly());
/// <summary>
/// The current UI culture (set to en-US when posixly correctness is
/// enabled).
/// </summary>
private CultureInfo cultureInfo = CultureInfo.CurrentUICulture;
#endregion
#region Constructors
/// <summary>
/// Create a new LongOpt object with the given parameter values. If the
/// value passed as <paramref name="hasArg"/> is not valid, then an
/// <see cref="ArgumentException"/> is thrown.
/// </summary>
/// <param name="name">
/// The long option string.
/// </param>
/// <param name="hasArg">
/// Indicates whether the option has no argument
/// (<see cref="Argument.No"/>), a required argument
/// (<see cref="Argument.Required"/>) or an optional argument
/// (<see cref="Argument.Optional"/>).
/// </param>
/// <param name="flag">
/// If non-null, this is a location to store the value of
/// <paramref name="val"/> when this option is encountered, otherwise
/// <paramref name="val"/> is treated as the equivalent short option
/// character.
/// </param>
/// <param name="val">
/// The value to return for this long option, or the equivalent single
/// letter option to emulate if flag is null.
/// </param>
/// <exception cref="System.ArgumentException">
/// Is thrown if the <paramref name="hasArg"/> param is not one of
/// <see cref="Argument.No"/>, <see cref="Argument.Required"/> or
/// <see cref="Argument.Optional"/>.
/// </exception>
public LongOpt(string name, Argument hasArg, StringBuilder flag,
int val)
{
// Check for application setting "Gnu.PosixlyCorrect" to determine
// whether to strictly follow the POSIX standard. This replaces the
// "POSIXLY_CORRECT" environment variable in the C version
try
{
if((bool) new AppSettingsReader().GetValue(
"Gnu.PosixlyCorrect", typeof(bool)))
{
this.cultureInfo = new CultureInfo("en-US");
}
}
catch(Exception)
{
}
// Validate hasArg
if ((hasArg != Argument.No) && (hasArg != Argument.Required) &&
(hasArg != Argument.Optional))
{
object[] msgArgs = new object[]{hasArg};
throw new System.ArgumentException(string.Format(
this.resManager.GetString("getopt.invalidValue",
this.cultureInfo), msgArgs));
}
// Store off values
this.name = name;
this.hasArg = hasArg;
this.flag = flag;
this.val = val;
}
#endregion
/// <summary>
/// Returns the name of this LongOpt as a string
/// </summary>
/// <returns>
/// The name of the long option
/// </returns>
public string Name
{
get { return this.name; }
}
/// <summary>
/// Returns the value set for the <c>hasArg</c> field for this long
/// option.
/// </summary>
/// <returns>
/// The value of <c>hasArg</c>.
/// </returns>
public Argument HasArg
{
get { return this.hasArg; }
}
/// <summary>
/// Returns the value of the <c>flag</c> field for this long option.
/// </summary>
/// <returns>
/// The value of <c>flag</c>.
/// </returns>
public StringBuilder Flag
{
get { return this.flag; }
}
/// <summary>
/// Returns the value of the <c>val</c> field for this long option.
/// </summary>
/// <returns>
/// The value of <c>val</c>.
/// </returns>
public int Val
{
get { return this.val; }
}
} // Class LongOpt
}

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: volba ''{1}'' je nejednoznaèná</value>
</data>
<data name="getopt.arguments1">
<value>{0}: volba ''--{1}'' nepøipou¹tí argument</value>
</data>
<data name="getopt.arguments2">
<value>{0}: volba ''{1}{2}'' nepøipou¹tí argument</value>
</data>
<data name="getopt.requires">
<value>{0}: volba ''{1}'' vy¾aduje argument</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: nepøípustná volba ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: nepøípustná volba ''{1}{2}''</value>
</data>
<data name="getopt.illegal">
<value>{0}: nepøípustná volba -- {1}</value>
</data>
<data name="getopt.invalid">
<value>{0}: neplatná volba -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: volba vy¾aduje argument -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Neplatná hodnota {0} parameteru 'has_arg' </value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: Option ''{1}'' ist zweideutig</value>
</data>
<data name="getopt.arguments1">
<value>{0}: Option ''--{1}'' erlaubt kein Argument</value>
</data>
<data name="getopt.arguments2">
<value>{0}: Option ''{1}{2}'' erlaubt kein Argument</value>
</data>
<data name="getopt.requires">
<value>{0}: Option ''{1}'' benötigt ein Argument</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: Unbekannte Option ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: Unbekannte Option ''{1}{2}''</value>
</data>
<data name="getopt.illegal">
<value>{0}: Verbotene Option -- {1}</value>
</data>
<data name="getopt.invalid">
<value>{0}: Ungültige Option -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: Option benötigt ein Argument -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Ungültiger Wert {0} für Parameter 'has_arg' </value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: l'option ''{1}'' est ambiguë</value>
</data>
<data name="getopt.arguments1">
<value>{0}: l'option ''--{1}'' ne permet pas de paramètre</value>
</data>
<data name="getopt.arguments2">
<value>{0}: l'option ''{1}{2}'' ne permet pas de paramètre</value>
</data>
<data name="getopt.requires">
<value>{0}: l'option ''{1}'' requiert un paramètre</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: option non reconnue ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: option non reconnue ''{1}{2}''</value>
</data>
<data name="getopt.illegal">
<value>{0}: option illégale -- {1}</value>
</data>
<data name="getopt.invalid">
<value>{0}: option invalide -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: cette option requiert un paramètre -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Valeur invalide {0} pour le paramètre 'has_arg'</value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: opció ''{1}'' félreérthetõ</value>
</data>
<data name="getopt.arguments1">
<value>{0}: opció ''--{1}'' nem enged meg argumentumot</value>
</data>
<data name="getopt.arguments2">
<value>{0}: opció ''{1}{2}'' nem enged meg argumentumot</value>
</data>
<data name="getopt.requires">
<value>{0}: opció ''{1}'' argumentumot igényel</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: ismeretlen opció ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: ismeretlen opció ''{1}{2}''</value>
</data>
<data name="getopt.illegal">
<value>{0}: illegális opció -- {1}</value>
</data>
<data name="getopt.invalid">
<value>{0}: érvénytelen opció -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: az opció argumentumot igényel -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Érvénytelen érték {0} a következõ paraméterhez 'has_arg' </value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: ''{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u66d6\u6627\u3067\u3059\u3002</value>
</data>
<data name="getopt.arguments1">
<value>{0}: ''--{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u3082\u3061\u307e\u305b\u3093\u3002</value>
</data>
<data name="getopt.arguments2">
<value>{0}: ''{1}{2}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u3082\u3061\u307e\u305b\u3093\u3002</value>
</data>
<data name="getopt.requires">
<value>{0}: ''{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: ''--{1}'' \u306f\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: ''{1}{2}'' \u306f\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002</value>
</data>
<data name="getopt.illegal">
<value>{0}: -- {1} \u306f\u4e0d\u6b63\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002</value>
</data>
<data name="getopt.invalid">
<value>{0}: -- {1} \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002</value>
</data>
<data name="getopt.requires2">
<value>{0}: -- {1} \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002</value>
</data>
<data name="getopt.invalidValue">
<value>{0} \u306f\u3001'has_arg' \u30d1\u30e9\u30e1\u30fc\u30bf\u3068\u3057\u3066\u4e0d\u6b63\u306a\u5024\u3067\u3059\u3002</value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: optie ''{1}'' is ambigue</value>
</data>
<data name="getopt.arguments1">
<value>{0}: optie ''--{1}'' staat geen argumenten toe</value>
</data>
<data name="getopt.arguments2">
<value>{0}: optie ''{1}{2}'' staat geen argumenten toe</value>
</data>
<data name="getopt.requires">
<value>{0}: optie ''{1}'' heeft een argument nodig</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: onbekende optie ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: onbekende optie ''{1}{2}''</value>
</data>
<data name="getopt.illegal">
<value>{0}: niet-toegestane optie -- {1}</value>
</data>
<data name="getopt.invalid">
<value>{0}: onjuiste optie -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: optie heeft een argument nodig -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Ongeldige waarde {0} voor parameter 'has_arg' </value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: flagget ''{1}'' er flertydig</value>
</data>
<data name="getopt.arguments1">
<value>{0}: flagget ''--{1}'' tillater ikke et argument</value>
</data>
<data name="getopt.arguments2">
<value>{0}: flagget ''{1}{2}'' tillater ikke et argument</value>
</data>
<data name="getopt.requires">
<value>{0}: flagget ''{1}'' krever et argument</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: ukjent flagg ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: ukjent flagg ''{1}{2}''</value>
</data>
<data name="getopt.illegal">
<value>{0}: ugyldig flagg -- {1}</value>
</data>
<data name="getopt.invalid">
<value>{0}: ugyldig flagg -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: flagget krever et argument -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Ugyldig verdi {0} for parameter 'has_arg' </value>
</data>
</root>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="getopt.ambigious">
<value>{0}: option ''{1}'' is ambiguous</value>
</data>
<data name="getopt.arguments1">
<value>{0}: option ''--{1}'' doesn't allow an argument</value>
</data>
<data name="getopt.arguments2">
<value>{0}: option ''{1}{2}'' doesn't allow an argument</value>
</data>
<data name="getopt.requires">
<value>{0}: option ''{1}'' requires an argument</value>
</data>
<data name="getopt.unrecognized">
<value>{0}: unrecognized option ''--{1}''</value>
</data>
<data name="getopt.unrecognized2">
<value>{0}: unrecognized option ''{1}{2}''</value>
</data>
<data name="getopt.invalid">
<value>{0}: invalid option -- {1}</value>
</data>
<data name="getopt.illegal">
<value>{0}: illegal option -- {1}</value>
</data>
<data name="getopt.requires2">
<value>{0}: option requires an argument -- {1}</value>
</data>
<data name="getopt.invalidValue">
<value>Invalid value {0} for parameter 'has_arg' </value>
</data>
</root>

View file

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{859A653A-7728-4F02-BAF2-A5CD8F991916}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>GNU.Gettext</RootNamespace>
<AssemblyName>GNU.Gettext</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="intl.cs" />
<Compile Include="msgfmt.cs" />
<Compile Include="msgunfmt.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -1,58 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
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("Gettext")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Gettext")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
[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)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3be71b7d-867c-46de-bb4d-d12215f0ae67")]
// 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")]

View file

@ -1,520 +0,0 @@
/**
* gettext-cs-utils
*
* Copyright 2011 Manas Technology Solutions
* http://www.manas.com.ar/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
/* GNU gettext for C#
* Copyright (C) 2003 Free Software Foundation, Inc.
* Written by Bruno Haible <bruno@clisp.org>, 2003.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2, 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library 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.
*/
/*
* Using the GNU gettext approach, compiled message catalogs are assemblies
* containing just one class, a subclass of GettextResourceSet. They are thus
* interoperable with standard ResourceManager based code.
*
* The main differences between the common .NET resources approach and the
* GNU gettext approach are:
* - In the .NET resource approach, the keys are abstract textual shortcuts.
* In the GNU gettext approach, the keys are the English/ASCII version
* of the messages.
* - In the .NET resource approach, the translation files are called
* "Resource.locale.resx" and are UTF-8 encoded XML files. In the GNU gettext
* approach, the translation files are called "Resource.locale.po" and are
* in the encoding the translator has chosen. There are at least three GUI
* translating tools (Emacs PO mode, KDE KBabel, GNOME gtranslator).
* - In the .NET resource approach, the function ResourceManager.GetString
* returns an empty string or throws an InvalidOperationException when no
* translation is found. In the GNU gettext approach, the GetString function
* returns the (English) message key in that case.
* - In the .NET resource approach, there is no support for plural handling.
* In the GNU gettext approach, we have the GetPluralString function.
*
* To compile GNU gettext message catalogs into C# assemblies, the msgfmt
* program can be used.
*/
using System; /* String, InvalidOperationException, Console */
using System.Globalization; /* CultureInfo */
using System.Resources; /* ResourceManager, ResourceSet, IResourceReader */
using System.Reflection; /* Assembly, ConstructorInfo */
using System.Collections; /* Hashtable, ICollection, IEnumerator, IDictionaryEnumerator */
using System.IO; /* Path, FileNotFoundException, Stream */
using System.Text; /* StringBuilder */
namespace GNU.Gettext {
/// <summary>
/// Each instance of this class can be used to lookup translations for a
/// given resource name. For each <c>CultureInfo</c>, it performs the lookup
/// in several assemblies, from most specific over territory-neutral to
/// language-neutral.
/// </summary>
public class GettextResourceManager : ResourceManager {
// ======================== Public Constructors ========================
/// <summary>
/// Constructor.
/// </summary>
/// <param name="baseName">the resource name, also the assembly base
/// name</param>
public GettextResourceManager (String baseName)
: base (baseName, Assembly.GetCallingAssembly(), typeof (GettextResourceSet)) {
}
/// <summary>
/// Constructor.
/// </summary>
/// <param name="baseName">the resource name, also the assembly base
/// name</param>
public GettextResourceManager (String baseName, Assembly assembly)
: base (baseName, assembly, typeof (GettextResourceSet)) {
}
// ======================== Implementation ========================
/// <summary>
/// Loads and returns a satellite assembly.
/// </summary>
// This is like Assembly.GetSatelliteAssembly, but uses resourceName
// instead of assembly.GetName().Name, and works around a bug in
// mono-0.28.
private static Assembly GetSatelliteAssembly (Assembly assembly, String resourceName, CultureInfo culture) {
String satelliteExpectedLocation =
Path.GetDirectoryName(assembly.Location)
+ Path.DirectorySeparatorChar + culture.Name
+ Path.DirectorySeparatorChar + resourceName + ".resources.dll";
return Assembly.LoadFrom(satelliteExpectedLocation);
}
/// <summary>
/// Loads and returns the satellite assembly for a given culture.
/// </summary>
private Assembly MySatelliteAssembly (CultureInfo culture) {
return GetSatelliteAssembly(MainAssembly, BaseName, culture);
}
/// <summary>
/// Converts a resource name to a class name.
/// </summary>
/// <returns>a nonempty string consisting of alphanumerics and underscores
/// and starting with a letter or underscore</returns>
private static String ConstructClassName (String resourceName) {
// We could just return an arbitrary fixed class name, like "Messages",
// assuming that every assembly will only ever contain one
// GettextResourceSet subclass, but this assumption would break the day
// we want to support multi-domain PO files in the same format...
bool valid = (resourceName.Length > 0);
for (int i = 0; valid && i < resourceName.Length; i++) {
char c = resourceName[i];
if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c == '_')
|| (i > 0 && c >= '0' && c <= '9')))
valid = false;
}
if (valid)
return resourceName;
else {
// Use hexadecimal escapes, using the underscore as escape character.
String hexdigit = "0123456789abcdef";
StringBuilder b = new StringBuilder();
b.Append("__UESCAPED__");
for (int i = 0; i < resourceName.Length; i++) {
char c = resourceName[i];
if (c >= 0xd800 && c < 0xdc00
&& i+1 < resourceName.Length
&& resourceName[i+1] >= 0xdc00 && resourceName[i+1] < 0xe000) {
// Combine two UTF-16 words to a character.
char c2 = resourceName[i+1];
int uc = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
b.Append('_');
b.Append('U');
b.Append(hexdigit[(uc >> 28) & 0x0f]);
b.Append(hexdigit[(uc >> 24) & 0x0f]);
b.Append(hexdigit[(uc >> 20) & 0x0f]);
b.Append(hexdigit[(uc >> 16) & 0x0f]);
b.Append(hexdigit[(uc >> 12) & 0x0f]);
b.Append(hexdigit[(uc >> 8) & 0x0f]);
b.Append(hexdigit[(uc >> 4) & 0x0f]);
b.Append(hexdigit[uc & 0x0f]);
i++;
} else if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9'))) {
int uc = c;
b.Append('_');
b.Append('u');
b.Append(hexdigit[(uc >> 12) & 0x0f]);
b.Append(hexdigit[(uc >> 8) & 0x0f]);
b.Append(hexdigit[(uc >> 4) & 0x0f]);
b.Append(hexdigit[uc & 0x0f]);
} else
b.Append(c);
}
return b.ToString();
}
}
/// <summary>
/// Instantiates a resource set for a given culture.
/// </summary>
/// <exception cref="ArgumentException">
/// The expected type name is not valid.
/// </exception>
/// <exception cref="ReflectionTypeLoadException">
/// satelliteAssembly does not contain the expected type.
/// </exception>
/// <exception cref="NullReferenceException">
/// The type has no no-arguments constructor.
/// </exception>
private static GettextResourceSet InstantiateResourceSet (Assembly satelliteAssembly, String resourceName, CultureInfo culture) {
// We expect a class with a culture dependent class name.
Type clazz = satelliteAssembly.GetType(ConstructClassName(resourceName)+"_"+culture.Name.Replace('-','_'));
// We expect it has a no-argument constructor, and invoke it.
ConstructorInfo constructor = clazz.GetConstructor(Type.EmptyTypes);
return constructor.Invoke(null) as GettextResourceSet;
}
private static GettextResourceSet[] EmptyResourceSetArray = new GettextResourceSet[0];
// Cache for already loaded GettextResourceSet cascades.
private Hashtable /* CultureInfo -> GettextResourceSet[] */ Loaded = new Hashtable();
/// <summary>
/// Returns the array of <c>GettextResourceSet</c>s for a given culture,
/// loading them if necessary, and maintaining the cache.
/// </summary>
private GettextResourceSet[] GetResourceSetsFor (CultureInfo culture) {
//Console.WriteLine(">> GetResourceSetsFor "+culture);
// Look up in the cache.
GettextResourceSet[] result = Loaded[culture] as GettextResourceSet[];
if (result == null) {
lock(this) {
// Look up again - maybe another thread has filled in the entry
// while we slept waiting for the lock.
result = Loaded[culture] as GettextResourceSet[];
if (result == null) {
// Determine the GettextResourceSets for the given culture.
if (culture.Parent == null || culture.Equals(CultureInfo.InvariantCulture))
// Invariant culture.
result = EmptyResourceSetArray;
else {
// Use a satellite assembly as primary GettextResourceSet, and
// the result for the parent culture as fallback.
GettextResourceSet[] parentResult = GetResourceSetsFor(culture.Parent);
Assembly satelliteAssembly;
try {
satelliteAssembly = MySatelliteAssembly(culture);
} catch (FileNotFoundException e) {
satelliteAssembly = null;
}
if (satelliteAssembly != null) {
GettextResourceSet satelliteResourceSet;
try {
satelliteResourceSet = InstantiateResourceSet(satelliteAssembly, BaseName, culture);
} catch (Exception e) {
Console.Error.WriteLine(e);
Console.Error.WriteLine(e.StackTrace);
satelliteResourceSet = null;
}
if (satelliteResourceSet != null) {
result = new GettextResourceSet[1+parentResult.Length];
result[0] = satelliteResourceSet;
Array.Copy(parentResult, 0, result, 1, parentResult.Length);
} else
result = parentResult;
} else
result = parentResult;
}
// Put the result into the cache.
Loaded.Add(culture, result);
}
}
}
//Console.WriteLine("<< GetResourceSetsFor "+culture);
return result;
}
/*
/// <summary>
/// Releases all loaded <c>GettextResourceSet</c>s and their assemblies.
/// </summary>
// TODO: No way to release an Assembly?
public override void ReleaseAllResources () {
...
}
*/
/// <summary>
/// Returns the translation of <paramref name="msgid"/> in a given culture.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <returns>the translation of <paramref name="msgid"/>, or
/// <paramref name="msgid"/> if none is found</returns>
public override String GetString (String msgid, CultureInfo culture) {
foreach (GettextResourceSet rs in GetResourceSetsFor(culture)) {
String translation = rs.GetString(msgid);
if (translation != null)
return translation;
}
// Fallback.
return msgid;
}
/// <summary>
/// Returns the translation of <paramref name="msgid"/> and
/// <paramref name="msgidPlural"/> in a given culture, choosing the right
/// plural form depending on the number <paramref name="n"/>.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <param name="msgidPlural">the English plural of <paramref name="msgid"/>,
/// an ASCII string</param>
/// <param name="n">the number, should be &gt;= 0</param>
/// <returns>the translation, or <paramref name="msgid"/> or
/// <paramref name="msgidPlural"/> if none is found</returns>
public virtual String GetPluralString (String msgid, String msgidPlural, long n, CultureInfo culture) {
foreach (GettextResourceSet rs in GetResourceSetsFor(culture)) {
String translation = rs.GetPluralString(msgid, msgidPlural, n);
if (translation != null)
return translation;
}
// Fallback: Germanic plural form.
return (n == 1 ? msgid : msgidPlural);
}
// ======================== Public Methods ========================
/// <summary>
/// Returns the translation of <paramref name="msgid"/> in the current
/// culture.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <returns>the translation of <paramref name="msgid"/>, or
/// <paramref name="msgid"/> if none is found</returns>
public override String GetString (String msgid) {
return GetString(msgid, CultureInfo.CurrentUICulture);
}
/// <summary>
/// Returns the translation of <paramref name="msgid"/> and
/// <paramref name="msgidPlural"/> in the current culture, choosing the
/// right plural form depending on the number <paramref name="n"/>.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <param name="msgidPlural">the English plural of <paramref name="msgid"/>,
/// an ASCII string</param>
/// <param name="n">the number, should be &gt;= 0</param>
/// <returns>the translation, or <paramref name="msgid"/> or
/// <paramref name="msgidPlural"/> if none is found</returns>
public virtual String GetPluralString (String msgid, String msgidPlural, long n) {
return GetPluralString(msgid, msgidPlural, n, CultureInfo.CurrentUICulture);
}
}
/// <summary>
/// <para>
/// Each instance of this class encapsulates a single PO file.
/// </para>
/// <para>
/// This API of this class is not meant to be used directly; use
/// <c>GettextResourceManager</c> instead.
/// </para>
/// </summary>
// We need this subclass of ResourceSet, because the plural formula must come
// from the same ResourceSet as the object containing the plural forms.
public class GettextResourceSet : ResourceSet {
/// <summary>
/// Creates a new message catalog. When using this constructor, you
/// must override the <c>ReadResources</c> method, in order to initialize
/// the <c>Table</c> property. The message catalog will support plural
/// forms only if the <c>ReadResources</c> method installs values of type
/// <c>String[]</c> and if the <c>PluralEval</c> method is overridden.
/// </summary>
protected GettextResourceSet ()
: base (DummyResourceReader) {
}
/// <summary>
/// Creates a new message catalog, by reading the string/value pairs from
/// the given <paramref name="reader"/>. The message catalog will support
/// plural forms only if the reader can produce values of type
/// <c>String[]</c> and if the <c>PluralEval</c> method is overridden.
/// </summary>
public GettextResourceSet (IResourceReader reader)
: base (reader) {
}
/// <summary>
/// Creates a new message catalog, by reading the string/value pairs from
/// the given <paramref name="stream"/>, which should have the format of
/// a <c>.resources</c> file. The message catalog will not support plural
/// forms.
/// </summary>
public GettextResourceSet (Stream stream)
: base (stream) {
}
/// <summary>
/// Creates a new message catalog, by reading the string/value pairs from
/// the file with the given <paramref name="fileName"/>. The file should
/// be in the format of a <c>.resources</c> file. The message catalog will
/// not support plural forms.
/// </summary>
public GettextResourceSet (String fileName)
: base (fileName) {
}
/// <summary>
/// Returns the translation of <paramref name="msgid"/>.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <returns>the translation of <paramref name="msgid"/>, or <c>null</c> if
/// none is found</returns>
// The default implementation essentially does (String)Table[msgid].
// Here we also catch the plural form case.
public override String GetString (String msgid) {
Object value = GetObject(msgid);
if (value == null || value is String)
return (String)value;
else if (value is String[])
// A plural form, but no number is given.
// Like the C implementation, return the first plural form.
return (value as String[])[0];
else
throw new InvalidOperationException("resource for \""+msgid+"\" in "+GetType().FullName+" is not a string");
}
/// <summary>
/// Returns the translation of <paramref name="msgid"/>, with possibly
/// case-insensitive lookup.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <returns>the translation of <paramref name="msgid"/>, or <c>null</c> if
/// none is found</returns>
// The default implementation essentially does (String)Table[msgid].
// Here we also catch the plural form case.
public override String GetString (String msgid, bool ignoreCase) {
Object value = GetObject(msgid, ignoreCase);
if (value == null || value is String)
return (String)value;
else if (value is String[])
// A plural form, but no number is given.
// Like the C implementation, return the first plural form.
return (value as String[])[0];
else
throw new InvalidOperationException("resource for \""+msgid+"\" in "+GetType().FullName+" is not a string");
}
/// <summary>
/// Returns the translation of <paramref name="msgid"/> and
/// <paramref name="msgidPlural"/>, choosing the right plural form
/// depending on the number <paramref name="n"/>.
/// </summary>
/// <param name="msgid">the key string to be translated, an ASCII
/// string</param>
/// <param name="msgidPlural">the English plural of <paramref name="msgid"/>,
/// an ASCII string</param>
/// <param name="n">the number, should be &gt;= 0</param>
/// <returns>the translation, or <c>null</c> if none is found</returns>
public virtual String GetPluralString (String msgid, String msgidPlural, long n) {
Object value = GetObject(msgid);
if (value == null || value is String)
return (String)value;
else if (value is String[]) {
String[] choices = value as String[];
long index = PluralEval(n);
return choices[index >= 0 && index < choices.Length ? index : 0];
} else
throw new InvalidOperationException("resource for \""+msgid+"\" in "+GetType().FullName+" is not a string");
}
/// <summary>
/// Returns the index of the plural form to be chosen for a given number.
/// The default implementation is the Germanic plural formula:
/// zero for <paramref name="n"/> == 1, one for <paramref name="n"/> != 1.
/// </summary>
protected virtual long PluralEval (long n) {
return (n == 1 ? 0 : 1);
}
/// <summary>
/// Returns the keys of this resource set, i.e. the strings for which
/// <c>GetObject()</c> can return a non-null value.
/// </summary>
public virtual ICollection Keys {
get {
return Table.Keys;
}
}
/// <summary>
/// A trivial instance of <c>IResourceReader</c> that does nothing.
/// </summary>
// Needed by the no-arguments constructor.
private static IResourceReader DummyResourceReader = new DummyIResourceReader();
}
/// <summary>
/// A trivial <c>IResourceReader</c> implementation.
/// </summary>
class DummyIResourceReader : IResourceReader {
// Implementation of IDisposable.
void System.IDisposable.Dispose () {
}
// Implementation of IEnumerable.
IEnumerator System.Collections.IEnumerable.GetEnumerator () {
return null;
}
// Implementation of IResourceReader.
void System.Resources.IResourceReader.Close () {
}
IDictionaryEnumerator System.Resources.IResourceReader.GetEnumerator () {
return null;
}
}
}

Some files were not shown because too many files have changed in this diff Show more