Given a path to a KML file, convert it to one or several GeoJSON FeatureCollection files and save the result(s) to the given output directory.

    If not ``separate_folders`` (the default), then create one GeoJSON file.
    Otherwise, create several GeoJSON files, one for each folder in the KML file that contains geodata or that has a descendant node that contains geodata.
    Warning: this can produce GeoJSON files with the same geodata in case the KML file has nested folders with geodata.

    If a ``style_type`` is given, then also build a JSON style file of the given style type and save it to the output directory under the name given by ``style_filename``.

def convert(kml_path, output_dir, separate_folders=False,
  style_type=None, style_filename='style.json'):
    """
    Given a path to a KML file, convert it to one or several GeoJSON FeatureCollection files and save the result(s) to the given output directory.

    If not ``separate_folders`` (the default), then create one GeoJSON file.
    Otherwise, create several GeoJSON files, one for each folder in the KML file that contains geodata or that has a descendant node that contains geodata.
    Warning: this can produce GeoJSON files with the same geodata in case the KML file has nested folders with geodata.

    If a ``style_type`` is given, then also build a JSON style file of the given style type and save it to the output directory under the name given by ``style_filename``.
    """
    # Create absolute paths
    kml_path = Path(kml_path).resolve()
    output_dir = Path(output_dir)
    if not output_dir.exists():
        output_dir.mkdir()
    output_dir = output_dir.resolve()

    # Parse KML
    with kml_path.open(encoding='utf-8', errors='ignore') as src:
        kml_str = src.read()
    root = md.parseString(kml_str)

    # Build GeoJSON layers
    if separate_folders:
        layers = build_layers(root)
    else:
        layers = [build_feature_collection(root, name=kml_path.stem)]

    # Create filenames for layers
    filenames = disambiguate(
      [to_filename(layer['name'])
      for layer in layers])
    filenames = [name + '.geojson' for name in filenames]

    # Write layers to files
    for i in range(len(layers)):
        path = output_dir/filenames[i]
        with path.open('w') as tgt:
            json.dump(layers[i], tgt)

    # Build and export style file if desired
    if style_type is not None:
        if style_type not in STYLE_TYPES:
            raise ValueError('style type must be one of {!s}'.format(
              STYLE_TYPES))
        builder_name = 'build_{!s}_style'.format(style_type)
        style_dict = globals()[builder_name](root)
        path = output_dir/style_filename
        with path.open('w') as tgt:
            json.dump(style_dict, tgt)