ePub XHTML Visual Editor
  • HTML 46.2%
  • C 29.2%
  • C++ 19.1%
  • Ragel 3.1%
  • Python 1.6%
  • Other 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-01 09:37:03 -04:00
.github/workflows Prevent secure remote access AppImage crash 2026-08-31 13:42:14 -04:00
ci_scripts Update winget manifest schema [skip ci] 2026-03-20 15:42:44 -04:00
dark remove hard coding of dockwidget icon size in classic dark mode 2024-08-12 09:09:24 -04:00
dictionaries Merge commit 'e614bf66f6' as 'dictionaries' 2019-07-23 22:24:16 -04:00
examples Squashed 'gumbo_subtree/' changes from 189aee2..c5a9d1b 2024-12-02 16:29:21 -05:00
gumbo_subtree Merge commit '3f57fd519a' 2024-12-02 16:29:21 -05:00
icons Preliminary print suport 2021-02-07 16:37:50 -05:00
installer Change installer images [skip ci] 2026-09-01 09:37:03 -04:00
javascript upgrade to jquery-3.6.4 for security fixes 2023-07-05 18:53:55 -04:00
platform update for mac ci builds and ChangeLog.txt [skip ci] 2026-02-09 11:53:22 -05:00
screencaps add more screencaps for README 2022-05-10 11:52:04 -04:00
ts prep for fast follow-on release [skip ci] 2026-03-18 11:10:17 -04:00
.gitignore Add script to build appimage in docker [skip ci] 2025-08-20 12:26:28 -04:00
.retired_appveyor.yml Try to fix win/lin CI [deploy] 2021-07-10 09:51:31 -04:00
.retired_travis.yml Retire travis-ci [deploy] 2020-12-23 18:31:47 -05:00
AppearanceWidget.cpp Remove vestigial highdpi stuff 2024-07-29 14:55:33 -04:00
AppearanceWidget.h Remove vestigial highdpi stuff 2024-07-29 14:55:33 -04:00
AppEventFilter.cpp start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
AppEventFilter.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
ChangeLog.txt Tweak ChangeLog.txt [skip ci] 2026-03-19 08:52:29 -04:00
ClassInfo.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
ClassInfo.h support Autofill with CSS Classes in the ClipEditor 2023-07-08 17:12:11 -04:00
ClipEditor.cpp make multi-platform safe fix for QMessageBox not returning focus on macos 2023-09-05 13:17:10 -04:00
ClipEditor.h support Autofill with CSS Classes in the ClipEditor 2023-07-08 17:12:11 -04:00
ClipEditor.ui add prelim support for ClipsWindow dockwidget to PageEdit 2023-07-08 12:49:18 -04:00
ClipEditorModel.cpp Make share/pagedit relocatable like Sigil's 2025-08-17 18:03:18 -04:00
ClipEditorModel.h add prelim support for ClipsWindow dockwidget to PageEdit 2023-07-08 12:49:18 -04:00
ClipEditorTreeView.cpp add prelim support for ClipsWindow dockwidget to PageEdit 2023-07-08 12:49:18 -04:00
ClipEditorTreeView.h add prelim support for ClipsWindow dockwidget to PageEdit 2023-07-08 12:49:18 -04:00
ClipsWindow.cpp add prelim support for ClipsWindow dockwidget to PageEdit 2023-07-08 12:49:18 -04:00
ClipsWindow.h add prelim support for ClipsWindow dockwidget to PageEdit 2023-07-08 12:49:18 -04:00
CMakeLists.txt prep for fast follow-on release [skip ci] 2026-03-18 11:10:17 -04:00
CMakeLists6.txt Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
COPYING.txt add GPL3 license 2019-05-07 22:28:43 -04:00
docker-compose.yml Fix typo [skip ci] 2025-08-23 10:42:33 -04:00
ElementIndex.h fix licenses and clean up other leftover uses of Sigil 2019-05-11 16:10:15 -04:00
FindReplace.cpp Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
FindReplace.h Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
FindReplace.ui Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
FocusSelectLineEdit.cpp first shot at adding SearchToolbar capability 2019-07-22 22:15:09 -04:00
FocusSelectLineEdit.h first shot at adding SearchToolbar capability 2019-07-22 22:15:09 -04:00
GeneralSettings.cpp add Preference setting to disable gpu acceleration 2022-06-05 16:05:19 -04:00
GeneralSettings.h add Preference setting to disable gpu acceleration 2022-06-05 16:05:19 -04:00
GumboInterface.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
GumboInterface.h sync with Sigil version of same to make support easier 2020-11-10 20:42:46 -05:00
HTMLEncodingResolver.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
HTMLEncodingResolver.h make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
Inspector.cpp bring Sigil WebProfileMgr improvements to PageEdit 2025-09-16 21:45:58 -04:00
Inspector.h bring Sigil WebProfileMgr improvements to PageEdit 2025-09-16 21:45:58 -04:00
macos_menu_and_window_fixes.mm macOS prevent Window to Tab crap 2019-08-06 19:38:25 -04:00
main.cpp Add ability to unset vars with env-vars.txt 2026-03-17 13:45:15 -04:00
main.ui Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
MainApplication.cpp bring over light vs dark improvements from Sigil to PE 2025-05-05 11:06:26 -04:00
MainApplication.h bring WebProfileMgr improvements from Sigil into PageEdit 2026-02-10 17:32:08 -05:00
MainWindow.cpp Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
MainWindow.h Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
OPFReader.cpp support Autofill with CSS Classes in the ClipEditor 2023-07-08 17:12:11 -04:00
OPFReader.h support Autofill with CSS Classes in the ClipEditor 2023-07-08 17:12:11 -04:00
pageedit_constants.cpp Make share/pagedit relocatable like Sigil's 2025-08-17 18:03:18 -04:00
pageedit_constants.h Make share/pagedit relocatable like Sigil's 2025-08-17 18:03:18 -04:00
pageedit_exception.h add basic Preferences Dialog support to PageEdit 2019-05-10 16:41:26 -04:00
PAppearanceWidget.ui Remove vestigial highdpi stuff 2024-07-29 14:55:33 -04:00
PEDarkStyle.cpp Refactor built-in dark theme 2020-06-11 18:13:03 -04:00
PEDarkStyle.h Refactor built-in dark theme 2020-06-11 18:13:03 -04:00
PGeneralSettings.ui add Preference setting to disable gpu acceleration 2022-06-05 16:05:19 -04:00
Preferences.cpp Fix Linux button and remove a Linux Warning [deploy] 2024-07-29 15:14:14 -04:00
Preferences.h bring multiple ResultAction Preference behaviour over form Sigil 2020-01-28 11:06:05 -05:00
Preferences.ui Remove extra Reset button caused bu last commit [deploy] 2024-07-29 16:53:01 -04:00
PreferencesWidget.h bring multiple ResultAction Preference behaviour over form Sigil 2020-01-28 11:06:05 -05:00
QuickParser.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
QuickParser.h make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
README.md Corrected syntax in instructions for building from source on Linux 2026-08-01 22:50:40 -05:00
SearchOperations.cpp Apply Sigil text-only search prefix and restore SearchToolbar sources. 2026-06-07 21:10:09 +02:00
SearchOperations.h Add literal-only Find/Replace for visual OCR proofreading. 2026-06-07 13:48:41 +02:00
SearchToolbar.cpp Apply Sigil text-only search prefix and restore SearchToolbar sources. 2026-06-07 21:10:09 +02:00
SearchToolbar.h Apply Sigil text-only search prefix and restore SearchToolbar sources. 2026-06-07 21:10:09 +02:00
SearchToolbar.ui Apply Sigil text-only search prefix and restore SearchToolbar sources. 2026-06-07 21:10:09 +02:00
SelectCharacter.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
SelectCharacter.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
SelectCharacter.ui Initial versions 2019-05-07 22:23:40 -04:00
SelectFiles.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
SelectFiles.h sync bug fixes from Sigil SelectFiles to PageEdit 2024-07-25 15:49:52 -04:00
SelectFiles.ui sync bug fixes from Sigil SelectFiles to PageEdit 2024-07-25 15:49:52 -04:00
SelectHyperlink.cpp do not add PageEdit_Injected targets to SelectHyperlink 2021-07-08 12:32:33 -04:00
SelectHyperlink.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
SelectHyperlink.ui add preliminary support for inserting ids and hyperlinks 2019-12-08 20:01:31 -05:00
SelectId.cpp start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
SelectId.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
SelectId.ui add preliminary support for inserting ids and hyperlinks 2019-12-08 20:01:31 -05:00
SettingsStore.cpp Remove vestigial highdpi stuff 2024-07-29 14:55:33 -04:00
SettingsStore.h Remove vestigial highdpi stuff 2024-07-29 14:55:33 -04:00
SimplePage.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
SimplePage.h bring in WebProfileMgr to fix crashes and pdf 2023-07-30 14:46:26 -04:00
TagAtts.cpp fix poor or missing svg thumbnails when selecting images to insert 2024-02-15 12:58:17 -05:00
TagAtts.h fix poor or missing svg thumbnails when selecting images to insert 2024-02-15 12:58:17 -05:00
TagLister.cpp pull in TagLister fixes from Sigil to improve syncing 2025-06-02 09:00:54 -04:00
TagLister.h revert to earlier but simpler algorithm for CV PE syncing 2025-05-25 17:00:51 -04:00
UIDictionary.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
UIDictionary.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
UILanguage.cpp Make share/pagedit relocatable like Sigil's 2025-08-17 18:03:18 -04:00
UILanguage.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
URLInterceptor.cpp bring in hardened topLevelWidgets implementation from Sigil 2022-05-09 10:06:37 -04:00
URLInterceptor.h Use modified URLInterceptor approach to help secure PageEdit 2020-06-11 10:33:26 -04:00
Utility.cpp use env-vars.txt with PageEdit too 2025-08-21 09:52:37 -04:00
Utility.h use env-vars.txt with PageEdit too 2025-08-21 09:52:37 -04:00
version.rc.in Add Windows version info 2019-05-10 10:37:20 -04:00
Viewer.h start the changes to support Qt5 and Qt6 in PageEdit 2021-12-23 12:50:20 -05:00
WebPageEdit.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
WebPageEdit.h bring in WebProfileMgr to fix crashes and pdf 2023-07-30 14:46:26 -04:00
WebProfileMgr.cpp bring WebProfileMgr improvements from Sigil into PageEdit 2026-02-10 17:32:08 -05:00
WebProfileMgr.h bring Sigil WebProfileMgr improvements to PageEdit 2025-09-16 21:45:58 -04:00
WebViewEdit.cpp allow heading tool to work on bare text in body 2026-01-19 10:40:54 -05:00
WebViewEdit.h make PageEdit sync cursor pos with Sigil CV editor 2025-05-08 20:56:10 -04:00
webviewprinter.cpp make Qt6 only, remove Core5Compat, update for NFC, update Dark Mode 2024-07-26 11:30:34 -04:00
webviewprinter.h Print Webview candidate [deploy] 2021-02-20 15:53:17 -05:00
Zoomable.h fix licenses and clean up other leftover uses of Sigil 2019-05-11 16:10:15 -04:00

