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()); }
/// <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); }
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 CounterWithoutPagesTest() { CssStyleSheet styleSheet = CssStyleSheetParser.Parse(".x::before { content: counter(othercounter) }"); 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 SimpleNegativeTest() { CssStyleSheet styleSheet = CssStyleSheetParser.Parse("* { color: red; }"); NUnit.Framework.Assert.IsFalse(CssStyleSheetAnalyzer.CheckPagesCounterPresence(styleSheet)); }
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; } } } }
/// <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(); }