docs: def add_edurange(self, edurange):
          """
          Parameters
          ----------
          edurange : etree.Element
              etree representation of a <edurange> element
              (annotation that groups a number of EDUs)
              <edu-range> seems to glue together a number of `<edu> elements,
              which may be scattered over a number of sentences
              <edu-range> may or may not contain a span attribute
              (it seems that the span attribute is present, when <edu-range> is
              a descendent of <sentence>)
  
          Example
          -------
  
             <edu-range xml:id="edus9_3_1-5_0" span="s128_4..s130_7">
              <node xml:id="s128_525" cat="SIMPX" func="--">
               <edu xml:id="edu_9_3_1">
                <discRel relation="Continuation" marking="-" arg2="edu_9_3_2"/>
                <node xml:id="s128_506" cat="VF" func="-" parent="s128_525">
                 <node xml:id="s128_505" cat="NX" func="ON" parent="s128_506">
                  <relation type="expletive"/>
                  <word xml:id="s128_4" form="Es" pos="PPER" morph="nsn3" lemma="es" func="HD" parent="s128_505" dephead="s128_5" deprel="SUBJ"/>
                 </node>
                </node>
  
              ...
  
            <edu-range xml:id="edus37_8_0-8_1">
             <discRel relation="Restatement" marking="-" arg2="edu_37_9_0"/>
             <sentence xml:id="s660">
          """
          edurange_id = self.get_element_id(edurange)
          edurange_attribs = self.element_attribs_to_dict(edurange) # contains 'span' or nothing
          self.add_node(edurange_id, layers={self.ns, self.ns+':edu:range'}, attr_dict=edurange_attribs)
          for edu in edurange.iterdescendants('edu'):
              edu_id = self.get_element_id(edu)
              self.add_edge(edurange_id, edu_id, layers={self.ns, self.ns+':edu:range'},
                            edge_type=dg.EdgeTypes.spanning_relation)