public virtual void TestDefaultCss() { String cmpFile = sourceFolder + "cmp_default.css"; CssStyleSheet styleSheet = CssStyleSheetParser.Parse(ResourceUtil.GetResourceStream(DEFAULT_CSS_PATH)); NUnit.Framework.Assert.AreEqual(GetCssFileContents(cmpFile), styleSheet.ToString()); }
public virtual void Test06() { String htmlFileName = sourceFolder + "html06.html"; String cssFileName = sourceFolder + "css06.css"; IXmlParser htmlParser = new JsoupHtmlParser(); IDocumentNode document = htmlParser.Parse(new FileStream(htmlFileName, FileMode.Open, FileAccess.Read), "UTF-8" ); CssStyleSheet css = CssStyleSheetParser.Parse(new FileStream(cssFileName, FileMode.Open, FileAccess.Read)); IElementNode element = new JsoupElementNode(((JsoupDocumentNode)document).GetDocument().GetElementsByTag("p" ).First()); MediaDeviceDescription deviceDescription1 = new MediaDeviceDescription(MediaType.PRINT).SetBitsPerComponent (2); MediaDeviceDescription deviceDescription2 = new MediaDeviceDescription(MediaType.HANDHELD).SetBitsPerComponent (2); MediaDeviceDescription deviceDescription3 = new MediaDeviceDescription(MediaType.SCREEN).SetBitsPerComponent (1); IList <CssDeclaration> declarations1 = css.GetCssDeclarations(element, deviceDescription1); IList <CssDeclaration> declarations2 = css.GetCssDeclarations(element, deviceDescription2); IList <CssDeclaration> declarations3 = css.GetCssDeclarations(element, deviceDescription3); NUnit.Framework.Assert.IsTrue(Enumerable.SequenceEqual(declarations1, declarations2)); NUnit.Framework.Assert.AreEqual(0, declarations3.Count); NUnit.Framework.Assert.AreEqual(1, declarations1.Count); NUnit.Framework.Assert.AreEqual("color: red", declarations1[0].ToString()); }
public virtual void Test01() { String cssFile = sourceFolder + "css01.css"; CssStyleSheet styleSheet = CssStyleSheetParser.Parse(new FileStream(cssFile, FileMode.Open, FileAccess.Read )); NUnit.Framework.Assert.AreEqual(GetCssFileContents(cssFile), styleSheet.ToString()); }
/// <summary>Collects CSS declarationss.</summary> /// <param name="rootNode">the root node</param> /// <param name="resourceResolver">the resource resolver</param> /// <param name="cssContext">the CSS context</param> private void CollectCssDeclarations(INode rootNode, ResourceResolver resourceResolver, CssContext cssContext ) { cssStyleSheet = new CssStyleSheet(); LinkedList <INode> q = new LinkedList <INode>(); q.Add(rootNode); while (!q.IsEmpty()) { INode currentNode = q.JGetFirst(); q.RemoveFirst(); if (currentNode is IElementNode) { IElementNode headChildElement = (IElementNode)currentNode; if (TagConstants.STYLE.Equals(headChildElement.Name())) { if (currentNode.ChildNodes().Count > 0 && currentNode.ChildNodes()[0] is IDataNode) { String styleData = ((IDataNode)currentNode.ChildNodes()[0]).GetWholeData(); CssStyleSheet styleSheet = CssStyleSheetParser.Parse(styleData); styleSheet = WrapStyleSheetInMediaQueryIfNecessary(headChildElement, styleSheet); cssStyleSheet.AppendCssStyleSheet(styleSheet); } } else { if (CssUtils.IsStyleSheetLink(headChildElement)) { String styleSheetUri = headChildElement.GetAttribute(AttributeConstants.HREF); try { using (Stream stream = resourceResolver.RetrieveResourceAsInputStream(styleSheetUri)) { if (stream != null) { CssStyleSheet styleSheet = CssStyleSheetParser.Parse(stream, resourceResolver.ResolveAgainstBaseUri(styleSheetUri ).ToExternalForm()); styleSheet = WrapStyleSheetInMediaQueryIfNecessary(headChildElement, styleSheet); cssStyleSheet.AppendCssStyleSheet(styleSheet); } } } catch (Exception exc) { ILog logger = LogManager.GetLogger(typeof(iText.Html2pdf.Css.Resolve.DefaultCssResolver)); logger.Error(iText.Html2pdf.LogMessageConstant.UNABLE_TO_PROCESS_EXTERNAL_CSS_FILE, exc); } } } } foreach (INode child in currentNode.ChildNodes()) { if (child is IElementNode) { q.Add(child); } } } EnablePagesCounterIfMentioned(cssStyleSheet, cssContext); EnableNonPageTargetCounterIfMentioned(cssStyleSheet, cssContext); }
/// <summary>Collects CSS declarationss.</summary> /// <param name="rootNode">the root node</param> /// <param name="resourceResolver">the resource resolver</param> /// <param name="cssContext">the CSS context</param> private void CollectCssDeclarations(INode rootNode, ResourceResolver resourceResolver, CssContext cssContext ) { cssStyleSheet = new CssStyleSheet(); LinkedList <INode> q = new LinkedList <INode>(); q.Add(rootNode); while (!q.IsEmpty()) { INode currentNode = q.JGetFirst(); q.RemoveFirst(); if (currentNode is IElementNode) { IElementNode headChildElement = (IElementNode)currentNode; if (TagConstants.STYLE.Equals(headChildElement.Name())) { if (currentNode.ChildNodes().Count > 0 && currentNode.ChildNodes()[0] is IDataNode) { String styleData = ((IDataNode)currentNode.ChildNodes()[0]).GetWholeData(); CheckIfPagesCounterMentioned(styleData, cssContext); CssStyleSheet styleSheet = CssStyleSheetParser.Parse(styleData); styleSheet = WrapStyleSheetInMediaQueryIfNecessary(headChildElement, styleSheet); cssStyleSheet.AppendCssStyleSheet(styleSheet); } } else { if (HtmlUtils.IsStyleSheetLink(headChildElement)) { String styleSheetUri = headChildElement.GetAttribute(AttributeConstants.HREF); try { Stream stream = resourceResolver.RetrieveStyleSheet(styleSheetUri); byte[] bytes = StreamUtil.InputStreamToArray(stream); CheckIfPagesCounterMentioned(iText.IO.Util.JavaUtil.GetStringForBytes(bytes, System.Text.Encoding.UTF8), cssContext ); CssStyleSheet styleSheet = CssStyleSheetParser.Parse(new MemoryStream(bytes), resourceResolver.ResolveAgainstBaseUri (styleSheetUri).ToExternalForm()); styleSheet = WrapStyleSheetInMediaQueryIfNecessary(headChildElement, styleSheet); cssStyleSheet.AppendCssStyleSheet(styleSheet); } catch (Exception exc) { ILog logger = LogManager.GetLogger(typeof(iText.Html2pdf.Css.Resolve.DefaultCssResolver)); logger.Error(iText.Html2pdf.LogMessageConstant.UNABLE_TO_PROCESS_EXTERNAL_CSS_FILE, exc); } } } } foreach (INode child in currentNode.ChildNodes()) { if (child is IElementNode) { q.Add(child); } } } }
public virtual void Test12() { // TODO in this test declarations of the page at-rule with compound selector are duplicated. // See CssPageRule#addBodyCssDeclarations() method for the reason and possible solution if this becomes important. String cssFile = sourceFolder + "css12.css"; String cmpFile = sourceFolder + "cmp_css12.css"; CssStyleSheet styleSheet = CssStyleSheetParser.Parse(new FileStream(cssFile, FileMode.Open, FileAccess.Read )); NUnit.Framework.Assert.AreEqual(GetCssFileContents(cmpFile), styleSheet.ToString()); }
/// <summary>Creates a SvgStyleResolver.</summary> public SvgStyleResolver() { try { using (Stream defaultCss = ResourceUtil.GetResourceStream(DEFAULT_CSS_PATH)) { this.css = CssStyleSheetParser.Parse(defaultCss); } } catch (System.IO.IOException e) { ILog logger = LogManager.GetLogger(this.GetType()); logger.Warn(SvgLogMessageConstant.ERROR_INITIALIZING_DEFAULT_CSS, e); this.css = new CssStyleSheet(); } }
static UserAgentCss() { CssStyleSheet parsedStylesheet = new CssStyleSheet(); try { parsedStylesheet = CssStyleSheetParser.Parse(ResourceUtil.GetResourceStream(DEFAULT_CSS_PATH)); } catch (Exception exc) { ILog logger = LogManager.GetLogger(typeof(UserAgentCss)); logger.Error("Error parsing default.css", exc); } finally { defaultCss = parsedStylesheet; } }
public virtual void Test01() { String htmlFileName = sourceFolder + "html01.html"; String cssFileName = sourceFolder + "css01.css"; IXmlParser htmlParser = new JsoupHtmlParser(); IDocumentNode document = htmlParser.Parse(new FileStream(htmlFileName, FileMode.Open, FileAccess.Read), "UTF-8" ); CssStyleSheet css = CssStyleSheetParser.Parse(new FileStream(cssFileName, FileMode.Open, FileAccess.Read)); MediaDeviceDescription deviceDescription = new MediaDeviceDescription("all"); IElementNode element = new JsoupElementNode(((JsoupDocumentNode)document).GetDocument().GetElementsByTag("p" ).First()); IList <CssDeclaration> declarations = css.GetCssDeclarations(element, deviceDescription); NUnit.Framework.Assert.AreEqual(1, declarations.Count); NUnit.Framework.Assert.AreEqual("font-weight: bold", declarations[0].ToString()); }
public virtual void Test05() { String htmlFileName = sourceFolder + "html05.html"; String cssFileName = sourceFolder + "css05.css"; IXmlParser htmlParser = new JsoupHtmlParser(); IDocumentNode document = htmlParser.Parse(new FileStream(htmlFileName, FileMode.Open, FileAccess.Read), "UTF-8" ); CssStyleSheet css = CssStyleSheetParser.Parse(new FileStream(cssFileName, FileMode.Open, FileAccess.Read)); IElementNode element = new JsoupElementNode(((JsoupDocumentNode)document).GetDocument().GetElementsByTag("p" ).First()); MediaDeviceDescription deviceDescription1 = new MediaDeviceDescription(MediaType.PRINT).SetWidth(300).SetHeight (301); MediaDeviceDescription deviceDescription2 = new MediaDeviceDescription(MediaType.SCREEN).SetWidth(400).SetHeight (400); IList <CssDeclaration> declarations1 = css.GetCssDeclarations(element, deviceDescription1); IList <CssDeclaration> declarations2 = css.GetCssDeclarations(element, deviceDescription2); NUnit.Framework.Assert.AreEqual(0, declarations1.Count); NUnit.Framework.Assert.AreEqual(1, declarations2.Count); NUnit.Framework.Assert.AreEqual("color: red", declarations2[0].ToString()); }
public virtual void ParseBase64SrcTest() { CssStyleSheet styleSheet = CssStyleSheetParser.Parse(new FileStream(sourceFolder + "srcs2.css", FileMode.Open , FileAccess.Read)); CssFontFaceRule fontFaceRule = (CssFontFaceRule)styleSheet.GetStatements()[0]; CssDeclaration src = fontFaceRule.GetProperties()[0]; NUnit.Framework.Assert.AreEqual("src", src.GetProperty(), "src expected"); String[] sources = CssFontFace.SplitSourcesSequence(src.GetExpression()); NUnit.Framework.Assert.AreEqual(8, sources.Length, "8 sources expected"); for (int i = 0; i < 6; i++) { Match m = iText.IO.Util.StringUtil.Match(CssFontFace.CssFontFaceSrc.UrlPattern, sources[i]); NUnit.Framework.Assert.IsTrue(m.Success, "Expression doesn't match pattern: " + sources[i]); } for (int i = 6; i < sources.Length; i++) { Match m = iText.IO.Util.StringUtil.Match(CssFontFace.CssFontFaceSrc.UrlPattern, sources[i]); NUnit.Framework.Assert.IsFalse(m.Success, "Expression matches pattern (though it shouldn't!): " + sources[ i]); } }
public virtual void Test02() { String htmlFileName = sourceFolder + "html02.html"; String cssFileName = sourceFolder + "css02.css"; IXmlParser htmlParser = new JsoupHtmlParser(); IDocumentNode document = htmlParser.Parse(new FileStream(htmlFileName, FileMode.Open, FileAccess.Read), "UTF-8" ); CssStyleSheet css = CssStyleSheetParser.Parse(new FileStream(cssFileName, FileMode.Open, FileAccess.Read)); IElementNode element = new JsoupElementNode(((JsoupDocumentNode)document).GetDocument().GetElementsByTag("p" ).First()); MediaDeviceDescription deviceDescription1 = new MediaDeviceDescription(MediaType.PRINT); deviceDescription1.SetWidth(525); MediaDeviceDescription deviceDescription2 = new MediaDeviceDescription(MediaType.HANDHELD); deviceDescription2.SetOrientation("landscape"); IList <CssDeclaration> declarations1 = css.GetCssDeclarations(element, deviceDescription1); IList <CssDeclaration> declarations2 = css.GetCssDeclarations(element, deviceDescription2); NUnit.Framework.Assert.IsTrue(Enumerable.SequenceEqual(declarations1, declarations2)); NUnit.Framework.Assert.AreEqual(1, declarations1.Count); NUnit.Framework.Assert.AreEqual("font-weight: bold", declarations1[0].ToString()); }
public virtual void SrcPropertyTest() { String fontSrc = "web-fonts/droid-serif-invalid."; CssStyleSheet styleSheet = CssStyleSheetParser.Parse(new FileStream(sourceFolder + "srcs.css", FileMode.Open , FileAccess.Read)); CssFontFaceRule fontFaceRule = (CssFontFaceRule)styleSheet.GetStatements()[0]; CssDeclaration src = fontFaceRule.GetProperties()[0]; NUnit.Framework.Assert.AreEqual("src", src.GetProperty(), "src expected"); String[] sources = iText.IO.Util.StringUtil.Split(src.GetExpression(), ","); NUnit.Framework.Assert.AreEqual(27, sources.Length, "27 sources expected"); for (int i = 0; i < sources.Length; i++) { Match m = iText.IO.Util.StringUtil.Match(CssFontFace.CssFontFaceSrc.UrlPattern, sources[i]); NUnit.Framework.Assert.IsTrue(m.Success, "Expression doesn't match pattern: " + sources[i]); String format = iText.IO.Util.StringUtil.Group(m, CssFontFace.CssFontFaceSrc.FormatGroup); String source2 = MessageFormatUtil.Format("{0}({1}){2}", iText.IO.Util.StringUtil.Group(m, CssFontFace.CssFontFaceSrc .TypeGroup), iText.IO.Util.StringUtil.Group(m, CssFontFace.CssFontFaceSrc.UrlGroup), format != null ? MessageFormatUtil.Format(" format({0})", format) : ""); String url = CssFontFace.CssFontFaceSrc.Unquote(iText.IO.Util.StringUtil.Group(m, CssFontFace.CssFontFaceSrc .UrlGroup)); NUnit.Framework.Assert.IsTrue(url.StartsWith(fontSrc), "Invalid url: " + url); NUnit.Framework.Assert.IsTrue(format == null || CssFontFace.CssFontFaceSrc.ParseFormat(format) != CssFontFace.FontFormat .None, "Invalid format: " + format); NUnit.Framework.Assert.AreEqual(sources[i], source2, "Group check fails: "); CssFontFace.CssFontFaceSrc fontFaceSrc = CssFontFace.CssFontFaceSrc.Create(sources[i]); NUnit.Framework.Assert.IsTrue(fontFaceSrc.GetSrc().StartsWith(fontSrc), "Invalid url: " + fontSrc); String type = "url"; if (fontFaceSrc.IsLocal()) { type = "local"; } NUnit.Framework.Assert.IsTrue(sources[i].StartsWith(type), "Type '" + type + "' expected: " + sources[i]); switch (fontFaceSrc.GetFormat()) { case CssFontFace.FontFormat.OpenType: { NUnit.Framework.Assert.IsTrue(sources[i].Contains("opentype"), "Format " + fontFaceSrc.GetFormat() + " expected: " + sources[i]); break; } case CssFontFace.FontFormat.TrueType: { NUnit.Framework.Assert.IsTrue(sources[i].Contains("truetype"), "Format " + fontFaceSrc.GetFormat() + " expected: " + sources[i]); break; } case CssFontFace.FontFormat.SVG: { NUnit.Framework.Assert.IsTrue(sources[i].Contains("svg"), "Format " + fontFaceSrc.GetFormat() + " expected: " + sources[i]); break; } case CssFontFace.FontFormat.None: { NUnit.Framework.Assert.IsFalse(sources[i].Contains("format("), "Format " + fontFaceSrc.GetFormat() + " expected: " + sources[i]); break; } } } }
private void CollectCssDeclarations(INode rootNode, ResourceResolver resourceResolver) { this.css = new CssStyleSheet(); LinkedList <INode> q = new LinkedList <INode>(); if (rootNode != null) { q.Add(rootNode); } while (!q.IsEmpty()) { INode currentNode = q.JRemoveFirst(); if (currentNode is IElementNode) { IElementNode headChildElement = (IElementNode)currentNode; if (SvgConstants.Tags.STYLE.Equals(headChildElement.Name())) { //XML parser will parse style tag contents as text nodes if (!currentNode.ChildNodes().IsEmpty() && (currentNode.ChildNodes()[0] is IDataNode || currentNode.ChildNodes ()[0] is ITextNode)) { String styleData; if (currentNode.ChildNodes()[0] is IDataNode) { styleData = ((IDataNode)currentNode.ChildNodes()[0]).GetWholeData(); } else { styleData = ((ITextNode)currentNode.ChildNodes()[0]).WholeText(); } CssStyleSheet styleSheet = CssStyleSheetParser.Parse(styleData); //TODO (DEVSIX-2263): media query wrap //styleSheet = wrapStyleSheetInMediaQueryIfNecessary(headChildElement, styleSheet); this.css.AppendCssStyleSheet(styleSheet); } } else { if (SvgCssUtils.IsStyleSheetLink(headChildElement)) { String styleSheetUri = headChildElement.GetAttribute(SvgConstants.Attributes.HREF); try { Stream stream = resourceResolver.RetrieveStyleSheet(styleSheetUri); byte[] bytes = StreamUtil.InputStreamToArray(stream); CssStyleSheet styleSheet = CssStyleSheetParser.Parse(new MemoryStream(bytes), resourceResolver.ResolveAgainstBaseUri (styleSheetUri).ToExternalForm()); this.css.AppendCssStyleSheet(styleSheet); } catch (System.IO.IOException exc) { ILog logger = LogManager.GetLogger(typeof(iText.Svg.Css.Impl.SvgStyleResolver)); logger.Error(iText.StyledXmlParser.LogMessageConstant.UNABLE_TO_PROCESS_EXTERNAL_CSS_FILE, exc); } } } } foreach (INode child in currentNode.ChildNodes()) { if (child is IElementNode) { q.Add(child); } } } }
public virtual void SimpleNegativeTest() { CssStyleSheet styleSheet = CssStyleSheetParser.Parse("* { color: red; }"); NUnit.Framework.Assert.IsFalse(CssStyleSheetAnalyzer.CheckPagesCounterPresence(styleSheet)); }
public virtual void PagesInCountersSpacesPresenceTest() { CssStyleSheet styleSheet = CssStyleSheetParser.Parse(".x::before { content: counters( pages,'.') }"); NUnit.Framework.Assert.IsTrue(CssStyleSheetAnalyzer.CheckPagesCounterPresence(styleSheet)); }
public virtual void CounterWithoutPagesTest() { CssStyleSheet styleSheet = CssStyleSheetParser.Parse(".x::before { content: counter(othercounter) }"); NUnit.Framework.Assert.IsFalse(CssStyleSheetAnalyzer.CheckPagesCounterPresence(styleSheet)); }
/// <summary> /// Creates a /// <see cref="SvgStyleResolver"/> /// with a given default CSS. /// </summary> /// <param name="defaultCssStream">the default CSS</param> /// <param name="context">the processor context</param> public SvgStyleResolver(Stream defaultCssStream, SvgProcessorContext context) { this.css = CssStyleSheetParser.Parse(defaultCssStream); this.resourceResolver = context.GetResourceResolver(); }
/// <summary> /// Creates a /// <see cref="SvgStyleResolver"/> /// with a given default CSS. /// </summary> /// <param name="defaultCssStream">the default CSS</param> public SvgStyleResolver(Stream defaultCssStream) { this.css = CssStyleSheetParser.Parse(defaultCssStream); }