docs: def new_dataset(args):
      """
      lexibank new-dataset OUTDIR [ID]
      """
      if not args.args:
          raise ParserError('you must specify an existing directory')
      outdir = Path(args.args.pop(0))
      if not outdir.exists():
          raise ParserError('you must specify an existing directory')
  
      id_pattern = re.compile('[a-z_0-9]+$')
      md = {}
      if args.args:
          md['id'] = args.args.pop(0)
      else:
          md['id'] = input('Dataset ID: ')
  
      while not id_pattern.match(md['id']):
          print('dataset id must only consist of lowercase ascii letters, digits and _ (underscore)!')
          md['id'] = input('Dataset ID: ')
  
      outdir = outdir / md['id']
      if not outdir.exists():
          outdir.mkdir()
  
      for key in ['title', 'url', 'license', 'conceptlist', 'citation']:
          md[key] = input('Dataset {0}: '.format(key))
  
      # check license!
      # check conceptlist!
  
      for path in Path(pylexibank.__file__).parent.joinpath('dataset_template').iterdir():
          if path.is_file():
              if path.suffix in ['.pyc']:
                  continue  # pragma: no cover
              target = path.name
              content = read_text(path)
              if '+' in path.name:
                  target = re.sub(
                      '\+([a-z]+)\+',
                      lambda m: '{' + m.groups()[0] + '}',
                      path.name
                  ).format(**md)
              if target.endswith('_tmpl'):
                  target = target[:-5]
                  content = content.format(**md)
              write_text(outdir / target, content)
          else:
              target = outdir / path.name
              if target.exists():
                  shutil.rmtree(str(target))
              shutil.copytree(str(path), str(target))
      del md['id']
      jsonlib.dump(md, outdir / 'metadata.json', indent=4)