Ejemplo n.º 1
0
 public CSharpCodeVisitor(IEnumerable <IStringExtractor <SyntaxNode> > extractors, LocalizableStringCollection strings)
 {
     this.Extractors = extractors;
     this.Strings    = strings;
 }
Ejemplo n.º 2
0
        private static void ProcessProject(string projectPath, string projectBasePath, string outputFilePath, bool parseLiquid)
        {
            var strings = new LocalizableStringCollection();

            var codeMetadataProvider      = new CodeMetadataProvider(projectBasePath);
            var localizedStringsCollector = new CSharpCodeVisitor(
                new IStringExtractor <SyntaxNode>[] {
                new SingularStringExtractor(codeMetadataProvider),
                new PluralStringExtractor(codeMetadataProvider)
            }, strings);

            foreach (var file in Directory.EnumerateFiles(projectPath, "*.cs", SearchOption.AllDirectories))
            {
                if (Path.GetFileName(file).EndsWith(".g.cshtml.cs"))
                {
                    continue;
                }

                using (var stream = File.OpenRead(file)) {
                    using (var reader = new StreamReader(stream)) {
                        var syntaxTree = CSharpSyntaxTree.ParseText(reader.ReadToEnd(), path: file);

                        localizedStringsCollector.Visit(syntaxTree.GetRoot());
                    }
                }
            }

            if (parseLiquid)
            {
                var liquidMetadataProvider = new LiquidMetadataProvider(projectBasePath);
                var liquidVisitor          = new LiquidVisitor(new[] { new LiquidStringExtractor(liquidMetadataProvider) }, strings);
                var liquidParser           = _liquidParseFactory.CreateParser();

                foreach (var file in Directory.EnumerateFiles(projectPath, "*.liquid", SearchOption.AllDirectories))
                {
                    using (var stream = File.OpenRead(file)) {
                        using (var reader = new StreamReader(stream)) {
                            if (liquidParser.TryParse(reader.ReadToEnd(), true, out var ast, out var errors))
                            {
                                foreach (var statement in ast)
                                {
                                    liquidVisitor.Visit(new LiquidStatementContext()
                                    {
                                        Statement = statement, FilePath = file
                                    });
                                }
                            }
                        }
                    }
                }
            }

            var razorMetadataProvider = new RazorMetadataProvider(projectBasePath);

            localizedStringsCollector.Extractors = new IStringExtractor <SyntaxNode>[] {
                new SingularStringExtractor(razorMetadataProvider),
                new PluralStringExtractor(razorMetadataProvider)
            };

            var compiledViews = ViewCompiler.CompileViews(projectPath);
            var cs            = new CSharpCodeProvider();

            foreach (var view in compiledViews)
            {
                try {
                    var syntaxTree = CSharpSyntaxTree.ParseText(view.GeneratedCode, path: view.FilePath);
                    localizedStringsCollector.Visit(syntaxTree.GetRoot());
                } catch (Exception ex) {
                    Console.WriteLine("Compile fail for: {0}", view.FilePath);
                }
            }

            if (strings.Values.Any())
            {
                var outputDirectory = Path.GetDirectoryName(outputFilePath);
                Directory.CreateDirectory(outputDirectory);

                using (var potFile = new PotFile(outputFilePath)) {
                    potFile.WriteRecord(strings.Values);
                }
            }

            Console.WriteLine($"{Path.GetFileName(projectPath)}: Found {strings.Values.Count()} strings.");
        }