http://git-wip-us.apache.org/repos/asf/lucenenet/blob/9e389540/src/tools/lucene-cli/Resources/Strings.Designer.cs
----------------------------------------------------------------------
diff --git a/src/tools/lucene-cli/Resources/Strings.Designer.cs 
b/src/tools/lucene-cli/Resources/Strings.Designer.cs
new file mode 100644
index 0000000..0db885c
--- /dev/null
+++ b/src/tools/lucene-cli/Resources/Strings.Designer.cs
@@ -0,0 +1,962 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Lucene.Net.Cli.Resources {
+    using System;
+    using System.Reflection;
+    
+    
+    /// <summary>
+    ///    A strongly-typed resource class, for looking up localized strings, 
etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class Strings {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo 
resourceCulture;
+        
+        internal Strings() {
+        }
+        
+        /// <summary>
+        ///    Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager 
{
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new 
global::System.Resources.ResourceManager("lucene-cli.Resources.Strings", 
typeof(Strings).GetTypeInfo().Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///    Overrides the current thread's CurrentUICulture property for all
+        ///    resource lookups using this strongly typed resource class.
+        /// </summary>
+        
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Utilities to manage 
specialized analyzers..
+        /// </summary>
+        public static string AnalysisCommandDescription {
+            get {
+                return ResourceManager.GetString("AnalysisCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Compiles a stemmer table 
for the Egothor stemmer..
+        /// </summary>
+        public static string AnalysisStempelCompileStemsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelCompileStemsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The path to a file 
containing a stemmer table. Multiple values are allowed..
+        /// </summary>
+        public static string 
AnalysisStempelCompileStemsCommandStemmerTableFilesDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelCompileStemsCommandStemmerTableFilesDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The encoding to use for 
the stemmer table files..
+        /// </summary>
+        public static string 
AnalysisStempelCompileStemsCommandStemmerTableFilesEncodingDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelCompileStemsCommandStemmerTableFilesEncodingDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The name of the desired 
stemming algorithm to use..
+        /// </summary>
+        public static string 
AnalysisStempelCompileStemsCommandStemmingAlgorithmDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelCompileStemsCommandStemmingAlgorithmDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Generates patch commands 
from an already prepared stemmer table..
+        /// </summary>
+        public static string AnalysisStempelPatchStemsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelPatchStemsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The path to a file 
containing a stemmer table. Multiple values are allowed..
+        /// </summary>
+        public static string 
AnalysisStempelPatchStemsCommandStemmerTableFilesDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelPatchStemsCommandStemmerTableFilesDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The encoding to use for 
the stemmer table files..
+        /// </summary>
+        public static string 
AnalysisStempelPatchStemsCommandStemmerTableFilesEncodingDescription {
+            get {
+                return 
ResourceManager.GetString("AnalysisStempelPatchStemsCommandStemmerTableFilesEncodingDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Cross check term 
vectors..
+        /// </summary>
+        public static string CrossCheckTermVectorsDescription {
+            get {
+                return 
ResourceManager.GetString("CrossCheckTermVectorsDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Shows example usage of 
category associations..
+        /// </summary>
+        public static string DemoAssociationsFacetsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoAssociationsFacetsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Demos for various 
Lucene.Net functionality including C# code samples..
+        /// </summary>
+        public static string DemoCommandDescription {
+            get {
+                return ResourceManager.GetString("DemoCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Shows simple usage of 
dynamic range faceting, using the expressions module to calculate distance..
+        /// </summary>
+        public static string DemoDistanceFacetsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoDistanceFacetsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Shows facets aggregation 
by an expression..
+        /// </summary>
+        public static string DemoExpressionAggregationFacetsCommandDescription 
{
+            get {
+                return 
ResourceManager.GetString("DemoExpressionAggregationFacetsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Index all text files 
under a directory..
+        /// </summary>
+        public static string DemoIndexFilesCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoIndexFilesCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to This demo can be used to 
learn how to build a Lucene.Net index. After the index is built, you can run 
the search-files demo to run queries against it..
+        /// </summary>
+        public static string DemoIndexFilesCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("DemoIndexFilesCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The source directory 
containing files to index. This operation is recursive..
+        /// </summary>
+        public static string DemoIndexFilesCommandSourceDirectoryDescription {
+            get {
+                return 
ResourceManager.GetString("DemoIndexFilesCommandSourceDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Adds new documents to an 
existing index. If not supplied, any existing index in the 
&lt;INDEX_DIRECTORY&gt; will be overwritten..
+        /// </summary>
+        public static string DemoIndexFilesCommandUpdateDescription {
+            get {
+                return 
ResourceManager.GetString("DemoIndexFilesCommandUpdateDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Demonstrates indexing 
categories into different indexed fields..
+        /// </summary>
+        public static string DemoMultiCategoryListsFacetsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoMultiCategoryListsFacetsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Shows simple usage of 
dynamic range faceting..
+        /// </summary>
+        public static string DemoRangeFacetsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoRangeFacetsCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Simple command-line 
based search demo. Run index-files demo first..
+        /// </summary>
+        public static string DemoSearchFilesCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Run the index-files demo 
first to create an index to run this command against. You can either use a file 
containing many queries, a single query on the command line, or omit both 
options to run queries interactively..
+        /// </summary>
+        public static string DemoSearchFilesCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The index field to use 
in the search..
+        /// </summary>
+        public static string DemoSearchFilesCommandFieldDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandFieldDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Hits per page to 
display..
+        /// </summary>
+        public static string DemoSearchFilesCommandPageSizeDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandPageSizeDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to A file containing the 
queries to perform..
+        /// </summary>
+        public static string DemoSearchFilesCommandQueriesFileDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandQueriesFileDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to A query to perform..
+        /// </summary>
+        public static string DemoSearchFilesCommandQueryDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandQueryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Output raw format..
+        /// </summary>
+        public static string DemoSearchFilesCommandRawDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandRawDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Repeat the search and 
time as a benchmark..
+        /// </summary>
+        public static string DemoSearchFilesCommandRepeatDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSearchFilesCommandRepeatDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Shows simple usage of 
faceted indexing and search..
+        /// </summary>
+        public static string DemoSimpleFacetsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSimpleFacetsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Shows simple usage of 
faceted indexing and search using SortedSetDocValuesFacetField and 
SortedSetDocValuesFacetCounts..
+        /// </summary>
+        public static string DemoSimpleSortedSetFacetsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("DemoSimpleSortedSetFacetsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The FSDirectory 
implementation to use. Defaults to the optimal FSDirectory for your OS 
platform..
+        /// </summary>
+        public static string DirectoryTypeOptionDescription {
+            get {
+                return 
ResourceManager.GetString("DirectoryTypeOptionDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Source code exported to 
&apos;{0}&apos;..
+        /// </summary>
+        public static string ExportingSourceCodeCompleteMessage {
+            get {
+                return 
ResourceManager.GetString("ExportingSourceCodeCompleteMessage", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Exporting source code....
+        /// </summary>
+        public static string ExportingSourceCodeMessage {
+            get {
+                return ResourceManager.GetString("ExportingSourceCodeMessage", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to An error occurred:.
+        /// </summary>
+        public static string GeneralExceptionMessage {
+            get {
+                return ResourceManager.GetString("GeneralExceptionMessage", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Specify --help for a 
list of available options and commands..
+        /// </summary>
+        public static string HelpCommandsMessage {
+            get {
+                return ResourceManager.GetString("HelpCommandsMessage", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Checks an index for 
problematic segments..
+        /// </summary>
+        public static string IndexCheckCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexCheckCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Only check the specified 
segment(s). This can be specified multiple times, to check more than one 
segment, eg --segment _2 --segment _a..
+        /// </summary>
+        public static string IndexCheckCommandSegmentsDescription {
+            get {
+                return 
ResourceManager.GetString("IndexCheckCommandSegmentsDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Utilities to analyze or 
maintain an index..
+        /// </summary>
+        public static string IndexCommandDescription {
+            get {
+                return ResourceManager.GetString("IndexCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Copies segments from one 
index to another index..
+        /// </summary>
+        public static string IndexCopySegmentsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexCopySegmentsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to This tool does 
file-level copying of segments files. This means it&apos;s unable to split 
apart a single segment into multiple segments. For example if your index is a 
single segment, this tool won&apos;t help. Also, it does basic file-level 
copying (using a simple FileStream) so it will not work with non FSDirectory 
Directory implementations..
+        /// </summary>
+        public static string IndexCopySegmentsCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexCopySegmentsCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The directory of the 
index to copy..
+        /// </summary>
+        public static string IndexCopySegmentsCommandInputDirectoryDescription 
{
+            get {
+                return 
ResourceManager.GetString("IndexCopySegmentsCommandInputDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The directory of the 
destination index..
+        /// </summary>
+        public static string 
IndexCopySegmentsCommandOutputDirectoryDescription {
+            get {
+                return 
ResourceManager.GetString("IndexCopySegmentsCommandOutputDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The segments to copy, 
separated by a space..
+        /// </summary>
+        public static string IndexCopySegmentsCommandSegmentsDescription {
+            get {
+                return 
ResourceManager.GetString("IndexCopySegmentsCommandSegmentsDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Deletes segments from an 
index..
+        /// </summary>
+        public static string IndexDeleteSegmentsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexDeleteSegmentsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to You can easily 
accidentally remove segments from your index so be careful! Always make a 
backup of your index first..
+        /// </summary>
+        public static string IndexDeleteSegmentsCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexDeleteSegmentsCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The segments to delete, 
separated by a space..
+        /// </summary>
+        public static string IndexDeleteSegmentsCommandSegmentsDescription {
+            get {
+                return 
ResourceManager.GetString("IndexDeleteSegmentsCommandSegmentsDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The directory of the 
index..
+        /// </summary>
+        public static string IndexDirectoryArgumentDescription {
+            get {
+                return 
ResourceManager.GetString("IndexDirectoryArgumentDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to If omitted, it defaults 
to the current working directory..
+        /// </summary>
+        public static string IndexDirectoryOptionalArgumentDescription {
+            get {
+                return 
ResourceManager.GetString("IndexDirectoryOptionalArgumentDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The .cfs file containing 
words to parse..
+        /// </summary>
+        public static string IndexExtractCfsCommandCFSFileNameDescription {
+            get {
+                return 
ResourceManager.GetString("IndexExtractCfsCommandCFSFileNameDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Lists sub-files from a 
.cfs compound file..
+        /// </summary>
+        public static string IndexExtractCfsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexExtractCfsCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The .cfs compound file 
format is created using the CompoundFileDirectory from Lucene.Net.Misc..
+        /// </summary>
+        public static string IndexExtractCfsCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexExtractCfsCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Fixes an index with 
problematic segments..
+        /// </summary>
+        public static string IndexFixCommandDescription {
+            get {
+                return ResourceManager.GetString("IndexFixCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The .cfs file containing 
words to parse..
+        /// </summary>
+        public static string IndexListCfsCommandCFSFileNameDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListCfsCommandCFSFileNameDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Extracts sub-files out 
of a .cfs compound file..
+        /// </summary>
+        public static string IndexListCfsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListCfsCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The .cfs compound file 
format is created using the CompoundFileDirectory from Lucene.Net.Misc..
+        /// </summary>
+        public static string IndexListCfsCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexListCfsCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Extracts the top n most 
frequent terms by document frequency..
+        /// </summary>
+        public static string IndexListHighFreqTermsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListHighFreqTermsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Extracts the top n most 
frequent terms (by document frequency) from an index and reports thier document 
frequency..
+        /// </summary>
+        public static string IndexListHighFreqTermsCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexListHighFreqTermsCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The field to consider. 
If omitted, considers all fields..
+        /// </summary>
+        public static string IndexListHighFreqTermsCommandFieldDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListHighFreqTermsCommandFieldDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The number of terms to 
consider. If omitted, defaults to 100..
+        /// </summary>
+        public static string 
IndexListHighFreqTermsCommandNumberOfTermsDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListHighFreqTermsCommandNumberOfTermsDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Specifies that both the 
document frequency &amp; term frequency are reported, ordered by descending 
total term frequency..
+        /// </summary>
+        public static string 
IndexListHighFreqTermsCommandTotalTermFrequencyDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListHighFreqTermsCommandTotalTermFrequencyDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Lists segments in an 
index..
+        /// </summary>
+        public static string IndexListSegmentsCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListSegmentsCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Displays the taxonomy 
statistical information for a taxonomy index..
+        /// </summary>
+        public static string IndexListTaxonomyStatsDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListTaxonomyStatsDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Recursively lists all 
descendent nodes..
+        /// </summary>
+        public static string IndexListTaxonomyStatsShowTreeDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListTaxonomyStatsShowTreeDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Gets document frequency 
and total number of occurrences of a term..
+        /// </summary>
+        public static string IndexListTermInfoCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListTermInfoCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Gets document frequency 
and total number of occurrences (sum of the term frequency for each document) 
of a term..
+        /// </summary>
+        public static string IndexListTermInfoCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexListTermInfoCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The field to consider..
+        /// </summary>
+        public static string IndexListTermInfoCommandFieldDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListTermInfoCommandFieldDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The directory of the 
index..
+        /// </summary>
+        public static string IndexListTermInfoCommandIndexDirectoryDescription 
{
+            get {
+                return 
ResourceManager.GetString("IndexListTermInfoCommandIndexDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The term to consider..
+        /// </summary>
+        public static string IndexListTermInfoCommandTermDescription {
+            get {
+                return 
ResourceManager.GetString("IndexListTermInfoCommandTermDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Merges multiple indexes 
into a single index..
+        /// </summary>
+        public static string IndexMergeCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexMergeCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Two or more source index 
directories separated by a space..
+        /// </summary>
+        public static string IndexMergeCommandInputDirectoryDescription {
+            get {
+                return 
ResourceManager.GetString("IndexMergeCommandInputDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Output directory to 
merge the indexes into..
+        /// </summary>
+        public static string IndexMergeCommandOutputDirectoryDescription {
+            get {
+                return 
ResourceManager.GetString("IndexMergeCommandOutputDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Splits an index into 
multiple parts..
+        /// </summary>
+        public static string IndexSplitCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexSplitCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Path to input index. 
Multiple values can be provided separated by a space..
+        /// </summary>
+        public static string IndexSplitCommandInputDirectoryDescription {
+            get {
+                return 
ResourceManager.GetString("IndexSplitCommandInputDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The number of parts to 
produce..
+        /// </summary>
+        public static string IndexSplitCommandNumberOfPartsDescription {
+            get {
+                return 
ResourceManager.GetString("IndexSplitCommandNumberOfPartsDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Path to output directory 
to contain partial indexes..
+        /// </summary>
+        public static string IndexSplitCommandOutputDirectoryDescription {
+            get {
+                return 
ResourceManager.GetString("IndexSplitCommandOutputDirectoryDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Sequential docid-range 
split..
+        /// </summary>
+        public static string IndexSplitCommandSequentialDescription {
+            get {
+                return 
ResourceManager.GetString("IndexSplitCommandSequentialDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Deletes prior commits..
+        /// </summary>
+        public static string IndexUpgradeCommandDeleteDescription {
+            get {
+                return 
ResourceManager.GetString("IndexUpgradeCommandDeleteDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Upgrades all segments of 
an index from previous Lucene.Net versions to the current segment file format..
+        /// </summary>
+        public static string IndexUpgradeCommandDescription {
+            get {
+                return 
ResourceManager.GetString("IndexUpgradeCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to  This tool keeps only 
the last commit in an index; for this reason, if the incoming index has more 
than one commit, the tool refuses to run by default. Specify 
--delete-prior-commits to override this, allowing the tool to delete all but 
the last commit. Specify an FSDirectory implementation through the 
--directory-type option to force its use. If not qualified by an AssemblyName, 
the Lucene.Net.dll assembly will be used. WARNING: This tool may reorder 
document IDs! Also, ensure you are using the correct vers [rest of string was 
truncated]&quot;;.
+        /// </summary>
+        public static string IndexUpgradeCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("IndexUpgradeCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Utilities for verifying 
concurrent locking integrity..
+        /// </summary>
+        public static string LockCommandDescription {
+            get {
+                return ResourceManager.GetString("LockCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Number of locking tries..
+        /// </summary>
+        public static string LockStressTestCommandCountDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandCountDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Simple standalone tool 
that forever acquires &amp; releases a lock using a specific LockFactory..
+        /// </summary>
+        public static string LockStressTestCommandDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to You should run multiple 
instances of this process, each with its own unique ID, and each pointing to 
the same lock directory, to verify that locking is working correctly. Make sure 
you are first running LockVerifyServer..
+        /// </summary>
+        public static string LockStressTestCommandExtendedHelpText {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandExtendedHelpText", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to int value from 0 .. 255 
(should be unique for test process)..
+        /// </summary>
+        public static string LockStressTestCommandIDDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandIDDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Path to the lock 
directory (only set for Simple/NativeFSLockFactory)..
+        /// </summary>
+        public static string LockStressTestCommandLockFactoryNameDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandLockFactoryNameDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Primary LockFactory 
class that we will use..
+        /// </summary>
+        public static string 
LockStressTestCommandLockFactoryTypeNameDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandLockFactoryTypeNameDescription",
 resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Milliseconds to pause 
betweeen each lock obtain/release..
+        /// </summary>
+        public static string LockStressTestCommandSleepTimeMSDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandSleepTimeMSDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Port that 
LockVerifyServer is listening on..
+        /// </summary>
+        public static string LockStressTestCommandVerfierPortDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandVerfierPortDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Hostname that 
LockVerifyServer is listening on..
+        /// </summary>
+        public static string LockStressTestCommandVerifierHostDescription {
+            get {
+                return 
ResourceManager.GetString("LockStressTestCommandVerifierHostDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Simple standalone server 
that must be running when you use VerifyingLockFactory. This server verifies at 
most one process holds the lock at a time..
+        /// </summary>
+        public static string LockVerifyServerCommandDescription {
+            get {
+                return 
ResourceManager.GetString("LockVerifyServerCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Hostname or IP address 
that LockVerifyServer will listen on..
+        /// </summary>
+        public static string LockVerifyServerCommandIPHostnameDescription {
+            get {
+                return 
ResourceManager.GetString("LockVerifyServerCommandIPHostnameDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to The maximum number of 
concurrent clients..
+        /// </summary>
+        public static string LockVerifyServerCommandMaxClientsDescription {
+            get {
+                return 
ResourceManager.GetString("LockVerifyServerCommandMaxClientsDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to {0} arguments are 
required..
+        /// </summary>
+        public static string NotEnoughArguments {
+            get {
+                return ResourceManager.GetString("NotEnoughArguments", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Output the source code 
of the demo to the specified directory..
+        /// </summary>
+        public static string OutputSourceCodeDescription {
+            get {
+                return 
ResourceManager.GetString("OutputSourceCodeDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Run &apos;demo {0} 
--view-source-code&apos; to see the C# code or &apos;demo {0} 
--output-source-code &lt;DIRECTORY&gt;&apos; to export the code to a local 
directory..
+        /// </summary>
+        public static string OutputSourceCodeMessage {
+            get {
+                return ResourceManager.GetString("OutputSourceCodeMessage", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Utilities and demos for 
Lucene.Net..
+        /// </summary>
+        public static string RootCommandDescription {
+            get {
+                return ResourceManager.GetString("RootCommandDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to One or more segments, 
separated by a space..
+        /// </summary>
+        public static string SegmentsArgumentDescription {
+            get {
+                return 
ResourceManager.GetString("SegmentsArgumentDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to An index segment..
+        /// </summary>
+        public static string SegmentsOptionDescription {
+            get {
+                return ResourceManager.GetString("SegmentsOptionDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Multiple segments are 
allowed..
+        /// </summary>
+        public static string SegmentsOptionMultipleDescription {
+            get {
+                return 
ResourceManager.GetString("SegmentsOptionMultipleDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to Verbose output..
+        /// </summary>
+        public static string VerboseOptionDescription {
+            get {
+                return ResourceManager.GetString("VerboseOptionDescription", 
resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    Looks up a localized string similar to View the source code of 
the demo..
+        /// </summary>
+        public static string ViewSourceCodeDescription {
+            get {
+                return ResourceManager.GetString("ViewSourceCodeDescription", 
resourceCulture);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/9e389540/src/tools/lucene-cli/Resources/Strings.resx
----------------------------------------------------------------------
diff --git a/src/tools/lucene-cli/Resources/Strings.resx 
b/src/tools/lucene-cli/Resources/Strings.resx
new file mode 100644
index 0000000..3634369
--- /dev/null
+++ b/src/tools/lucene-cli/Resources/Strings.resx
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, 
System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, 
System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a 
comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" 
mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" 
mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of 
the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"; />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <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" use="required" 
msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" 
/>
+              <xsd:attribute name="mimetype" type="xsd:string" 
msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </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>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="AnalysisCommandDescription" xml:space="preserve">
+    <value>Utilities to manage specialized analyzers.</value>
+  </data>
+  <data name="AnalysisStempelCompileStemsCommandDescription" 
xml:space="preserve">
+    <value>Compiles a stemmer table for the Egothor stemmer.</value>
+  </data>
+  <data name="AnalysisStempelCompileStemsCommandStemmerTableFilesDescription" 
xml:space="preserve">
+    <value>The path to a file containing a stemmer table. Multiple values are 
allowed.</value>
+  </data>
+  <data 
name="AnalysisStempelCompileStemsCommandStemmerTableFilesEncodingDescription" 
xml:space="preserve">
+    <value>The encoding to use for the stemmer table files.</value>
+  </data>
+  <data name="AnalysisStempelCompileStemsCommandStemmingAlgorithmDescription" 
xml:space="preserve">
+    <value>The name of the desired stemming algorithm to use.</value>
+  </data>
+  <data name="AnalysisStempelPatchStemsCommandDescription" 
xml:space="preserve">
+    <value>Generates patch commands from an already prepared stemmer 
table.</value>
+  </data>
+  <data name="AnalysisStempelPatchStemsCommandStemmerTableFilesDescription" 
xml:space="preserve">
+    <value>The path to a file containing a stemmer table. Multiple values are 
allowed.</value>
+  </data>
+  <data 
name="AnalysisStempelPatchStemsCommandStemmerTableFilesEncodingDescription" 
xml:space="preserve">
+    <value>The encoding to use for the stemmer table files.</value>
+  </data>
+  <data name="CrossCheckTermVectorsDescription" xml:space="preserve">
+    <value>Cross check term vectors.</value>
+  </data>
+  <data name="DemoAssociationsFacetsCommandDescription" xml:space="preserve">
+    <value>Shows example usage of category associations.</value>
+  </data>
+  <data name="DemoCommandDescription" xml:space="preserve">
+    <value>Demos for various Lucene.Net functionality including C# code 
samples.</value>
+  </data>
+  <data name="DemoDistanceFacetsCommandDescription" xml:space="preserve">
+    <value>Shows simple usage of dynamic range faceting, using the expressions 
module to calculate distance.</value>
+  </data>
+  <data name="DemoExpressionAggregationFacetsCommandDescription" 
xml:space="preserve">
+    <value>Shows facets aggregation by an expression.</value>
+  </data>
+  <data name="DemoIndexFilesCommandDescription" xml:space="preserve">
+    <value>Index all text files under a directory.</value>
+  </data>
+  <data name="DemoIndexFilesCommandExtendedHelpText" xml:space="preserve">
+    <value>This demo can be used to learn how to build a Lucene.Net index. 
After the index is built, you can run the search-files demo to run queries 
against it.</value>
+  </data>
+  <data name="DemoIndexFilesCommandSourceDirectoryDescription" 
xml:space="preserve">
+    <value>The source directory containing files to index. This operation is 
recursive.</value>
+  </data>
+  <data name="DemoIndexFilesCommandUpdateDescription" xml:space="preserve">
+    <value>Adds new documents to an existing index. If not supplied, any 
existing index in the &lt;INDEX_DIRECTORY&gt; will be overwritten.</value>
+  </data>
+  <data name="DemoMultiCategoryListsFacetsCommandDescription" 
xml:space="preserve">
+    <value>Demonstrates indexing categories into different indexed 
fields.</value>
+  </data>
+  <data name="DemoRangeFacetsCommandDescription" xml:space="preserve">
+    <value>Shows simple usage of dynamic range faceting.</value>
+  </data>
+  <data name="DemoSearchFilesCommandDescription" xml:space="preserve">
+    <value>Simple command-line based search demo. Run index-files demo 
first.</value>
+  </data>
+  <data name="DemoSearchFilesCommandExtendedHelpText" xml:space="preserve">
+    <value>Run the index-files demo first to create an index to run this 
command against. You can either use a file containing many queries, a single 
query on the command line, or omit both options to run queries 
interactively.</value>
+  </data>
+  <data name="DemoSearchFilesCommandFieldDescription" xml:space="preserve">
+    <value>The index field to use in the search.</value>
+  </data>
+  <data name="DemoSearchFilesCommandPageSizeDescription" xml:space="preserve">
+    <value>Hits per page to display.</value>
+  </data>
+  <data name="DemoSearchFilesCommandQueriesFileDescription" 
xml:space="preserve">
+    <value>A file containing the queries to perform.</value>
+  </data>
+  <data name="DemoSearchFilesCommandQueryDescription" xml:space="preserve">
+    <value>A query to perform.</value>
+  </data>
+  <data name="DemoSearchFilesCommandRawDescription" xml:space="preserve">
+    <value>Output raw format.</value>
+  </data>
+  <data name="DemoSearchFilesCommandRepeatDescription" xml:space="preserve">
+    <value>Repeat the search and time as a benchmark.</value>
+  </data>
+  <data name="DemoSimpleFacetsCommandDescription" xml:space="preserve">
+    <value>Shows simple usage of faceted indexing and search.</value>
+  </data>
+  <data name="DemoSimpleSortedSetFacetsCommandDescription" 
xml:space="preserve">
+    <value>Shows simple usage of faceted indexing and search using 
SortedSetDocValuesFacetField and SortedSetDocValuesFacetCounts.</value>
+  </data>
+  <data name="DirectoryTypeOptionDescription" xml:space="preserve">
+    <value>The FSDirectory implementation to use. Defaults to the optimal 
FSDirectory for your OS platform.</value>
+  </data>
+  <data name="ExportingSourceCodeCompleteMessage" xml:space="preserve">
+    <value>Source code exported to '{0}'.</value>
+  </data>
+  <data name="ExportingSourceCodeMessage" xml:space="preserve">
+    <value>Exporting source code...</value>
+  </data>
+  <data name="GeneralExceptionMessage" xml:space="preserve">
+    <value>An error occurred:</value>
+  </data>
+  <data name="HelpCommandsMessage" xml:space="preserve">
+    <value>Specify --help for a list of available options and commands.</value>
+  </data>
+  <data name="IndexCheckCommandDescription" xml:space="preserve">
+    <value>Checks an index for problematic segments.</value>
+  </data>
+  <data name="IndexCheckCommandSegmentsDescription" xml:space="preserve">
+    <value>Only check the specified segment(s). This can be specified multiple 
times, to check more than one segment, eg --segment _2 --segment _a.</value>
+  </data>
+  <data name="IndexCommandDescription" xml:space="preserve">
+    <value>Utilities to analyze or maintain an index.</value>
+  </data>
+  <data name="IndexCopySegmentsCommandDescription" xml:space="preserve">
+    <value>Copies segments from one index to another index.</value>
+  </data>
+  <data name="IndexCopySegmentsCommandExtendedHelpText" xml:space="preserve">
+    <value>This tool does file-level copying of segments files. This means 
it's unable to split apart a single segment into multiple segments. For example 
if your index is a single segment, this tool won't help. Also, it does basic 
file-level copying (using a simple FileStream) so it will not work with non 
FSDirectory Directory implementations.</value>
+  </data>
+  <data name="IndexCopySegmentsCommandInputDirectoryDescription" 
xml:space="preserve">
+    <value>The directory of the index to copy.</value>
+  </data>
+  <data name="IndexCopySegmentsCommandOutputDirectoryDescription" 
xml:space="preserve">
+    <value>The directory of the destination index.</value>
+  </data>
+  <data name="IndexCopySegmentsCommandSegmentsDescription" 
xml:space="preserve">
+    <value>The segments to copy, separated by a space.</value>
+  </data>
+  <data name="IndexDeleteSegmentsCommandDescription" xml:space="preserve">
+    <value>Deletes segments from an index.</value>
+  </data>
+  <data name="IndexDeleteSegmentsCommandExtendedHelpText" xml:space="preserve">
+    <value>You can easily accidentally remove segments from your index so be 
careful! Always make a backup of your index first.</value>
+  </data>
+  <data name="IndexDeleteSegmentsCommandSegmentsDescription" 
xml:space="preserve">
+    <value>The segments to delete, separated by a space.</value>
+  </data>
+  <data name="IndexDirectoryArgumentDescription" xml:space="preserve">
+    <value>The directory of the index.</value>
+  </data>
+  <data name="IndexDirectoryOptionalArgumentDescription" xml:space="preserve">
+    <value>If omitted, it defaults to the current working directory.</value>
+  </data>
+  <data name="IndexExtractCfsCommandCFSFileNameDescription" 
xml:space="preserve">
+    <value>The .cfs file containing words to parse.</value>
+  </data>
+  <data name="IndexExtractCfsCommandDescription" xml:space="preserve">
+    <value>Lists sub-files from a .cfs compound file.</value>
+  </data>
+  <data name="IndexExtractCfsCommandExtendedHelpText" xml:space="preserve">
+    <value>The .cfs compound file format is created using the 
CompoundFileDirectory from Lucene.Net.Misc.</value>
+  </data>
+  <data name="IndexFixCommandDescription" xml:space="preserve">
+    <value>Fixes an index with problematic segments.</value>
+  </data>
+  <data name="IndexListCfsCommandCFSFileNameDescription" xml:space="preserve">
+    <value>The .cfs file containing words to parse.</value>
+  </data>
+  <data name="IndexListCfsCommandDescription" xml:space="preserve">
+    <value>Extracts sub-files out of a .cfs compound file.</value>
+  </data>
+  <data name="IndexListCfsCommandExtendedHelpText" xml:space="preserve">
+    <value>The .cfs compound file format is created using the 
CompoundFileDirectory from Lucene.Net.Misc.</value>
+  </data>
+  <data name="IndexListHighFreqTermsCommandDescription" xml:space="preserve">
+    <value>Extracts the top n most frequent terms by document 
frequency.</value>
+  </data>
+  <data name="IndexListHighFreqTermsCommandExtendedHelpText" 
xml:space="preserve">
+    <value>Extracts the top n most frequent terms (by document frequency) from 
an index and reports thier document frequency.</value>
+  </data>
+  <data name="IndexListHighFreqTermsCommandFieldDescription" 
xml:space="preserve">
+    <value>The field to consider. If omitted, considers all fields.</value>
+  </data>
+  <data name="IndexListHighFreqTermsCommandNumberOfTermsDescription" 
xml:space="preserve">
+    <value>The number of terms to consider. If omitted, defaults to 
100.</value>
+  </data>
+  <data name="IndexListHighFreqTermsCommandTotalTermFrequencyDescription" 
xml:space="preserve">
+    <value>Specifies that both the document frequency &amp; term frequency are 
reported, ordered by descending total term frequency.</value>
+  </data>
+  <data name="IndexListSegmentsCommandDescription" xml:space="preserve">
+    <value>Lists segments in an index.</value>
+  </data>
+  <data name="IndexListTaxonomyStatsDescription" xml:space="preserve">
+    <value>Displays the taxonomy statistical information for a taxonomy 
index.</value>
+  </data>
+  <data name="IndexListTaxonomyStatsShowTreeDescription" xml:space="preserve">
+    <value>Recursively lists all descendent nodes.</value>
+  </data>
+  <data name="IndexListTermInfoCommandDescription" xml:space="preserve">
+    <value>Gets document frequency and total number of occurrences of a 
term.</value>
+  </data>
+  <data name="IndexListTermInfoCommandExtendedHelpText" xml:space="preserve">
+    <value>Gets document frequency and total number of occurrences (sum of the 
term frequency for each document) of a term.</value>
+  </data>
+  <data name="IndexListTermInfoCommandFieldDescription" xml:space="preserve">
+    <value>The field to consider.</value>
+  </data>
+  <data name="IndexListTermInfoCommandIndexDirectoryDescription" 
xml:space="preserve">
+    <value>The directory of the index.</value>
+  </data>
+  <data name="IndexListTermInfoCommandTermDescription" xml:space="preserve">
+    <value>The term to consider.</value>
+  </data>
+  <data name="IndexMergeCommandDescription" xml:space="preserve">
+    <value>Merges multiple indexes into a single index.</value>
+  </data>
+  <data name="IndexMergeCommandInputDirectoryDescription" xml:space="preserve">
+    <value>Two or more source index directories separated by a space.</value>
+  </data>
+  <data name="IndexMergeCommandOutputDirectoryDescription" 
xml:space="preserve">
+    <value>Output directory to merge the indexes into.</value>
+  </data>
+  <data name="IndexSplitCommandDescription" xml:space="preserve">
+    <value>Splits an index into multiple parts.</value>
+  </data>
+  <data name="IndexSplitCommandInputDirectoryDescription" xml:space="preserve">
+    <value>Path to input index. Multiple values can be provided separated by a 
space.</value>
+  </data>
+  <data name="IndexSplitCommandNumberOfPartsDescription" xml:space="preserve">
+    <value>The number of parts to produce.</value>
+  </data>
+  <data name="IndexSplitCommandOutputDirectoryDescription" 
xml:space="preserve">
+    <value>Path to output directory to contain partial indexes.</value>
+  </data>
+  <data name="IndexSplitCommandSequentialDescription" xml:space="preserve">
+    <value>Sequential docid-range split.</value>
+  </data>
+  <data name="IndexUpgradeCommandDeleteDescription" xml:space="preserve">
+    <value>Deletes prior commits.</value>
+  </data>
+  <data name="IndexUpgradeCommandDescription" xml:space="preserve">
+    <value>Upgrades all segments of an index from previous Lucene.Net versions 
to the current segment file format.</value>
+  </data>
+  <data name="IndexUpgradeCommandExtendedHelpText" xml:space="preserve">
+    <value>This tool keeps only the last commit in an index; for this reason, 
if the incoming index has more than one commit, the tool refuses to run by 
default. Specify --delete-prior-commits to override this, allowing the tool to 
delete all but the last commit. Specify an FSDirectory implementation through 
the --directory-type option to force its use. If not qualified by an 
AssemblyName, the Lucene.Net.dll assembly will be used. WARNING: This tool may 
reorder document IDs! Also, ensure you are using the correct version of this 
utility to match your application's version of Lucene.Net.</value>
+  </data>
+  <data name="LockCommandDescription" xml:space="preserve">
+    <value>Utilities for verifying concurrent locking integrity.</value>
+  </data>
+  <data name="LockStressTestCommandCountDescription" xml:space="preserve">
+    <value>Number of locking tries.</value>
+  </data>
+  <data name="LockStressTestCommandDescription" xml:space="preserve">
+    <value>Simple standalone tool that forever acquires &amp; releases a lock 
using a specific LockFactory.</value>
+  </data>
+  <data name="LockStressTestCommandExtendedHelpText" xml:space="preserve">
+    <value>You should run multiple instances of this process, each with its 
own unique ID, and each pointing to the same lock directory, to verify that 
locking is working correctly. Make sure you are first running 
LockVerifyServer.</value>
+  </data>
+  <data name="LockStressTestCommandIDDescription" xml:space="preserve">
+    <value>int value from 0 .. 255 (should be unique for test process).</value>
+  </data>
+  <data name="LockStressTestCommandLockFactoryNameDescription" 
xml:space="preserve">
+    <value>Path to the lock directory (only set for 
Simple/NativeFSLockFactory).</value>
+  </data>
+  <data name="LockStressTestCommandLockFactoryTypeNameDescription" 
xml:space="preserve">
+    <value>Primary LockFactory class that we will use.</value>
+  </data>
+  <data name="LockStressTestCommandSleepTimeMSDescription" 
xml:space="preserve">
+    <value>Milliseconds to pause betweeen each lock obtain/release.</value>
+  </data>
+  <data name="LockStressTestCommandVerfierPortDescription" 
xml:space="preserve">
+    <value>Port that LockVerifyServer is listening on.</value>
+  </data>
+  <data name="LockStressTestCommandVerifierHostDescription" 
xml:space="preserve">
+    <value>Hostname that LockVerifyServer is listening on.</value>
+  </data>
+  <data name="LockVerifyServerCommandDescription" xml:space="preserve">
+    <value>Simple standalone server that must be running when you use 
VerifyingLockFactory. This server verifies at most one process holds the lock 
at a time.</value>
+  </data>
+  <data name="LockVerifyServerCommandIPHostnameDescription" 
xml:space="preserve">
+    <value>Hostname or IP address that LockVerifyServer will listen on.</value>
+  </data>
+  <data name="LockVerifyServerCommandMaxClientsDescription" 
xml:space="preserve">
+    <value>The maximum number of concurrent clients.</value>
+  </data>
+  <data name="NotEnoughArguments" xml:space="preserve">
+    <value>{0} arguments are required.</value>
+  </data>
+  <data name="OutputSourceCodeDescription" xml:space="preserve">
+    <value>Output the source code of the demo to the specified 
directory.</value>
+  </data>
+  <data name="OutputSourceCodeMessage" xml:space="preserve">
+    <value>Run 'demo {0} --view-source-code' to see the C# code or 'demo {0} 
--output-source-code &lt;DIRECTORY&gt;' to export the code to a local 
directory.</value>
+  </data>
+  <data name="RootCommandDescription" xml:space="preserve">
+    <value>Utilities and demos for Lucene.Net.</value>
+  </data>
+  <data name="SegmentsArgumentDescription" xml:space="preserve">
+    <value>One or more segments, separated by a space.</value>
+  </data>
+  <data name="SegmentsOptionDescription" xml:space="preserve">
+    <value>An index segment.</value>
+  </data>
+  <data name="SegmentsOptionMultipleDescription" xml:space="preserve">
+    <value>Multiple segments are allowed.</value>
+  </data>
+  <data name="VerboseOptionDescription" xml:space="preserve">
+    <value>Verbose output.</value>
+  </data>
+  <data name="ViewSourceCodeDescription" xml:space="preserve">
+    <value>View the source code of the demo.</value>
+  </data>
+</root>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/9e389540/src/tools/lucene-cli/SourceCode/ConsolePager.cs
----------------------------------------------------------------------
diff --git a/src/tools/lucene-cli/SourceCode/ConsolePager.cs 
b/src/tools/lucene-cli/SourceCode/ConsolePager.cs
new file mode 100644
index 0000000..101935f
--- /dev/null
+++ b/src/tools/lucene-cli/SourceCode/ConsolePager.cs
@@ -0,0 +1,198 @@
+using Lucene.Net.Support;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+
+namespace Lucene.Net.Cli.SourceCode
+{
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    /// <summary>
+    /// Interactively pages or scrolls through the list of files provided in
+    /// the constructor.
+    /// <para/>
+    /// <b>Commands</b>:
+    /// <list type="table">
+    ///     <listheader>
+    ///         <term>Keys</term>
+    ///         <description>Description</description>
+    ///     </listheader>
+    ///     <item>
+    ///         <term><c>n</c> or Space</term>
+    ///         <description>Pages to the next full screen of 
text.</description>
+    ///     </item>
+    ///     <item>
+    ///         <term><c>q</c> or <c>x</c></term>
+    ///         <description>Exits the application.</description>
+    ///     </item>
+    ///     <item>
+    ///         <term>Enter</term>
+    ///         <description>
+    ///             Moves to the next line of text. Hold down
+    ///             the Enter key to scroll.
+    ///         </description>
+    ///     </item>
+    /// </list>
+    /// </summary>
+    public class ConsolePager : IDisposable
+    {
+        private readonly MultipleFileLineEnumerator enumerator;
+        private readonly IEnumerable<string> files;
+
+        public ConsolePager(IEnumerable<string> files)
+        {
+            if (files == null)
+                throw new ArgumentNullException("files");
+            this.enumerator = new MultipleFileLineEnumerator(files);
+        }
+
+        public TextWriter Out { get; set; } = Console.Out;
+        public TextReader In { get; set; } = Console.In;
+        public Func<int> GetWindowHeight { get; set; } = () => 
Console.WindowHeight;
+
+        public void Run()
+        {
+            try
+            {
+                Console.ForegroundColor = ConsoleColor.Yellow;
+                int take = GetWindowHeight();
+                int count = 0;
+                bool done = false;
+                do
+                {
+                    while (count++ < take)
+                    {
+                        done = !enumerator.MoveNext();
+                        if (done) break;
+                        Out.WriteLine(enumerator.Current);
+                    }
+                    count = 0; // Reset
+                    bool valid = false;
+                    while (!valid)
+                    {
+                        var keyInfo = Console.ReadKey(true);
+
+                        switch (keyInfo.KeyChar)
+                        {
+                            case 'q': // quit
+                            case 'x':
+                                done = valid = true;
+                                break;
+                            case 'n':
+                            case ' ':
+                                take = GetWindowHeight(); // Get next page
+                                valid = true;
+                                break;
+                            case (char)13: // ENTER
+                                take = 1; // Get a single line
+                                valid = true;
+                                break;
+                        }
+                    }
+                } while (!done);
+            }
+            finally
+            {
+                Console.ResetColor();
+            }
+        }
+
+        public void Dispose()
+        {
+            this.enumerator?.Dispose();
+        }
+
+        /// <summary>
+        /// Enumerates through a list of files (embedded resources)
+        /// as if they were one contiguous set of text.
+        /// </summary>
+        internal class MultipleFileLineEnumerator : IEnumerator<string>
+        {
+            private static Assembly thisAssembly = 
typeof(Program).GetTypeInfo().Assembly;
+
+            private readonly IEnumerator<string> fileEnumerator;
+            private TextReader currentFile;
+            private string line = null;
+
+            public MultipleFileLineEnumerator(IEnumerable<string> files)
+            {
+                if (files == null)
+                    throw new ArgumentNullException("files");
+                this.fileEnumerator = files.GetEnumerator();
+                NextFile();
+            }
+
+            private bool NextFile()
+            {
+
+                if (this.fileEnumerator.MoveNext())
+                {
+                    currentFile = new SourceCodeSectionReader(new StreamReader(
+                        
thisAssembly.FindAndGetManifestResourceStream(typeof(Program), 
this.fileEnumerator.Current), 
+                        SourceCodeSectionParser.ENCODING));
+                    return true;
+                }
+                return false;
+            }
+
+            public string Current
+            {
+                get
+                {
+                    return line;
+                }
+            }
+
+            object IEnumerator.Current
+            {
+                get
+                {
+                    return line;
+                }
+            }
+
+            public void Dispose()
+            {
+                this.fileEnumerator?.Dispose();
+                this.currentFile?.Dispose();
+            }
+
+            public bool MoveNext()
+            {
+                line = this.currentFile.ReadLine();
+                if (line == null)
+                {
+                    if (!NextFile())
+                    {
+                        return false;
+                    }
+
+                    line = this.currentFile.ReadLine();
+                }
+                return line != null;
+            }
+
+            public void Reset()
+            {
+                throw new NotSupportedException();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/9e389540/src/tools/lucene-cli/SourceCode/SourceCodeExporter.cs
----------------------------------------------------------------------
diff --git a/src/tools/lucene-cli/SourceCode/SourceCodeExporter.cs 
b/src/tools/lucene-cli/SourceCode/SourceCodeExporter.cs
new file mode 100644
index 0000000..483e7d8
--- /dev/null
+++ b/src/tools/lucene-cli/SourceCode/SourceCodeExporter.cs
@@ -0,0 +1,59 @@
+using Lucene.Net.Support;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+
+namespace Lucene.Net.Cli.SourceCode
+{
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    /// <summary>
+    /// Exports source code files from embedded resources and includes or
+    /// excludes any sections that are marked by comment tokens. See
+    /// <see cref="SourceCodeSectionReader"/> for for the supported tokens.
+    /// </summary>
+    public class SourceCodeExporter
+    {
+        protected SourceCodeSectionParser sectionParser = new 
SourceCodeSectionParser();
+
+        /// <summary>
+        /// Reads the provided source code <paramref name="files"/> from the 
+        /// embeded resources within this assembly
+        /// and writes them out to the <paramref name="outputPath"/>.
+        /// </summary>
+        /// <param name="files">An <see cref="IEnumerable{T}"/> of files to 
export.</param>
+        /// <param name="outputPath">A directory where the files will be 
exported.</param>
+        public void ExportSourceCodeFiles(IEnumerable<string> files, string 
outputPath)
+        {
+            if (!Directory.Exists(outputPath))
+            {
+                Directory.CreateDirectory(outputPath);
+            }
+            var thisAssembly = this.GetType().GetTypeInfo().Assembly;
+
+            foreach (var file in files)
+            {
+                using (var input = 
thisAssembly.FindAndGetManifestResourceStream(typeof(Program), file))
+                using (var output = new FileStream(Path.Combine(outputPath, 
file), FileMode.Create, FileAccess.Write))
+                {
+                    sectionParser.ParseSourceCodeFiles(input, output);
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/9e389540/src/tools/lucene-cli/SourceCode/SourceCodeSectionParser.cs
----------------------------------------------------------------------
diff --git a/src/tools/lucene-cli/SourceCode/SourceCodeSectionParser.cs 
b/src/tools/lucene-cli/SourceCode/SourceCodeSectionParser.cs
new file mode 100644
index 0000000..9d2abcfc
--- /dev/null
+++ b/src/tools/lucene-cli/SourceCode/SourceCodeSectionParser.cs
@@ -0,0 +1,100 @@
+using System.IO;
+using System.Text;
+
+namespace Lucene.Net.Cli.SourceCode
+{
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    /// <summary>
+    /// Idenitifies sections of code based on tokens to transform 
+    /// the output code to either contain extra code sections or
+    /// remove unwanted code sections.
+    /// <para/>
+    /// There are 5 different types of tokens considered:
+    /// <list type="table">
+    ///     <item>
+    ///         <term>// &lt;comment&gt;</term>
+    ///         <description>
+    ///             Beginning of commented block. This line and all lines 
+    ///             until the end of a comment block are ignored.
+    ///             </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>// &lt;\comment&gt;</term>
+    ///         <description>
+    ///             End of a commented block. This line is ignored, but any 
+    ///             lines following will be included.
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>// &lt;include&gt;</term>
+    ///         <description>
+    ///             Beginning of an include block. This line is ignored, but 
+    ///             all lines following will have the //// comment marker 
+    ///             removed from the beginning of the line. Effectively, 
+    ///             it uncomments lines of code that were previously commented 
+    ///             and ignored by the compiler. All normal C# comments (// 
and ///) 
+    ///             are ignored and left in place.
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>// &lt;\\include&gt;</term>
+    ///         <description>
+    ///             End of an include block. This line is ignored and following
+    ///             lines will be treated normally again. In other words, the 
////
+    ///             comment will no longer be removed from following lines.
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>////</term>
+    ///         <description>
+    ///             A double comment. This comment is removed in include blocks
+    ///             to uncomment code that was previously commented and ignored
+    ///             by the compiler. This allows adding using directives, 
alternate
+    ///             type names, etc. to be output in the demo even if they 
don't exist
+    ///             in the compiled application.
+    ///         </description>
+    ///     </item>
+    /// </list>
+    /// </summary>
+    public class SourceCodeSectionParser
+    {
+        public static readonly Encoding ENCODING = Encoding.UTF8;
+
+        /// <summary>
+        /// Parses the source code from the <paramref name="input"/> and 
places the
+        /// valid lines (the lines that are not commented with a token,
+        /// those that are included with a token, and "normal" lines)
+        /// into the <paramref name="output"/>.
+        /// </summary>
+        /// <param name="input">A stream with the input data. This stream will 
still be open when the call completes.</param>
+        /// <param name="output">A stream where the output data will be sent. 
This stream will still be open when the call completes.</param>
+        public void ParseSourceCodeFiles(Stream input, Stream output)
+        {
+            using (var reader = new SourceCodeSectionReader(new 
StreamReader(input, ENCODING, false, 1024, true)))
+            using (TextWriter writer = new StreamWriter(output, ENCODING, 
1024, true))
+            {
+                string line;
+                while ((line = reader.ReadLine()) != null)
+                {
+                    writer.WriteLine(line);
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/9e389540/src/tools/lucene-cli/SourceCode/SourceCodeSectionReader.cs
----------------------------------------------------------------------
diff --git a/src/tools/lucene-cli/SourceCode/SourceCodeSectionReader.cs 
b/src/tools/lucene-cli/SourceCode/SourceCodeSectionReader.cs
new file mode 100644
index 0000000..6812037
--- /dev/null
+++ b/src/tools/lucene-cli/SourceCode/SourceCodeSectionReader.cs
@@ -0,0 +1,157 @@
+using System;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace Lucene.Net.Cli.SourceCode
+{
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    /// <summary>
+    /// A <see cref="TextReader"/> that conditionally includes or excludes 
lines 
+    /// of source code based on commented sections in the original
+    /// source.
+    /// </summary>
+    /// <remarks>
+    /// Idenitifies sections of code based on tokens to transform 
+    /// the output code to either contain extra code sections or
+    /// remove unwanted code sections.
+    /// <para/>
+    /// There are 5 different types of tokens considered:
+    /// <list type="table">
+    ///     <item>
+    ///         <term>// &lt;comment&gt;</term>
+    ///         <description>
+    ///             Beginning of commented block. This line and all lines 
+    ///             until the end of a comment block are ignored.
+    ///             </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>// &lt;\comment&gt;</term>
+    ///         <description>
+    ///             End of a commented block. This line is ignored, but any 
+    ///             lines following will be included.
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>// &lt;include&gt;</term>
+    ///         <description>
+    ///             Beginning of an include block. This line is ignored, but 
+    ///             all lines following will have the //// comment marker 
+    ///             removed from the beginning of the line. Effectively, 
+    ///             it uncomments lines of code that were previously commented 
+    ///             and ignored by the compiler. All normal C# comments (// 
and ///) 
+    ///             are ignored and left in place.
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>// &lt;\\include&gt;</term>
+    ///         <description>
+    ///             End of an include block. This line is ignored and following
+    ///             lines will be treated normally again. In other words, the 
////
+    ///             comment will no longer be removed from following lines.
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>////</term>
+    ///         <description>
+    ///             A double comment. This comment is removed in include blocks
+    ///             to uncomment code that was previously commented and ignored
+    ///             by the compiler. This allows adding using directives, 
alternate
+    ///             type names, etc. to be output in the demo even if they 
don't exist
+    ///             in the compiled application.
+    ///         </description>
+    ///     </item>
+    /// </list>
+    /// </remarks>
+    public class SourceCodeSectionReader : TextReader
+    {
+        public static readonly Regex COMMENT_START = new 
Regex(@"//\s*?<comment>", RegexOptions.Compiled);
+        public static readonly Regex COMMENT_END = new 
Regex(@"//\s*?</comment>", RegexOptions.Compiled);
+        public static readonly Regex INCLUDE_START = new 
Regex(@"//\s*?<include>", RegexOptions.Compiled);
+        public static readonly Regex INCLUDE_END = new 
Regex(@"//\s*?</include>", RegexOptions.Compiled);
+        public static readonly Regex TO_UNCOMMENT = new Regex(@"////", 
RegexOptions.Compiled);
+
+        private bool inComment = false;
+        private bool inInclude = false;
+
+        private readonly TextReader reader;
+
+        public SourceCodeSectionReader(TextReader reader)
+        {
+            if (reader == null)
+                throw new ArgumentNullException("reader");
+            this.reader = reader;
+        }
+
+        public override string ReadLine()
+        {
+            string line;
+            while ((line = reader.ReadLine()) != null)
+            {
+                if (inComment)
+                {
+                    if (COMMENT_END.IsMatch(line))
+                    {
+                        inComment = false;
+                        continue; // Skip this line
+                    }
+                }
+                else
+                {
+                    if (COMMENT_START.IsMatch(line))
+                    {
+                        inComment = true;
+                        continue; // Skip this line
+                    }
+                    else
+                    {
+                        // If not in a comment, consider source code includes.
+                        // In this case, we will remove //// from the 
beginning of
+                        // each line if it exists.
+                        if (inInclude)
+                        {
+                            if (INCLUDE_END.IsMatch(line))
+                            {
+                                inInclude = false;
+                                continue; // Skip this line
+                            }
+                            line = TO_UNCOMMENT.Replace(line, string.Empty, 1);
+                        }
+                        else if (INCLUDE_START.IsMatch(line))
+                        {
+                            inInclude = true;
+                            continue; // Skip this line
+                        }
+                    }
+
+                    // All other lines, include the line
+                    return line;
+                }
+            }
+            return line;
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                this.reader?.Dispose();
+            }
+        }
+    }
+}

Reply via email to