PageEdit

An ePub visual XHTML editor based on Sigil's Deprecated BookView. It uses WebEngine instead of WebKit.

This app is working and fundamentally complete.

PageEdit PageEdit Visual WYSIWYG XHtml Editor

PageEdit PageEdit in Dark Mode

PageEdit Using the Inspector

PageEdit Insert Images

PageEdit Insert Special Characters

PageEdit Add Links

It prefers Qt 6.10.2 or later but can still be built with Qt 6.4.2.

Building on macOS

You will need cmake version 3.18 or later to build:

You build in a separate directory and not in the source directory.

After checking out the PageEdit github repo into a PageEdit directory

export MACOSX_DEPLOYMENT_TARGET=13.0
export MYQTHOME=~/Qt102
export PATH=${PATH}:${MYQTHOME}/bin:${MYQTHOME}/libexec
mkdir build
cd build
cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS=-Wno-inconsistent-missing-override \
-DCMAKE_PREFIX_PATH=${MYQTHOME}/lib/cmake \
-DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/\
MacOSX.platform/Developer/SDKs/MacOSX15.sdk/ ../PageEdit
make
make addframeworks
cd bin
open -a /FULL_PATH_TO_THIS_DIRECTORY/PageEdit.app /FULL_PATH_TO_AN_XHTML_FILE_IN_AN_UNZIPPED_EPUB/FILENAME.xhtml
or simply drag and drop an xhtml file from an unzipped epub onto the PageEdit.app
``
or edit a set of XHtml files in epub Spine Order by loading the ePub's OPF file

