Vitepress conversion of docs. (#23795)
This commit is contained in:
		
							parent
							
								
									395766657f
								
							
						
					
					
						commit
						6ef9717288
					
				
					 357 changed files with 3611 additions and 24208 deletions
				
			
		| 
						 | 
				
			
			@ -1,44 +1,27 @@
 | 
			
		|||
"""Serve QMK documentation locally
 | 
			
		||||
"""
 | 
			
		||||
import http.server
 | 
			
		||||
import os
 | 
			
		||||
import shutil
 | 
			
		||||
import webbrowser
 | 
			
		||||
from qmk.docs import prepare_docs_build_area, run_docs_command
 | 
			
		||||
 | 
			
		||||
from milc import cli
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@cli.argument('-p', '--port', default=8936, type=int, help='Port number to use.')
 | 
			
		||||
@cli.argument('-b', '--browser', action='store_true', help='Open the docs in the default browser.')
 | 
			
		||||
@cli.subcommand('Run a local webserver for QMK documentation.', hidden=False if cli.config.user.developer else True)
 | 
			
		||||
def docs(cli):
 | 
			
		||||
    """Spin up a local HTTP server for the QMK docs.
 | 
			
		||||
    """
 | 
			
		||||
    os.chdir('docs')
 | 
			
		||||
 | 
			
		||||
    # If docsify-cli is installed, run that instead so we get live reload
 | 
			
		||||
    if shutil.which('docsify'):
 | 
			
		||||
        command = ['docsify', 'serve', '--port', f'{cli.config.docs.port}', '--open' if cli.config.docs.browser else '']
 | 
			
		||||
    if not shutil.which('doxygen'):
 | 
			
		||||
        cli.log.error('doxygen is not installed. Please install it and try again.')
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
        cli.log.info(f"Running {{fg_cyan}}{str.join(' ', command)}{{fg_reset}}")
 | 
			
		||||
        cli.log.info("Press Control+C to exit.")
 | 
			
		||||
    if not shutil.which('yarn'):
 | 
			
		||||
        cli.log.error('yarn is not installed. Please install it and try again.')
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            cli.run(command, capture_output=False)
 | 
			
		||||
        except KeyboardInterrupt:
 | 
			
		||||
            cli.log.info("Stopping HTTP server...")
 | 
			
		||||
    else:
 | 
			
		||||
        # Fall back to Python HTTPServer
 | 
			
		||||
        with http.server.HTTPServer(('', cli.config.docs.port), http.server.SimpleHTTPRequestHandler) as httpd:
 | 
			
		||||
            cli.log.info(f"Serving QMK docs at http://localhost:{cli.config.docs.port}/")
 | 
			
		||||
            cli.log.info("Press Control+C to exit.")
 | 
			
		||||
    if not prepare_docs_build_area(is_production=False):
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
            if cli.config.docs.browser:
 | 
			
		||||
                webbrowser.open(f'http://localhost:{cli.config.docs.port}')
 | 
			
		||||
 | 
			
		||||
            try:
 | 
			
		||||
                httpd.serve_forever()
 | 
			
		||||
            except KeyboardInterrupt:
 | 
			
		||||
                cli.log.info("Stopping HTTP server...")
 | 
			
		||||
            finally:
 | 
			
		||||
                httpd.shutdown()
 | 
			
		||||
    if not cli.config.general.verbose:
 | 
			
		||||
        cli.log.info('Serving docs at http://localhost:5173/ (Ctrl+C to stop)')
 | 
			
		||||
    run_docs_command('run', 'docs:dev')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,12 @@
 | 
			
		|||
"""Build QMK documentation locally
 | 
			
		||||
"""
 | 
			
		||||
import shutil
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from subprocess import DEVNULL
 | 
			
		||||
from qmk.docs import prepare_docs_build_area, run_docs_command, BUILD_DOCS_PATH
 | 
			
		||||
 | 
			
		||||
from milc import cli
 | 
			
		||||
 | 
			
		||||
DOCS_PATH = Path('docs/')
 | 
			
		||||
BUILD_PATH = Path('.build/')
 | 
			
		||||
BUILD_DOCS_PATH = BUILD_PATH / 'docs'
 | 
			
		||||
DOXYGEN_PATH = BUILD_PATH / 'doxygen'
 | 
			
		||||
MOXYGEN_PATH = BUILD_DOCS_PATH / 'internals'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@cli.argument('-s', '--serve', arg_only=True, action='store_true', help="Serves the generated docs once built.")
 | 
			
		||||
@cli.subcommand('Build QMK documentation.', hidden=False if cli.config.user.developer else True)
 | 
			
		||||
def generate_docs(cli):
 | 
			
		||||
    """Invoke the docs generation process
 | 
			
		||||
| 
						 | 
				
			
			@ -21,24 +15,22 @@ def generate_docs(cli):
 | 
			
		|||
        * [ ] Add a real build step... something static docs
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    if BUILD_DOCS_PATH.exists():
 | 
			
		||||
        shutil.rmtree(BUILD_DOCS_PATH)
 | 
			
		||||
    if DOXYGEN_PATH.exists():
 | 
			
		||||
        shutil.rmtree(DOXYGEN_PATH)
 | 
			
		||||
    if not shutil.which('doxygen'):
 | 
			
		||||
        cli.log.error('doxygen is not installed. Please install it and try again.')
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    shutil.copytree(DOCS_PATH, BUILD_DOCS_PATH)
 | 
			
		||||
    if not shutil.which('yarn'):
 | 
			
		||||
        cli.log.error('yarn is not installed. Please install it and try again.')
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    # When not verbose we want to hide all output
 | 
			
		||||
    args = {
 | 
			
		||||
        'capture_output': False if cli.config.general.verbose else True,
 | 
			
		||||
        'check': True,
 | 
			
		||||
        'stdin': DEVNULL,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cli.log.info('Generating docs...')
 | 
			
		||||
 | 
			
		||||
    # Generate internal docs
 | 
			
		||||
    cli.run(['doxygen', 'Doxyfile'], **args)
 | 
			
		||||
    cli.run(['moxygen', '-q', '-g', '-o', MOXYGEN_PATH / '%s.md', DOXYGEN_PATH / 'xml'], **args)
 | 
			
		||||
    if not prepare_docs_build_area(is_production=True):
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    cli.log.info('Building vitepress docs')
 | 
			
		||||
    run_docs_command('run', 'docs:build')
 | 
			
		||||
    cli.log.info('Successfully generated docs to %s.', BUILD_DOCS_PATH)
 | 
			
		||||
 | 
			
		||||
    if cli.args.serve:
 | 
			
		||||
        if not cli.config.general.verbose:
 | 
			
		||||
            cli.log.info('Serving docs at http://localhost:4173/ (Ctrl+C to stop)')
 | 
			
		||||
        run_docs_command('run', 'docs:preview')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,7 +133,7 @@ def _question(*args, **kwargs):
 | 
			
		|||
def prompt_keyboard():
 | 
			
		||||
    prompt = """{fg_yellow}Name Your Keyboard Project{style_reset_all}
 | 
			
		||||
For more infomation, see:
 | 
			
		||||
https://docs.qmk.fm/#/hardware_keyboard_guidelines?id=naming-your-keyboardproject
 | 
			
		||||
https://docs.qmk.fm/hardware_keyboard_guidelines#naming-your-keyboard-project
 | 
			
		||||
 | 
			
		||||
Keyboard Name? """
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										61
									
								
								lib/python/qmk/docs.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								lib/python/qmk/docs.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
"""Handlers for the QMK documentation generator (docusaurus).
 | 
			
		||||
"""
 | 
			
		||||
import shutil
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from subprocess import DEVNULL
 | 
			
		||||
from os import chdir, environ, makedirs, pathsep
 | 
			
		||||
from milc import cli
 | 
			
		||||
 | 
			
		||||
from qmk.constants import QMK_FIRMWARE
 | 
			
		||||
 | 
			
		||||
DOCS_PATH = QMK_FIRMWARE / 'docs'
 | 
			
		||||
BUILDDEFS_PATH = QMK_FIRMWARE / 'builddefs' / 'docsgen'
 | 
			
		||||
BUILD_PATH = QMK_FIRMWARE / '.build'
 | 
			
		||||
CACHE_PATH = BUILD_PATH / 'cache'
 | 
			
		||||
NODE_MODULES_PATH = BUILD_PATH / 'node_modules'
 | 
			
		||||
BUILD_DOCS_PATH = BUILD_PATH / 'docs'
 | 
			
		||||
DOXYGEN_PATH = BUILD_DOCS_PATH / 'static' / 'doxygen'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def run_docs_command(verb, cmd=None):
 | 
			
		||||
    environ['PATH'] += pathsep + str(NODE_MODULES_PATH / '.bin')
 | 
			
		||||
 | 
			
		||||
    args = {'capture_output': False if cli.config.general.verbose else True, 'check': True, 'stdin': DEVNULL}
 | 
			
		||||
    docs_env = environ.copy()
 | 
			
		||||
    if cli.config.general.verbose:
 | 
			
		||||
        docs_env['DEBUG'] = 'vitepress:*,vite:*'
 | 
			
		||||
    args['env'] = docs_env
 | 
			
		||||
 | 
			
		||||
    arg_list = ['yarn', verb]
 | 
			
		||||
    if cmd:
 | 
			
		||||
        arg_list.append(cmd)
 | 
			
		||||
 | 
			
		||||
    chdir(BUILDDEFS_PATH)
 | 
			
		||||
    cli.run(arg_list, **args)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def prepare_docs_build_area(is_production):
 | 
			
		||||
    if is_production:
 | 
			
		||||
        # Set up a symlink for docs to be inside builddefs -- vitepress can't handle source files in parent directories
 | 
			
		||||
        try:
 | 
			
		||||
            docs_link = Path(BUILDDEFS_PATH / 'docs')
 | 
			
		||||
            if not docs_link.exists():
 | 
			
		||||
                docs_link.symlink_to(DOCS_PATH)
 | 
			
		||||
        except NotImplementedError:
 | 
			
		||||
            cli.log.error('Symlinks are not supported on this platform.')
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
    if BUILD_DOCS_PATH.exists():
 | 
			
		||||
        shutil.rmtree(BUILD_DOCS_PATH)
 | 
			
		||||
 | 
			
		||||
    # When not verbose we want to hide all output
 | 
			
		||||
    args = {'capture_output': False if cli.config.general.verbose else True, 'check': True, 'stdin': DEVNULL}
 | 
			
		||||
 | 
			
		||||
    makedirs(DOXYGEN_PATH)
 | 
			
		||||
    cli.log.info('Generating doxygen docs at %s', DOXYGEN_PATH)
 | 
			
		||||
    cli.run(['doxygen', 'Doxyfile'], **args)
 | 
			
		||||
 | 
			
		||||
    cli.log.info('Installing vitepress dependencies')
 | 
			
		||||
    run_docs_command('install')
 | 
			
		||||
 | 
			
		||||
    return True
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue