docs: def get_line_rules(declarations):
      """ Given a list of declarations, return a list of output.Rule objects.
          
          This function is wise to line-<foo>, inline-<foo>, and outline-<foo> properties,
          and will generate multiple LineSymbolizers if necessary.
      """
      property_map = {'line-color': 'stroke', 'line-width': 'stroke-width',
                      'line-opacity': 'stroke-opacity', 'line-join': 'stroke-linejoin',
                      'line-cap': 'stroke-linecap', 'line-dasharray': 'stroke-dasharray',
                      'line-meta-output': 'meta-output', 'line-meta-writer': 'meta-writer'}
  
  
      property_names = property_map.keys()
      
      # prepend parameter names with 'in' and 'out'
      for i in range(len(property_names)):
          property_names.append('in' + property_names[i])
          property_names.append('out' + property_names[i])
  
      # a place to put rules
      rules = []
      
      for (filter, values) in filtered_property_declarations(declarations, property_names):
      
          width = values.has_key('line-width') and values['line-width'].value
          color = values.has_key('line-color') and values['line-color'].value
  
          opacity = values.has_key('line-opacity') and values['line-opacity'].value or None
          join = values.has_key('line-join') and values['line-join'].value or None
          cap = values.has_key('line-cap') and values['line-cap'].value or None
          dashes = values.has_key('line-dasharray') and values['line-dasharray'].value or None
  
          line_symbolizer = color and width and output.LineSymbolizer(color, width, opacity, join, cap, dashes) or False
  
          width = values.has_key('inline-width') and values['inline-width'].value
          color = values.has_key('inline-color') and values['inline-color'].value
  
          opacity = values.has_key('inline-opacity') and values['inline-opacity'].value or None
          join = values.has_key('inline-join') and values['inline-join'].value or None
          cap = values.has_key('inline-cap') and values['inline-cap'].value or None
          dashes = values.has_key('inline-dasharray') and values['inline-dasharray'].value or None
  
          inline_symbolizer = color and width and output.LineSymbolizer(color, width, opacity, join, cap, dashes) or False
  
          # outline requires regular line to have a meaningful width
          width = values.has_key('outline-width') and values.has_key('line-width') \
              and values['line-width'].value + values['outline-width'].value * 2
          color = values.has_key('outline-color') and values['outline-color'].value
  
          opacity = values.has_key('outline-opacity') and values['outline-opacity'].value or None
          join = values.has_key('outline-join') and values['outline-join'].value or None
          cap = values.has_key('outline-cap') and values['outline-cap'].value or None
          dashes = values.has_key('outline-dasharray') and values['outline-dasharray'].value or None
  
          outline_symbolizer = color and width and output.LineSymbolizer(color, width, opacity, join, cap, dashes) or False
          
          if outline_symbolizer or line_symbolizer or inline_symbolizer:
              rules.append(make_rule(filter, outline_symbolizer, line_symbolizer, inline_symbolizer))
  
      return rules