Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
Layout2DXmlToImageConverter.cs
1using SkiaSharp;
2using System;
3using System.IO;
4using System.Text;
5using System.Text.RegularExpressions;
6using System.Threading.Tasks;
7using System.Xml;
8using System.Xml.Xsl;
16using Waher.Script;
17
19{
24 {
25 private static readonly Regex processingInstructionData= new Regex(
26 @"(\s*((type=['""](?'Type'[^'""]*)['""])|(href=['""](?'HRef'[^'""]*)['""])|([^ =]+=['""]([^'""]*)['""])))*",
27 RegexOptions.Singleline | RegexOptions.Compiled);
28
33 {
34 }
35
40
44 public virtual string[] ToContentTypes => ImageCodec.ImageContentTypes;
45
49 public virtual Grade ConversionGrade => Grade.Barely;
50
56 public async Task<bool> ConvertAsync(ConversionState State)
57 {
58 byte[] Bin = await State.From.ReadAllAsync();
59 string Xml = Strings.GetString(Bin, Encoding.UTF8);
60 string s = State.ToContentType;
61 int i;
62
63 i = s.IndexOf(';');
64 if (i > 0)
65 s = s.Substring(0, i);
66
67 string Extension;
68 SKEncodedImageFormat Format;
69 int Quality = 100;
70
71 switch (s.ToLower())
72 {
74 Format = SKEncodedImageFormat.Png;
75 Extension = ImageCodec.FileExtensionPng;
76 break;
77
79 Format = SKEncodedImageFormat.Bmp;
80 Extension = ImageCodec.FileExtensionBmp;
81 break;
82
84 Format = SKEncodedImageFormat.Gif;
85 Extension = ImageCodec.FileExtensionGif;
86 break;
87
89 Format = SKEncodedImageFormat.Jpeg;
90 Extension = ImageCodec.FileExtensionJpg;
91 Quality = 90;
92 break;
93
95 Format = SKEncodedImageFormat.Webp;
96 Extension = ImageCodec.FileExtensionWebP;
97 break;
98
100 Format = SKEncodedImageFormat.Ico;
101 Extension = ImageCodec.FileExtensionIcon;
102 break;
103
108 default:
109 Format = XmlLayout.DefaultFormat;
110 Extension = XmlLayout.DefaultFileExtension;
111 State.ToContentType = XmlLayout.DefaultContentType;
112 break;
113 }
114
115 string ContentType = State.FromContentType;
117 GraphInfo Graph;
118 bool Transformed;
119 bool ValidXml = true;
120
121 do
122 {
123 Transformed = false;
124 Variables = new Variables();
125 Graph = await XmlLayout.GetFileName("layout", Xml, Variables, Format, Quality, Extension);
126
127 if (!Graph.Converted && !(Graph.Xml is null))
128 {
129 foreach (XmlNode N in Graph.Xml)
130 {
131 if (N is XmlProcessingInstruction PI &&
132 PI.Name == "xml-stylesheet")
133 {
134 Match M = processingInstructionData.Match(PI.Data);
135 if (M.Success && M.Groups["Type"].Value == "text/xsl")
136 {
137 string HRef = M.Groups["HRef"].Value;
138
139 if (State.TryGetLocalResourceFileName(HRef, null, out string FileName) &&
140 File.Exists(FileName))
141 {
142 using (FileStream fs = File.OpenRead(FileName))
143 {
144 XslCompiledTransform Transform = XSL.LoadTransform(fs);
145 Xml = XSL.Transform(Xml, Transform);
146 ValidXml = XML.IsValidXml(Xml);
147 Bin = null;
148
149 if (!ValidXml)
150 {
151 bool IsHtml;
152
153 try
154 {
155 HtmlDocument Doc = new HtmlDocument(Xml);
156 IsHtml = !(Doc.Html is null) && !(Doc.Body is null);
157 }
158 catch (Exception)
159 {
160 IsHtml = false;
161 }
162
163 if (!IsHtml)
164 {
165 MarkdownSettings Settings = new MarkdownSettings(null,
167 State.Session)
168 {
169 ResourceMap = State.ResourceMap
170 };
171
172 MarkdownDocument Doc = await MarkdownDocument.CreateAsync(Xml, Settings, State.FromFileName, State.LocalResourceName, State.URL);
173 Xml = await Doc.GenerateHTML();
174 }
175
176 ContentType = HtmlCodec.DefaultContentType;
177 }
178 }
179 }
180 }
181 }
182 }
183 }
184 }
185 while (!Graph.Converted && Transformed && ValidXml);
186
187 if (!Graph.Converted)
188 {
189 if (Bin is null)
190 Bin = Encoding.UTF8.GetBytes(Xml);
191
192 await State.To.WriteAsync(Bin, 0, Bin.Length);
193 State.ToContentType = ContentType;
194 return true;
195 }
196 else if (Graph.Dynamic)
197 {
198 await State.To.WriteAsync(Graph.DynamicContent, 0, Graph.DynamicContent.Length);
199 return true;
200 }
201 else
202 {
203 byte[] Data = await Files.ReadAllBytesAsync(Graph.FileName);
204
205 await State.To.WriteAsync(Data, 0, Data.Length);
206
207 return false;
208 }
209 }
210 }
211}
Contains the state of a content conversion process.
Variables Session
Session states.
string ToContentType
Content type of the content to convert to. This value might be changed, in case the converter finds a...
string LocalResourceName
Local resource name of file, if accessed from a web server.
string FromContentType
Content type of the content to convert from.
Stream To
Stream pointing to where binary representation of content is to be sent.
string FromFileName
If the content is coming from a file, this parameter contains the name of that file....
bool TryGetLocalResourceFileName(string Resource, string Host, out string FileName)
Tries to get a file name for a resource, if local.
string URL
URL of resource, if accessed from a web server.
Stream From
Stream pointing to binary representation of content.
HTML encoder/decoder.
Definition: HtmlCodec.cs:15
const string DefaultContentType
Default Content-Type for HTML: text/html
Definition: HtmlCodec.cs:26
Body Body
First BODY element of document, if found, null otherwise.
Image encoder/decoder.
Definition: ImageCodec.cs:14
const string FileExtensionJpg
jpg
Definition: ImageCodec.cs:90
const string ContentTypeJpg
image/jpeg
Definition: ImageCodec.cs:35
const string ContentTypeIcon
image/x-icon
Definition: ImageCodec.cs:40
const string ContentTypeWebP
image/webp
Definition: ImageCodec.cs:25
const string ContentTypeEmf
image/x-emf
Definition: ImageCodec.cs:70
const string ContentTypeGif
image/gif
Definition: ImageCodec.cs:55
const string FileExtensionPng
png
Definition: ImageCodec.cs:75
const string FileExtensionWebP
webp
Definition: ImageCodec.cs:95
const string FileExtensionIcon
ico
Definition: ImageCodec.cs:115
const string ContentTypePng
image/png
Definition: ImageCodec.cs:30
const string ContentTypeBmp
image/bmp
Definition: ImageCodec.cs:50
const string ContentTypeTiff
image/tiff
Definition: ImageCodec.cs:60
const string ContentTypeWmf
image/x-wmf
Definition: ImageCodec.cs:65
const string ContentTypeSvg
image/svg+xml
Definition: ImageCodec.cs:45
const string FileExtensionGif
gif
Definition: ImageCodec.cs:85
const string FileExtensionBmp
bmp
Definition: ImageCodec.cs:80
static readonly string[] ImageContentTypes
Image content types.
Definition: ImageCodec.cs:126
async Task< bool > ConvertAsync(ConversionState State)
Performs the actual conversion.
string[] FromContentTypes
Converts content from these content types.
virtual Grade ConversionGrade
How well the content is converted.
virtual string[] ToContentTypes
Converts content to these content types.
Class managing 2D XML Layout integration into Markdown documents.
Definition: XmlLayout.cs:44
Contains a markdown document. This markdown document class supports original markdown,...
static ? int HeaderEndPosition(string Markdown)
Gets the end position of the header, if one is found, null otherwise.
async Task< string > GenerateHTML()
Generates HTML from the markdown text.
static Task< MarkdownDocument > CreateAsync(string MarkdownText, params Type[] TransparentExceptionTypes)
Contains a markdown document. This markdown document class supports original markdown,...
Contains settings that the Markdown parser uses to customize its behavior.
XML encoder/decoder.
Definition: XmlCodec.cs:19
static readonly string[] XmlContentTypes
XML content types.
Definition: XmlCodec.cs:40
Helps with common XML-related tasks.
Definition: XML.cs:21
static bool IsValidXml(string Xml)
Checks if a string is valid XML
Definition: XML.cs:1397
Static class managing loading of XSL resources stored as embedded resources or in content files.
Definition: XSL.cs:16
static XslCompiledTransform LoadTransform(string ResourceName)
Loads an XSL transformation from an embedded resource.
Definition: XSL.cs:86
static string Transform(string XML, XslCompiledTransform Transform)
Transforms an XML document using an XSL transform.
Definition: XSL.cs:197
Contains static methods
Definition: Files.cs:14
static async Task< byte[]> ReadAllBytesAsync(string FileName)
Reads a binary file asynchronously.
Definition: Files.cs:20
Static class managing binary representations of strings.
Definition: Strings.cs:10
static string GetString(byte[] Data, int Offset, int Count, Encoding DefaultEncoding)
Gets a string from its binary representation, taking any Byte Order Mark (BOM) into account.
Definition: Strings.cs:148
Collection of variables.
Definition: Variables.cs:25
Basic interface for Internet Content encoders. A class implementing this interface and having a defau...
Grade
Grade enumeration
Definition: Grade.cs:7