def date_equal_test(xc, p, args, instantEndDate): if len(args) != 2: raise XPathContext.FunctionNumArgs() date1 = atomicArg(xc, p, args, 0, "xbrldi:dateUnion", missingArgFallback=(), emptyFallback=None) if not isinstance(date1, (DateTime,datetime.date)): raise XPathContext.FunctionArgType(1,"xbrldi:dateUnion") date2 = atomicArg(xc, p, args, 1, "xbrldi:dateUnion", missingArgFallback=(), emptyFallback=None) if not isinstance(date1, (DateTime,datetime.date)): raise XPathContext.FunctionArgType(2,"xbrldi:dateUnion") return dateUnionEqual(date1, date2, instantEndDate)
def xfxc_element(xc, p, contextItem, args): if not 2 <= len(args) <= 4: raise XPathContext.FunctionNumArgs() qn = qnameArg(xc, p, args, 0, 'QName', emptyFallback=None) attrArg = args[1] if isinstance(args[1], (list, tuple)) else (args[1], ) # attributes have to be pairs if attrArg: if len(attrArg) & 1 or any( not isinstance(attrArg[i], (QName, _STR_BASE)) for i in range(0, len(attrArg), 2)): raise XPathContext.FunctionArgType( 1, "((xs:qname|xs:string),xs:anyAtomicValue)", errCode="xfxce:AttributesNotNameValuePairs") else: attrParam = [ (attrArg[i], attrArg[i + 1] ) # need name-value pairs for XmlUtil function for i in range(0, len(attrArg), 2) ] else: attrParam = None value = atomicArg(xc, p, args, 2, "xs:anyAtomicType", emptyFallback='') if not value: # be sure '' is None so no text node is created value = None if len(args) < 4: childElements = None else: childElements = xc.flattenSequence(args[3]) # scratchpad instance document emulates fn:doc( ) to hold XML nodes scratchpadXmlDocUrl = "http://www.xbrl.org/2012/function/creation/xml_scratchpad.xml" if scratchpadXmlDocUrl in xc.modelXbrl.urlDocs: modelDocument = xc.modelXbrl.urlDocs[scratchpadXmlDocUrl] else: # create scratchpad xml document # this will get the fake instance document in the list of modelXbrl docs so that it is garbage collected from arelle import ModelDocument modelDocument = ModelDocument.create( xc.modelXbrl, ModelDocument.Type.UnknownXML, scratchpadXmlDocUrl, initialXml= "<xfc:dummy xmlns:xfc='http://www.xbrl.org/2012/function/creation'/>" ) newElement = XmlUtil.addChild(modelDocument.xmlRootElement, qn, attributes=attrParam, text=value) if childElements: for element in childElements: if isinstance(element, etree.ElementBase): newElement.append(element) # node myst be validated for use in instance creation (typed dimension references) XmlValidate.validate(xc.modelXbrl, newElement) return newElement
def string(xc, p, contextItem, args): if len(args) > 1: raise XPathContext.FunctionNumArgs() x = atomicArg(xc, p, args, 0, "item()?", missingArgFallback=contextItem, emptyFallback='') return FunctionXs.xsString(xc, p, x)
def call(xc, p, localname, args): source = atomicArg(xc, p, args, 0, "value?", missingArgFallback=() ) if source == (): return source try: if localname not in xsFunctions: raise xsFunctionNotAvailable return xsFunctions[localname](xc, p, source) except (FORG0001, ValueError, TypeError): raise XPathContext.XPathException(p, 'err:FORG0001', _('invalid cast from {0} to xs:{1}').format( type(source).__name__, localname)) except xsFunctionNotAvailable: raise XPathContext.FunctionNotAvailable("xs:{0}".format(localname))
def xfxc_element(xc, p, contextItem, args): if not 2 <= len(args) <= 4: raise XPathContext.FunctionNumArgs() qn = qnameArg(xc, p, args, 0, 'QName', emptyFallback=None) attrArg = args[1] if isinstance(args[1],(list,tuple)) else (args[1],) # attributes have to be pairs if attrArg: if len(attrArg) & 1 or any(not isinstance(attrArg[i], (QName, _STR_BASE)) for i in range(0, len(attrArg),2)): raise XPathContext.FunctionArgType(1,"((xs:qname|xs:string),xs:anyAtomicValue)", errCode="xfxce:AttributesNotNameValuePairs") else: attrParam = [(attrArg[i],attrArg[i+1]) # need name-value pairs for XmlUtil function for i in range(0, len(attrArg),2)] else: attrParam = None value = atomicArg(xc, p, args, 2, "xs:anyAtomicType", emptyFallback='') if not value: # be sure '' is None so no text node is created value = None if len(args) < 4: childElements = None else: childElements = xc.flattenSequence(args[3]) # scratchpad instance document emulates fn:doc( ) to hold XML nodes scratchpadXmlDocUrl = "http://www.xbrl.org/2012/function/creation/xml_scratchpad.xml" if scratchpadXmlDocUrl in xc.modelXbrl.urlDocs: modelDocument = xc.modelXbrl.urlDocs[scratchpadXmlDocUrl] else: # create scratchpad xml document # this will get the fake instance document in the list of modelXbrl docs so that it is garbage collected from arelle import ModelDocument modelDocument = ModelDocument.create(xc.modelXbrl, ModelDocument.Type.UnknownXML, scratchpadXmlDocUrl, initialXml="<xfc:dummy xmlns:xfc='http://www.xbrl.org/2012/function/creation'/>") newElement = XmlUtil.addChild(modelDocument.xmlRootElement, qn, attributes=attrParam, text=value) if childElements: for element in childElements: if isinstance(element, etree.ElementBase): newElement.append(element) # node myst be validated for use in instance creation (typed dimension references) XmlValidate.validate(xc.modelXbrl, newElement) return newElement
def call(xc, p, localname, args): source = atomicArg(xc, p, args, 0, u"value?", missingArgFallback=() ) if source == (): return source try: if localname not in xsFunctions: raise xsFunctionNotAvailable return xsFunctions[localname](xc, p, source) except (FORG0001, ValueError, TypeError), ex: if hasattr(ex, u"message") and ex.message: exMsg = u", " + ex.message else: exMsg = u"" raise XPathContext.XPathException(p, u'err:FORG0001', _(u'invalid cast from {0} to xs:{1}{2}').format( type(source).__name__, localname, exMsg))
def string(xc, p, contextItem, args): if len(args) > 1: raise XPathContext.FunctionNumArgs() x = atomicArg(xc, p, args, 0, "item()?", missingArgFallback=contextItem, emptyFallback='') return FunctionXs.xsString( xc, p, x )