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  }