FluentUI/create-fluent-app.py
yxdy a44db97aa3
Some checks failed
Gallery App Build / Windows (push) Has been cancelled
Gallery App Build / macOS (push) Has been cancelled
Gallery App Build / Ubuntu (push) Has been cancelled
init
2025-02-12 10:31:20 +08:00

114 lines
5.6 KiB
Python

import argparse
import shutil
import sys
from pathlib import Path
from textwrap import dedent
import string
class CustomTemplate(string.Template):
delimiter = '@' # 使用自定义的占位符,例如@{}
def generateTemplateFile(source, dist, _mapping):
source_path = Path(source).absolute()
dist_path = Path(dist).absolute()
with open(source_path, 'r', encoding='utf-8') as _file:
content = _file.read()
template = CustomTemplate(content)
rendered_content = template.substitute(_mapping)
dist_path.parent.mkdir(parents=True, exist_ok=True)
with open(dist_path, 'w', encoding='utf-8') as _file:
_file.write(rendered_content)
TOOL_DESCRIPTION = dedent("""
create-fluent-app: A tool to bootstrap and manage Fluent UI applications.
This script provides an easy way to set up a new Fluent UI application with
predefined configurations and templates. It helps streamline the process of
creating and managing Fluent UI projects by automating repetitive tasks and
ensuring consistency across projects.
Usage examples:
1. To create a new Fluent UI project:
python create-fluent-app.py --name MyApp
2. To specify an output directory:
python create-fluent-app.py --out /path/to/output/dir
""")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=TOOL_DESCRIPTION)
parser.add_argument("-n", "--name", required=True,
help="Specify the name of the Fluent UI application to be created.")
parser.add_argument("-o", "--out", required=True,
help="Specify the output directory where the project will be created.")
args = parser.parse_args()
app_name = args.name
output_dir = Path(args.out)
project_dir = output_dir / app_name
project_sub_dir = output_dir / app_name / app_name
project_cmake_dir = project_sub_dir / '.cmake'
project_favicon_dir = project_sub_dir / 'favicon'
if not output_dir.is_dir():
print(f"Error: The specified output directory '{output_dir}' is not a valid directory.")
sys.exit(1)
if project_dir.exists():
print(f"Error: The project '{app_name}' already exists in the directory '{output_dir}'.")
sys.exit(1)
try:
project_dir.mkdir(parents=True, exist_ok=False)
project_cmake_dir.mkdir(parents=True, exist_ok=False)
project_favicon_dir.mkdir(parents=True, exist_ok=False)
except Exception as e:
print(f"Error: Failed to create the project directory '{project_dir}'. {e}")
try:
shutil.copytree(Path('FluentUI'), project_dir / 'FluentUI')
except Exception as e:
print(f"Error: Failed to copy FluentUI files to the project directory. {e}")
sys.exit(1)
try:
shutil.copytree(Path('Gallery/runtime'), project_sub_dir / 'runtime')
except Exception as e:
print(f"Error: Failed to copy runtime files to the project directory. {e}")
sys.exit(1)
shutil.copytree(Path('designer'), project_dir / 'designer')
shutil.copy(Path('.gitignore'), project_dir)
shutil.copy(Path('.clang-format'), project_dir)
shutil.copy(Path('Gallery/favicon/favicon.ico'), project_favicon_dir)
shutil.copy(Path('Gallery/favicon/favicon.png'), project_favicon_dir)
shutil.copy(Path('Gallery/favicon/favicon.icns'), project_favicon_dir)
shutil.copy(Path('.template/logo.png'), project_sub_dir)
shutil.copy(Path('.template/en_US.ts'), project_sub_dir / (app_name + '_en_US.ts'))
shutil.copy(Path('.template/zh_CN.ts'), project_sub_dir / (app_name + '_zh_CN.ts'))
shutil.copy(Path('.template/en_US.qm'), project_sub_dir / (app_name + '_en_US.qm'))
shutil.copy(Path('.template/zh_CN.qm'), project_sub_dir / (app_name + '_zh_CN.qm'))
shutil.copy(Path('Gallery/.cmake/InstallerScript.iss.in'), project_cmake_dir / 'InstallerScript.iss.in')
shutil.copy(Path('Gallery/.cmake/MacOSXBundleInfo.plist.in'), project_cmake_dir / 'MacOSXBundleInfo.plist.in')
shutil.copy(Path('Gallery/.cmake/win_app.rc.in'), project_cmake_dir / 'win_app.rc.in')
shutil.copy(Path('Gallery/.cmake/linux.desktop.in'), project_cmake_dir / 'linux.desktop.in')
shutil.copy(Path('Gallery/.cmake/linux_control.in'), project_cmake_dir / 'linux_control.in')
shutil.copy(Path('Gallery/.cmake/linux_postinst.in'), project_cmake_dir / 'linux_postinst.in')
shutil.copy(Path('Gallery/.cmake/linux_postrm.in'), project_cmake_dir / 'linux_postrm.in')
mapping = dict(application_name=app_name)
generateTemplateFile(Path('.template/RootCMakeLists.txt.in'), project_dir / 'CMakeLists.txt', mapping)
generateTemplateFile(Path('.template/stdafx.h.in'), project_sub_dir / 'stdafx.h', mapping)
generateTemplateFile(Path('.template/App.qml.in'), project_sub_dir / 'App.qml', mapping)
generateTemplateFile(Path('.template/MainScreen.qml.in'), project_sub_dir / 'MainScreen.qml', mapping)
generateTemplateFile(Path('.template/MainWindow.qml.in'), project_sub_dir / 'MainWindow.qml', mapping)
generateTemplateFile(Path('.template/AppInfo.cpp.in'), project_sub_dir / 'AppInfo.cpp', mapping)
generateTemplateFile(Path('.template/AppInfo.h.in'), project_sub_dir / 'AppInfo.h', mapping)
generateTemplateFile(Path('.template/CMakeLists.txt.in'), project_sub_dir / 'CMakeLists.txt', mapping)
generateTemplateFile(Path('.template/Log.h.in'), project_sub_dir / 'Log.h', mapping)
generateTemplateFile(Path('.template/Log.cpp.in'), project_sub_dir / 'Log.cpp', mapping)
generateTemplateFile(Path('.template/main.cpp.in'), project_sub_dir / 'main.cpp', mapping)
print(f"Creating project '{app_name}' in '{output_dir}'.")