docs: def init(self, project_name='', template='base', quiet=False, debug=False):
          '''Generate new Foliant project.'''
  
          self.logger.setLevel(DEBUG if debug else WARNING)
  
          self.logger.info('Project creation started.')
  
          self.logger.debug(f'Template: {template}')
  
          template_path = Path(template)
  
          if not template_path.exists():
              self.logger.debug(
                  f'Template not found in {template_path}, looking in installed templates.'
              )
  
              installed_templates_path = Path(Path(__file__).parent / 'templates')
  
              installed_templates = [
                  item.name for item in installed_templates_path.iterdir() if item.is_dir()
              ]
  
              self.logger.debug(f'Available templates: {installed_templates}')
  
              if template in installed_templates:
                  self.logger.debug('Template found.')
  
              else:
                  self.logger.debug('Template not found, asking for user input.')
  
                  try:
                      template = prompt(
                          f'Please pick a template from {installed_templates}: ',
                          completer=WordCompleter(installed_templates),
                          validator=BuiltinTemplateValidator(installed_templates)
                      )
  
                  except KeyboardInterrupt:
                      self.logger.warning('Project creation interrupted.')
                      return
  
              template_path = installed_templates_path / template
  
              self.logger.debug(f'Template path: {template_path}')
  
          if not project_name:
              self.logger.debug('Project name not specified, asking for user input.')
  
              try:
                  project_name = prompt('Enter the project name: ')
  
              except KeyboardInterrupt:
                  self.logger.warning('Project creation interrupted.')
                  return
  
          project_slug = slugify(project_name)
          project_path = Path(project_slug)
  
          properties = {
              'title': project_name,
              'slug': project_slug
          }
  
          self.logger.debug(f'Project properties: {properties}')
  
          result = None
  
          with spinner('Generating project', self.logger, quiet, debug):
              copytree(template_path, project_path)
  
              text_types = '*.md', '*.yml', '*.txt', '*.py'
  
              text_file_paths = reduce(
                  lambda acc, matches: acc + [*matches],
                  (project_path.rglob(text_type) for text_type in text_types),
                  []
              )
  
              for text_file_path in text_file_paths:
                  self.logger.debug(f'Processing content of {text_file_path}')
                  replace_placeholders(text_file_path, properties)
  
              for item in project_path.rglob('*'):
                  self.logger.debug(f'Processing name of {item}')
                  item.rename(Template(item.as_posix()).safe_substitute(properties))
  
              result = project_path
  
          if result:
              self.logger.info(f'Result: {result}')
  
              if not quiet:
                  print('─' * 20)
                  print(f'Project "{project_name}" created in {result}')
              else:
                  print(result)
  
          else:
              self.logger.critical('Project creation failed.')
              exit(1)