[NUI] Add Tizen.NUI.XamlBuild module
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.XamlBuild / src / public / XamlBuild / CssGenerator.cs
1 using System.CodeDom;
2 using System.CodeDom.Compiler;
3 using System.IO;
4
5 using Microsoft.Build.Framework;
6 using Microsoft.Build.Utilities;
7 using Microsoft.CSharp;
8
9 using Tizen.NUI.Xaml;
10
11 namespace Tizen.NUI.Xaml.Build.Tasks
12 {
13     class CssGenerator
14     {
15         internal CssGenerator()
16         {
17         }
18
19         public CssGenerator(
20             ITaskItem taskItem,
21             string language,
22             string assemblyName,
23             string outputFile,
24             TaskLoggingHelper logger)
25             : this(
26                 taskItem.ItemSpec,
27                 language,
28                 taskItem.GetMetadata("ManifestResourceName"),
29                 taskItem.GetMetadata("TargetPath"),
30                 assemblyName,
31                 outputFile,
32                 logger)
33         {
34         }
35
36         internal static CodeDomProvider Provider = new CSharpCodeProvider();
37
38         public string CssFile { get; }
39         public string Language { get; }
40         public string ResourceId { get; }
41         public string TargetPath { get; }
42         public string AssemblyName { get; }
43         public string OutputFile { get; }
44         public TaskLoggingHelper Logger { get; }
45
46         public CssGenerator(
47             string cssFile,
48             string language,
49             string resourceId,
50             string targetPath,
51             string assemblyName,
52             string outputFile,
53             TaskLoggingHelper logger = null)
54         {
55             CssFile = cssFile;
56             Language = language;
57             ResourceId = resourceId;
58             TargetPath = targetPath;
59             AssemblyName = assemblyName;
60             OutputFile = outputFile;
61             Logger = logger;
62         }
63
64         //returns true if a file is generated
65         public bool Execute()
66         {
67             Logger?.LogMessage(MessageImportance.Low, "Source: {0}", CssFile);
68             Logger?.LogMessage(MessageImportance.Low, " Language: {0}", Language);
69             Logger?.LogMessage(MessageImportance.Low, " ResourceID: {0}", ResourceId);
70             Logger?.LogMessage(MessageImportance.Low, " TargetPath: {0}", TargetPath);
71             Logger?.LogMessage(MessageImportance.Low, " AssemblyName: {0}", AssemblyName);
72             Logger?.LogMessage(MessageImportance.Low, " OutputFile {0}", OutputFile);
73
74             GenerateCode();
75
76             return true;
77         }
78
79         void GenerateCode()
80         {
81             //Create the target directory if required
82             Directory.CreateDirectory(System.IO.Path.GetDirectoryName(OutputFile));
83
84             var ccu = new CodeCompileUnit();
85             ccu.AssemblyCustomAttributes.Add(
86                new CodeAttributeDeclaration(new CodeTypeReference($"global::{typeof(XamlResourceIdAttribute).FullName}"),
87                                             new CodeAttributeArgument(new CodePrimitiveExpression(ResourceId)),
88                                             new CodeAttributeArgument(new CodePrimitiveExpression(TargetPath.Replace('\\', '/'))),
89                                             new CodeAttributeArgument(new CodePrimitiveExpression(null))
90                                            ));
91
92             //write the result
93             using (var writer = new StreamWriter(OutputFile))
94                 Provider.GenerateCodeFromCompileUnit(ccu, writer, new CodeGeneratorOptions());
95         }
96     }
97 }