On Linux

Make sure a minimum of Qt6.4.2(ish) is installed (with the WebEngine package) as well as cmake.
You build in a separate directory and not in the source directory.

Qt 6.10.2 or later is preferred.

Get the PageEdit Source:

git clone https://github.com/sigil-ebook/PageEdit.git
(or download/extract the gzipped tarball from a PageEdit Release)
cd PageEdit

Ubuntu

sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install qt6-webengine-dev qt6-webengine-dev-tools qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-svg-dev

mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../<path/to/PageEdit/source>
make

Arch Linux

sudo pacman -S cmake qt6-webengine qt6-tools qt6-svg

mkdir build
cd build
cmake -G "Unix Makefiles" -DINSTALL_BUNDLED_DICTS=0 -DCMAKE_BUILD_TYPE=Release ../<path/to/PageEdit/source>
make

All Flavors:

To test cd bin
./pageedit /FULL_PATH_TO_AN_XHTML_FILE_IN_AN_UNZIPPED_EPUB/FILENAME.xhtml

make install (defaults to the /usr/local prefix, so use sudo if required).

By default, bundled hunspell dictionaries are converted to webengine spell check dictionaries (with qt tools) and installed to the QT_INSTALL_DATA/qtwebengine_dictionaries location. This location can be found using the qmake binary (of the Qt you're building PageEdit with) with the following command -qmake -query QT_INSTALL_DATA . If using the system Qt, this will typically be /usr/share/qt/qtwebengine_dictionaries. To disable the conversion/installation of these bundled dictionaries, use -DNSTALL_BUNDLED_DICTS=0 when configuring PageEdit with cmake. Arch Linux already includes these dictionaries with the corresponding hunspell language dictionaries. So you'll want to skip their conversion/installation on Arch and make sure you have the correct hunspell languages installed instead.

On Windows:

Qt6.10.2 or higher is preferred, but you'll want to maintain a minimum of Qt6.4.2 (with the WebEngine component) if you want to take advantage of all features. A minimum of Visual Studio 2022 is required if you want to use Qt6.10.2. At the time of this writing Qt6.10.2 is included in the official installer. Install cmake 3.18+ and make sure its bin directory is added to your path.

Make sure that Qt's bin directory is also added to your PATH. Take note of the path for your Qt's prefix (the directory right above the bin directory). Open an "x64 Native Tools Command Prompt for VS2022" from the Start menu and cd to wherever you want to build.

mkdir build
cd build
cmake -G "NMake Makefiles" -DQt6_DIR="C:\path\to\your\Qt6\prefix\lib\cmake\Qt6 -DCMAKE_BUILD_TYPE=Release "C:\path\to\PageEdit's\cloned\repository"
nmake

To test: cd bin
PageEdit.exe \FULL_PATH_TO_AN_XHTML_FILE_IN_AN_UNZIPPED_EPUB\FILENAME.xhtml

Use nmake deployzip to package PageEdit as a zip archive (in a newly created 'deploy' folder in the build folder)

Use nmake deployinstaller to package PageEdit and all of its dependencies into an Inno Setup installer (must have InnoSetup installed and on the PATH for this to work).

NOTE: if you configure PageEdit with the -DDEPLOY_SFX=1 cmake option before compiling, 'nmake deployzip` will attempt to create a 7-Zip self-extracting archive. So naturally, make sure 7-Zip is installed before trying to use it.

NOTE: as of this writing, the Official PageEdit release are built using Qt6.10.2

For Github repository maintainers (who am I kidding, this is to keep myself from forgetting/messing up):

The upstream sigil-gumbo repository is included in PageEdit's repository (this one) as a subtree in the gumbo_subtree prefix. To pull in upstream sigil-gumbo changes (or even to safely check if there are any), use the following command in the root of your local clone of the PageEdit repo:

git subtree pull --prefix gumbo_subtree https://github.com/Sigil-Ebook/sigil-gumbo.git master --squash

--squash because we don't need sigil-gumbo's entire history in the PageEdit repository. Push the changes to github master (with a commit message like "merge in upstream sigil-gumbo changes") if there are any.

You can also create a remote for the upstream sigil-gumbo repo to simplify the subtree pull command a bit -- BUT YOU MUST REMEMBER TO USE THE --no-tags OPTION WHEN CREATING THE REMOTE. Otherwise the --squash option may not suppress all upstream history when using the remote name. A careless git fetch --all could make a dog's lunch of your repo history with a very taggy remote (which sigil-gumbo is decidedly not):

git remote add --no-tags sigil-gumbo https://github.com/Sigil-Ebook/sigil-gumbo.git

After that, pulling in any upstream sigil-gumbo changes becomes:

git subtree pull --prefix gumbo_subtree sigil-gumbo master --squash

Probably safer in the long run to create a git alias specific to the PageEdit repository (without a remote added) using the full subtree pull command if you need a shortcut. From within the PageEdit repo:

git config alias.gumbo-sub-pull 'subtree pull --prefix gumbo_subtree https://github.com/Sigil-Ebook/sigil-gumbo.git master --squash'

Use any alias name you like. I chose "gumbo-sub-pull" Then it's simply a matter of using git gumbo-sub-pull in the root of the PageEdit repository.

Building the PageEdit AppImage on Linux

General Overview

Warning! Do not attempt to run any of these scripts outside of a Docker container. Doing so could damage your system. All scripts provided are intended to be used inside of a temporary docker container that will be removed after the process completes.

The only requirement for building the PageEdit Linux AppImage is having Docker installed/configured and having an internet connection. How to get Docker installed and configured on your system is beyond the scope of this document. Every distro is different, so you're on your own there. Everything after this assumes that Docker is ready to go. Typing docker info in a terminal should verify everything is ready.

There are two separate pieces that are needed for building the AppImage. These are a custom build of Python and a custom build of QtWebEngine. The custom Python is only used to get later versions of Qt installed in the Docker container. The AppImage build process will automatically download these pieces from my personal github repository. The files used from there are sigilpython3.*.*.tar.gz and appimagewebengine6*.tar.gz. These two pieces can also be fairly easily built if you wish. Should you desire to build everything from scratch, the instructions to do so are in the matching document in the Sigil AppImage build instructions in the Sigil repository.

The building of the PageEdit AppImage takes place entirely within a docker container built from a stock Ubuntu 22.04 image. No system changes or updates will be made to your host system during this process. Once the Docker process completes, the PageEdit AppImage (and its corresonding zsync file) will be found in in the same directory the build process was launched from.

Everything is done by entering commands in a terminal.

Get PageEdit's Source

You can either download PageEdit's source code from GitHub, or you can clone PageEdit's repository using git git clone https://github.com/Sigil-Ebook/PageEdit.git pageedit. Your choice. These built pieces will be ignored by git, so don't worry about contaminating the source tree.

CD to the root of PageEdit's source

cd pageedit or cd pageedit-master or whatever. You need to be in the same directory that PageEdit's README.md, ChangeLog.txt, and docker-compose.yml files are in.

Build the AppImage

If you have docker-compose installed, you can build the AppImage with the following simple command:

docker compose run --rm build_appimage

If you don't have docker-compose installed, use the following command instead:

docker run --rm -v $PWD:/reporoot ubuntu:22.04 /reporoot/.github/workflows/build_pageedit_appimage.sh

Once completed, the PageEdit-*-x86_64.AppImage file (as well as the PageEdit-*-x86_64.AppImage.zsync file - which can be safely ignored/removed) will be located in the current directory. Depending on how your docker permissions are configured, you may need to take ownership of the file(s) with sudo chown <user>:<user> PageEdit-*AppImage*. The file should already be executable, but if not just fix it up with chmod a+x PageEdit-*AppImage.