1 package org.daisy.pipeline.css.saxon.impl; 2 3 import net.sf.saxon.expr.XPathContext; 4 import net.sf.saxon.lib.ExtensionFunctionCall; 5 import net.sf.saxon.lib.ExtensionFunctionDefinition; 6 import net.sf.saxon.om.Sequence; 7 import net.sf.saxon.om.StructuredQName; 8 import net.sf.saxon.trans.XPathException; 9 import net.sf.saxon.value.BooleanValue; 10 import net.sf.saxon.value.SequenceType; 11 12 import org.daisy.pipeline.css.Medium; 13 14 import org.osgi.service.component.annotations.Component; 15 16 @Component( 17 name = "pf:media-query-matches", 18 service = { ExtensionFunctionDefinition.class } 19 ) 20 public class MediaQueryMatchesDefinition extends ExtensionFunctionDefinition { 21 22 private static final StructuredQName funcname = new StructuredQName( 23 "pf", 24 "http://www.daisy.org/ns/pipeline/functions", 25 "media-query-matches"); 26 27 public StructuredQName getFunctionQName() { 28 return funcname; 29 } 30 31 @Override 32 public int getMinimumNumberOfArguments() { 33 return 2; 34 } 35 36 @Override 37 public int getMaximumNumberOfArguments() { 38 return 2; 39 } 40 41 public SequenceType[] getArgumentTypes() { 42 return new SequenceType[] { 43 SequenceType.SINGLE_STRING, 44 SequenceType.SINGLE_STRING 45 }; 46 } 47 48 public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { 49 return SequenceType.SINGLE_BOOLEAN; 50 } 51 52 public ExtensionFunctionCall makeCallExpression() { 53 return new ExtensionFunctionCall() { 54 public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException { 55 try { 56 String mediaQuery = arguments[0].head().getStringValue(); 57 Medium medium = Medium.parse(arguments[1].head().getStringValue()); 58 return BooleanValue.get(medium.matches(mediaQuery)); 59 } catch (Throwable e) { 60 throw new XPathException("Unexpected error in pf:media-query-matches", e); 61 } 62 } 63 }; 64 } 65 }