<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://poetryappwiki.fonlow.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Poetry MP Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://poetryappwiki.fonlow.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/wiki/Special:Contributions/Admin"/>
	<updated>2026-04-19T05:38:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=259</id>
		<title>Live Examples</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=259"/>
		<updated>2026-02-19T10:49:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[https://poetryapptest.fonlow.org/ &#039;&#039;&#039;Edgar Allan Poe&#039;&#039;&#039;] &lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/byron/ George Gordon Byron] read only&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://zijianhuang.github.io/poets/ Poetry Collections of Poets hosted on GitHub], [http://fonlow.poets.s3-website-ap-southeast-2.amazonaws.com/ on AWS],  and [https://thankful-grass-0793a2d1e.2.azurestaticapps.net/ on Azure] read only&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While the full app is designed for one poet, the static read only variant of the app Poetry Viewer may contain collections of poets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Poetry MP supports backup through exporting data and settings to a JSON file. And you may import the JSON file to an empty database for restore.&lt;br /&gt;
&lt;br /&gt;
You may play the full app through running it as a local app. After [[Download]] and [[Deployment]], follow the Import instructions in [[Restore]]&#039;&#039;&#039;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Login&lt;br /&gt;
# Go to &amp;quot;Import for DB Update/Import JSON file&amp;quot; and select the JSON file.&lt;br /&gt;
# Optionally go to &amp;quot;Import for DB Update/Import Zip File and select the zip file.&lt;br /&gt;
# Logout and then login.&lt;br /&gt;
&lt;br /&gt;
Here are a few JSON files that you can download and then select from local file system:&lt;br /&gt;
&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Shelley.json  &lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Byron.json&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/EdgarAllanPoe.json and images https://poetryappwiki.fonlow.org/w/downloads/EdgarAllanPoe.zip&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/LiBai.json and images https://poetryappwiki.fonlow.org/w/downloads/LiBai.zip&lt;br /&gt;
&lt;br /&gt;
After playing, you may clear the database through running the &amp;quot;Clear Database&amp;quot; menu item.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=258</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=258"/>
		<updated>2024-07-18T07:54:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Deploy to Azure Static Web Apps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to GitHub Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according to https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be [https://docs.github.com/en/actions/deployment/deploying-to-your-cloud-provider/deploying-to-azure/deploying-to-azure-static-web-app Deploying to Azure Static Web App through GitHub Actions], you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://thankful-grass-0793a2d1e.2.azurestaticapps.net/&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Microsoft&#039;s free tier is basically a free trial for up to 12 months. &amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
* If you have a paid account of Visual Studio or Office 365, it seems the free tier of the static app is included.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/static-web-apps/build-configuration?tabs=github-actions Build configuration for Azure Static Web Apps]&lt;br /&gt;
* [https://docs.github.com/en/actions/deployment/deploying-to-your-cloud-provider/deploying-to-azure/deploying-to-azure-static-web-app Deploying to Azure Static Web App through GitHub Actions]&lt;br /&gt;
&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
[https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html Please check https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html] first for detailed steps.&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access URL have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Google Cloud Bucket is free for only one year.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Clear all files in root&lt;br /&gt;
#Copy index.html, *.js, ngsw.json and styles*.css.&lt;br /&gt;
#Optionally alter base href in index.html to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;conf/font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== actionsAlign ====&lt;br /&gt;
Valid values: &#039;start&#039;, &#039;center&#039; and &#039;end&#039;. The default is &#039;end&#039;. This defines the align of action buttons at the bottom of a dialogbox. &lt;br /&gt;
&lt;br /&gt;
==== smallScreenBreakpoint ====&lt;br /&gt;
Value values: &#039;Small&#039; and &#039;XSmall&#039;. The default is &#039;XSmall&#039;, [https://m1.material.io/layout/responsive-ui.html#responsive-ui-breakpoints representing a handset]. By default, if the screen size is considered small, the gap between the toolbar button is narrower, and the sidebar will hide by default after selecting an item. If the expected poetry content has long lines, value &#039;Small&#039; is more appropriate, so the sidebar will be less likely hiding the content.&lt;br /&gt;
&lt;br /&gt;
==== localeId ====&lt;br /&gt;
By default, the app uses the default locale of the Web browser. For example, in Google Chrome, if the top language of Settings/Languages is English (United Kingdom), the app will follow format dd/mm/yyyy. You may enforce certain date format through setting &amp;quot;localeId&amp;quot;, for example, with &amp;quot;en-AU&amp;quot;. Please check &amp;quot;[https://support.microsoft.com/en-gb/topic/country-region-and-language-codes-add36afe-804a-44f1-ae68-cfb9c9b72f8b Language-Region Designators]&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=257</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=257"/>
		<updated>2023-09-06T20:54:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to {{SITENAME}}! ==&lt;br /&gt;
Poetry Management and Publishing (Poetry MP) is a poetry app for a poet to manage poems and publish online. &lt;br /&gt;
&lt;br /&gt;
The full app can run on Microsoft Windows, MacOS and Linux as a desktop app, or run on a Windows based or Linux based Web server as a Web app.  And the frontend of the app may be hosted as a static Website to publish the poetry content. Thus, you as a poet can use the full app to manage your poetry on Windows/MacOS/Linux PC, and publish content in a static Website which is cheap or free to run. If you would install the full app in a Web server, the full app can support both management and publishing.&lt;br /&gt;
&lt;br /&gt;
The app is distributed as freeware.&lt;br /&gt;
&lt;br /&gt;
To have some impression of the app, please check:&lt;br /&gt;
&lt;br /&gt;
* [[Live Examples]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[User Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is presumed that you are a computer literate who understands basic concept of Website, upload, and Webmastering, though knowledge of Web programming is not required.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
How people have been publishing or sharing poems through electronic means if not involving traditional publishers? Here&#039;s the list of some scenarios:&lt;br /&gt;
&lt;br /&gt;
# Copy machine. After writing some poems on papers, the poet made copies and mail out.&lt;br /&gt;
# Fax.&lt;br /&gt;
# Email since the birth of the Internet.&lt;br /&gt;
# BBS.&lt;br /&gt;
# Gopher.&lt;br /&gt;
# Newsgroup.&lt;br /&gt;
# Static Web pages.&lt;br /&gt;
# Blog&lt;br /&gt;
# Web 2.0 applications such as social networking services and wiki.&lt;br /&gt;
# Poetry portal sites like: &amp;lt;nowiki&amp;gt;https://poets.org/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetryfoundation.org&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetrybyheart.org.uk/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://thepoetryhour.com/&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
# Poetry writing apps, like those listed at https://play.google.com/store/search?q=poetry+writing&amp;amp;c=apps&lt;br /&gt;
# Word processors like MS Word or Google Doc sharing online.&lt;br /&gt;
&lt;br /&gt;
=== Poetry Management and Publishing (PoetryMP) ===&lt;br /&gt;
The app is designed for the following users:&lt;br /&gt;
&lt;br /&gt;
# Poets who would write poems on computers and publish online. &lt;br /&gt;
# Poetry lovers who would publish poems after being authorized by the poets, or publish poems which copyright are expired or are in public domain.&lt;br /&gt;
&lt;br /&gt;
And the advanced features are designed for such scenarios:&lt;br /&gt;
&lt;br /&gt;
# The poet had written over 100 poems.&lt;br /&gt;
# Many of the poems contain allusions and quotations which need annotations so readers who may not be familiar with the allusions could understand. This app supports numbered annotations (superscript) and phase-based annotations which may be shared among poems.&lt;br /&gt;
# Full text search.&lt;br /&gt;
# Tagging for categorization.&lt;br /&gt;
# Insert images to a poem. The image could be embedded, locally hosted or external. And you may convert external images to locally hosted, so the full app or the static read only variant may work fully offline with images being hosted locally.&lt;br /&gt;
# The readers will read, browse and search poems on PC, tablets and smartphones.&lt;br /&gt;
# Allocate poems into albums.&lt;br /&gt;
# For Chinese poets and respective readers, the Chinese edition of the app provides simplified/traditional Chinese conversion.&lt;br /&gt;
&lt;br /&gt;
What&#039;s Not:&lt;br /&gt;
&lt;br /&gt;
* Specialized for writing poems with vocabulary dictionary.&lt;br /&gt;
* A forum&lt;br /&gt;
* A social networking app&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From certain point of view, PoetryMP is a personal poetry blog which can run as a desktop program or a personal Website. And you can publish your poetry through a full Website or a static Website.&lt;br /&gt;
&lt;br /&gt;
=== Distribution and Installation ===&lt;br /&gt;
PoetryMP is distributed as freeware at the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The app is build on ASP.NET and can run on Windows, MacOS and Linux with ASP.NET 6 runtime installed.&lt;br /&gt;
&lt;br /&gt;
And the static readonly variant of the app Poetry Viewer is a [https://en.wikipedia.org/wiki/Single-page_application SPA], which is using the same codes of the frontend of the full app.  For more details, please check:&lt;br /&gt;
&lt;br /&gt;
*[[Deployment]]&lt;br /&gt;
*[[Deployment for Poetry Viewer]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=256</id>
		<title>Live Examples</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=256"/>
		<updated>2023-09-06T20:52:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[https://poetryapptest.fonlow.org/ &#039;&#039;&#039;Edgar Allan Poe&#039;&#039;&#039;] &lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/byron/ George Gordon Byron] read only&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/libai/ Chinese Poetry of Li Bai Supporting Traditional and Simplified Chinese] read only&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://zijianhuang.github.io/poets/ Poetry Collections of Poets hosted on GitHub], [http://fonlow.poets.s3-website-ap-southeast-2.amazonaws.com/ on AWS],  and [https://thankful-grass-0793a2d1e.2.azurestaticapps.net/ on Azure] read only&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While the full app is designed for one poet, the static read only variant of the app Poetry Viewer may contain collections of poets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Poetry MP supports backup through exporting data and settings to a JSON file. And you may import the JSON file to an empty database for restore.&lt;br /&gt;
&lt;br /&gt;
You may play the full app through running it as a local app. After [[Download]] and [[Deployment]], follow the Import instructions in [[Restore]]&#039;&#039;&#039;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Login&lt;br /&gt;
# Go to &amp;quot;Import for DB Update/Import JSON file&amp;quot; and select the JSON file.&lt;br /&gt;
# Optionally go to &amp;quot;Import for DB Update/Import Zip File and select the zip file.&lt;br /&gt;
# Logout and then login.&lt;br /&gt;
&lt;br /&gt;
Here are a few JSON files that you can download and then select from local file system:&lt;br /&gt;
&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Shelley.json  &lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Byron.json&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/EdgarAllanPoe.json and images https://poetryappwiki.fonlow.org/w/downloads/EdgarAllanPoe.zip&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/LiBai.json and images https://poetryappwiki.fonlow.org/w/downloads/LiBai.zip&lt;br /&gt;
&lt;br /&gt;
After playing, you may clear the database through running the &amp;quot;Clear Database&amp;quot; menu item.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=User_Manual&amp;diff=255</id>
		<title>User Manual</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=User_Manual&amp;diff=255"/>
		<updated>2023-09-06T06:57:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Add / Edit Poem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The UI of Poetry MP is designed for PC monitors and tablets, while the UI of Poetry Viewer is designed for PC monitors, tablets and mobile phones.&lt;br /&gt;
&lt;br /&gt;
== Startup ==&lt;br /&gt;
Depending on you had installed the app, the access URL could be:&lt;br /&gt;
&lt;br /&gt;
# http://poetryapp.localhost if you had installed the app on local IIS or Apache.&lt;br /&gt;
# http://localhost:5300 if you run the app directly through the Powershell script or bash script.&lt;br /&gt;
# http://poetryapp.mydomain.com if you had installed the app on a Web server.&lt;br /&gt;
&lt;br /&gt;
[[File:StartupScreen.jpg|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
Without login, the users can view published poems only.&lt;br /&gt;
&lt;br /&gt;
The default password for user admin after installation is &amp;quot;Pppppp*8&amp;quot; and you should alter the password ASAP, and keep the new password in a safe place.&lt;br /&gt;
&lt;br /&gt;
=== Managing Users ===&lt;br /&gt;
[[File:After Login.png|thumb|After Login]]&lt;br /&gt;
Since the app is for one poet, generally you just need one user admin. In case you may more than one to manage, you may create extra users. &lt;br /&gt;
&lt;br /&gt;
[[File:AfterLogin.png|thumb|AfterLogin]]&lt;br /&gt;
&lt;br /&gt;
== Add / Edit Poem ==&lt;br /&gt;
&lt;br /&gt;
If you have been writing blogs with HTML formatting, you should be familiar with the basic operations of composing HTML contents, though composing a poem generally does not require rich formatting.&lt;br /&gt;
&lt;br /&gt;
In addition to basic HTML formatting, Poetry MP provides a few more options specially designed for composing poems with notations and images.&lt;br /&gt;
&lt;br /&gt;
=== Extra HTML Operations ===&lt;br /&gt;
[[File:Extra HTML Operations.png|thumb|Extra HTML Operations]]&lt;br /&gt;
&lt;br /&gt;
==== Insert Sup ====&lt;br /&gt;
This is similar to formatting a piece of text into superscript, however, this operation inserts a numeric superscript incrementally. And the numeric superscripts may be reordered.&lt;br /&gt;
[[File:InsertNumericSup.png|center|frameless]]&lt;br /&gt;
Then you click button &amp;quot;Suggest Numbered Annotations&amp;quot; that pops up numeric superscripts which have not been annotated into numbered annotations.&lt;br /&gt;
[[File:DefineNumberedAnnotations.png|center|Define Numbered Annotations]]&lt;br /&gt;
&lt;br /&gt;
[[File:ManageNumberedAnnotations.png|center|thumb|Manage Numbered Annotations]]&lt;br /&gt;
When clicking the numeric button, you can input content for the numbered annotation.&lt;br /&gt;
[[File:InputNumberedAnnotation.png|center|thumb|Input Numbered Annotation]]&lt;br /&gt;
When the readers of your poetry click a numbered annotation, they will see the content, or a Web paged directed by the Reference URL, or both.&lt;br /&gt;
&lt;br /&gt;
From time to time, you may have numeric superscripts scattering around not in sequential order. If you want them to be ordered incrementally, you may &amp;quot;Reorder Superscripts&amp;quot; and the app will match the numbered annotations accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Upload Image and Insert ====&lt;br /&gt;
This is similar to &amp;quot;Insert Image&amp;quot; of basic HTML formatting, however, &amp;quot;Insert Image&amp;quot; is to load a local image and insert to HTML content as [http://en.wikipedia.org/wiki/Base64 BASE64] chunk, while &amp;quot;Upload Image and Insert&amp;quot; is to store the uploaded image to the database and create a reference to the backend of the app.&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img class=&amp;quot;local&amp;quot; src=&amp;quot;api/files/file/e65bb512-1a9d-4a78-ac9e-83d74fbf9e8c.jpeg&amp;quot; alt=&amp;quot;Pallas Athena&amp;quot; loading=&amp;quot;lazy&amp;quot; decoding=&amp;quot;async&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;BASE64 chunk is generally 37% larger than the source data, thus, it is recommended to upload image and insert.&lt;br /&gt;
&lt;br /&gt;
==== Pick Images and Insert ====&lt;br /&gt;
Images uploaded into the database can be shared across poems.&lt;br /&gt;
&lt;br /&gt;
You may check to select images in &amp;quot;Local Pictures Management&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Paste as Plain Text ====&lt;br /&gt;
The HTML content that you had copied from the other sources may contain over complex or inconsistent or unsafe HTML tags, while generally the HTML content of a poem does not require rich formatting. Thus it is safer and simpler to page HTML content as plain text.&lt;br /&gt;
&lt;br /&gt;
==== Replace Double Linebreaks with One ====&lt;br /&gt;
HTML provides a few ways of rendering linebreaks. Sometimes content copied from the other sources may contain more than one linebreak between lines. This command will reduce double linebreaks into one.&lt;br /&gt;
&lt;br /&gt;
=== Annotations ===&lt;br /&gt;
&lt;br /&gt;
Phase-based annotations match phases in a poem, and the annotations may be shared across poems containing the same phases.&lt;br /&gt;
[[File:PoetryEdit2.png|center|phase based annotations]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Through clicking &amp;quot;Suggest Annotations&amp;quot; the app will scan the poem for matching existing annotations, then you may select matched annotations and associate with the poem.&lt;br /&gt;
&lt;br /&gt;
=== Albums ===&lt;br /&gt;
If you had defined some albums, you may associate an album or multiple albums with the poem.&lt;br /&gt;
[[File:AssociateAlbum.png|center|Associate Album]]&lt;br /&gt;
&lt;br /&gt;
== Album ==&lt;br /&gt;
An album is to contain a collection of poems. And you may have a description on the top as a preface.&lt;br /&gt;
[[File:Check Poems.png|thumb|Check Poems]]&lt;br /&gt;
[[File:Select Album.png|center|frameless|Select Album]]&lt;br /&gt;
Album functionality is available if &amp;quot;Settings/Edit/Use Albums&amp;quot; is on.&lt;br /&gt;
[[File:Pick Album.png|center|frameless|Pick Album]]&lt;br /&gt;
Checked poems will be contained in the album.&lt;br /&gt;
&lt;br /&gt;
To quit, click this button highlighted:&lt;br /&gt;
[[File:Deselect album.png|center|frameless|Deselect album]]&lt;br /&gt;
&lt;br /&gt;
== Maintenance ==&lt;br /&gt;
From time to time, you may need to adjust some settings, backup, export data, or manage locally hosted pictures etc. Please check [[Maintenance]] for more details.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=File:PoetryEdit2.png&amp;diff=254</id>
		<title>File:PoetryEdit2.png</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=File:PoetryEdit2.png&amp;diff=254"/>
		<updated>2023-09-06T06:53:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Phase based annotations&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=File:PoetryEdit.png&amp;diff=253</id>
		<title>File:PoetryEdit.png</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=File:PoetryEdit.png&amp;diff=253"/>
		<updated>2023-09-06T06:48:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Edit in Mac&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=252</id>
		<title>Live Examples</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=252"/>
		<updated>2023-08-25T04:12:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;[https://fonlow.com/byron/ George Gordon Byron Poetry]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/libai/ Chinese Poetry of Li Bai Supporting Traditional and Simplified Chinese]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://zijianhuang.github.io/poets/ Poetry Collections of Poets hosted on GitHub], [http://fonlow.poets.s3-website-ap-southeast-2.amazonaws.com/ on AWS],  and [https://thankful-grass-0793a2d1e.2.azurestaticapps.net/ on Azure].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While the full app is designed for one poet, the static read only variant of the app Poetry Viewer may contain collections of poets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Poetry MP supports backup through exporting data and settings to a JSON file. And you may import the JSON file to an empty database for restore.&lt;br /&gt;
&lt;br /&gt;
You may play the full app through running it as a local app. After [[Download]] and [[Deployment]], follow the Import instructions in [[Restore]]&#039;&#039;&#039;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Login&lt;br /&gt;
# Go to &amp;quot;Import for DB Update/Import JSON file&amp;quot; and select the JSON file.&lt;br /&gt;
# Optionally go to &amp;quot;Import for DB Update/Import Zip File and select the zip file.&lt;br /&gt;
# Logout and then login.&lt;br /&gt;
&lt;br /&gt;
Here are a few JSON files that you can download and then select from local file system:&lt;br /&gt;
&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Shelley.json  &lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Byron.json&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/EdgarAllanPoe.json and images https://poetryappwiki.fonlow.org/w/downloads/EdgarAllanPoe.zip&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/LiBai.json and images https://poetryappwiki.fonlow.org/w/downloads/LiBai.zip&lt;br /&gt;
&lt;br /&gt;
After playing, you may clear the database through running the &amp;quot;Clear Database&amp;quot; menu item.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=251</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=251"/>
		<updated>2023-08-18T21:42:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Summary of Customization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according to https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://thankful-grass-0793a2d1e.2.azurestaticapps.net/&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
[https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html Please check https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html] first for detailed steps.&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access URL have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Google Cloud Bucket is free for only one year.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Clear all files in root&lt;br /&gt;
#Copy index.html, *.js, ngsw.json and styles*.css.&lt;br /&gt;
#Optionally alter base href in index.html to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;conf/font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== actionsAlign ====&lt;br /&gt;
Valid values: &#039;start&#039;, &#039;center&#039; and &#039;end&#039;. The default is &#039;end&#039;. This defines the align of action buttons at the bottom of a dialogbox. &lt;br /&gt;
&lt;br /&gt;
==== smallScreenBreakpoint ====&lt;br /&gt;
Value values: &#039;Small&#039; and &#039;XSmall&#039;. The default is &#039;XSmall&#039;, [https://m1.material.io/layout/responsive-ui.html#responsive-ui-breakpoints representing a handset]. By default, if the screen size is considered small, the gap between the toolbar button is narrower, and the sidebar will hide by default after selecting an item. If the expected poetry content has long lines, value &#039;Small&#039; is more appropriate, so the sidebar will be less likely hiding the content.&lt;br /&gt;
&lt;br /&gt;
==== localeId ====&lt;br /&gt;
By default, the app uses the default locale of the Web browser. For example, in Google Chrome, if the top language of Settings/Languages is English (United Kingdom), the app will follow format dd/mm/yyyy. You may enforce certain date format through setting &amp;quot;localeId&amp;quot;, for example, with &amp;quot;en-AU&amp;quot;. Please check &amp;quot;[https://support.microsoft.com/en-gb/topic/country-region-and-language-codes-add36afe-804a-44f1-ae68-cfb9c9b72f8b Language-Region Designators]&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=250</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=250"/>
		<updated>2023-05-06T20:29:03Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according to https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://thankful-grass-0793a2d1e.2.azurestaticapps.net/&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
[https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html Please check https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html] first for detailed steps.&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access URL have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Google Cloud Bucket is free for only one year.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Clear all files in root&lt;br /&gt;
#Copy index.html, *.js, ngsw.json and styles*.css.&lt;br /&gt;
#Optionally alter base href in index.html to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;conf/font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== actionsAlign ====&lt;br /&gt;
Valid values: &#039;start&#039;, &#039;center&#039; and &#039;end&#039;. The default is &#039;end&#039;. This defines the align of action buttons at the bottom of a dialogbox. &lt;br /&gt;
&lt;br /&gt;
==== smallScreenBreakpoint ====&lt;br /&gt;
Value values: &#039;Small&#039; and &#039;XSmall&#039;. The default is &#039;XSmall&#039;, [https://m1.material.io/layout/responsive-ui.html#responsive-ui-breakpoints representing a handset]. By default, if the screen size is considered small, the gap between the toolbar button is narrower, and the sidebar will hide by default after selecting an item. If the expected poetry content has long lines, value &#039;Small&#039; is more appropriate, so the sidebar will be less likely hiding the content.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download_archive&amp;diff=249</id>
		<title>Download archive</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download_archive&amp;diff=249"/>
		<updated>2023-01-02T00:54:03Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot; &amp;#039;&amp;#039;&amp;#039;Built for ASP.NET 6:&amp;#039;&amp;#039;&amp;#039; *[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained6.zip PoetryAppWinSelfContained6.zip] for Microsoft Windows (52MB, 124MB installed) *[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin6.zip PoetryAppWin6.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows required) *[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSel...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Built for ASP.NET 6:&#039;&#039;&#039;&lt;br /&gt;
*[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained6.zip PoetryAppWinSelfContained6.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
*[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin6.zip PoetryAppWin6.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
*[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained6.zip PoetryAppMacSelfContained6.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
*[https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac6.zip PoetryAppMac6.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=248</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=248"/>
		<updated>2023-01-02T00:51:39Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Built for ASP.NET 7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
The default user name is &amp;quot;admin&amp;quot;, and the default password is &amp;quot;Pppppp*8&amp;quot;, and you should change the password after the first login.&lt;br /&gt;
&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The download size of ASP.NET Core Runtime 7 is around 39 MB.&lt;br /&gt;
* As of .NET 6 and .NET 7, Microsoft does not provide installers but only binaries for ASP.NET Core Runtime for Mac. If you find manual installation is too technical and troublesome, you may use one of the .NET SDK 7 installers for MacOS instead, which includes ASP.NET Core Runtime and .NET Desktop Runtime, while the download size is around 188MB.&lt;br /&gt;
* Builds for older .NET releases could be found at the [[download archive]].&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=247</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=247"/>
		<updated>2023-01-01T21:30:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Summary of Customization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according to https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://thankful-grass-0793a2d1e.2.azurestaticapps.net/&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access url have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
[https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html Please check https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html] first for detailed steps.&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Clear all files in root&lt;br /&gt;
#Copy index.html, *.js, ngsw.json and styles*.css.&lt;br /&gt;
#Optionally alter base href in index.html to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;conf/font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== actionsAlign ====&lt;br /&gt;
Valid values: &#039;start&#039;, &#039;center&#039; and &#039;end&#039;. The default is &#039;end&#039;. This defines the align of action buttons at the bottom of a dialogbox. &lt;br /&gt;
&lt;br /&gt;
==== smallScreenBreakpoint ====&lt;br /&gt;
Value values: &#039;Small&#039; and &#039;XSmall&#039;. The default is &#039;XSmall&#039;, [https://m1.material.io/layout/responsive-ui.html#responsive-ui-breakpoints representing a handset]. By default, if the screen size is considered small, the gap between the toolbar button is narrower, and the sidebar will hide by default after selecting an item. If the expected poetry content has long lines, value &#039;Small&#039; is more appropriate, so the sidebar will be less likely hiding the content.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=246</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=246"/>
		<updated>2022-11-18T20:33:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
The default user name is &amp;quot;admin&amp;quot;, and the default password is &amp;quot;Pppppp*8&amp;quot;, and you should change the password after the first login.&lt;br /&gt;
&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The download size of ASP.NET Core Runtime 7 is around 39 MB.&lt;br /&gt;
* As of .NET 6 and .NET 7, Microsoft does not provide installers but only binaries for ASP.NET Core Runtime for Mac. If you find manual installation is too technical and troublesome, you may use one of the .NET SDK 7 installers for MacOS instead, which includes ASP.NET Core Runtime and .NET Desktop Runtime, while the download size is around 188MB.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=245</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=245"/>
		<updated>2022-11-15T08:12:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poetry Management and Publishing (PoetryMP) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to {{SITENAME}}! ==&lt;br /&gt;
Poetry Management and Publishing (Poetry MP) is a poetry app for a poet to manage poems and publish online. &lt;br /&gt;
&lt;br /&gt;
The full app can run on Microsoft Windows, MacOS and Linux as a desktop app, or run on a Windows based or Linux based Web server as a Web app.  And the frontend of the app may be hosted as a static Website to publish the poetry content. Thus, you as a poet can use the full app to manage your poetry on Windows/MacOS/Linux PC, and publish content in a static Website which is cheap or free to run. If you would install the full app in a Web server, the full app can support both management and publishing.&lt;br /&gt;
&lt;br /&gt;
The app is distributed as freeware.&lt;br /&gt;
&lt;br /&gt;
To have some impression of the app, please check:&lt;br /&gt;
&lt;br /&gt;
* [[Live Examples]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[User Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is presumed that you are a computer literate who understands basic concept of Website, upload, and Webmastering, though knowledge of Web programming is not required.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
How people have been publishing or sharing poems through electronic means if not involving traditional publishers? Here&#039;s the list of some scenarios:&lt;br /&gt;
&lt;br /&gt;
# Copy machine. After writing some poems on papers, the poet made copies and mail out.&lt;br /&gt;
# Fax.&lt;br /&gt;
# Email since the birth of the Internet.&lt;br /&gt;
# BBS.&lt;br /&gt;
# Gopher.&lt;br /&gt;
# Newsgroup.&lt;br /&gt;
# Static Web pages.&lt;br /&gt;
# Blog&lt;br /&gt;
# Web 2.0 applications such as social networking services and wiki.&lt;br /&gt;
# Poetry portal sites like: &amp;lt;nowiki&amp;gt;https://poets.org/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetryfoundation.org&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetrybyheart.org.uk/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://thepoetryhour.com/&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
# Poetry writing apps, like those listed at https://play.google.com/store/search?q=poetry+writing&amp;amp;c=apps&lt;br /&gt;
&lt;br /&gt;
=== Poetry Management and Publishing (PoetryMP) ===&lt;br /&gt;
The app is designed for the following users:&lt;br /&gt;
&lt;br /&gt;
# Poets who would write poems on computers and publish online. &lt;br /&gt;
# Poetry lovers who would publish poems after being authorized by the poets, or publish poems which copyright are expired or are in public domain.&lt;br /&gt;
&lt;br /&gt;
And the advanced features are designed for such scenarios:&lt;br /&gt;
&lt;br /&gt;
# The poet had written over 100 poems.&lt;br /&gt;
# Many of the poems contain allusions and quotations which need annotations so readers who may not be familiar with the allusions could understand. This app supports numbered annotations (superscript) and phase-based annotations which may be shared among poems.&lt;br /&gt;
# Full text search.&lt;br /&gt;
# Tagging for categorization.&lt;br /&gt;
# Insert images to a poem. The image could be embedded, locally hosted or external. And you may convert external images to locally hosted, so the full app or the static read only variant may work fully offline with images being hosted locally.&lt;br /&gt;
# The readers will read, browse and search poems on PC, tablets and smartphones.&lt;br /&gt;
# Allocate poems into albums.&lt;br /&gt;
# For Chinese poets and respective readers, the Chinese edition of the app provides simplified/traditional Chinese conversion.&lt;br /&gt;
&lt;br /&gt;
What&#039;s Not:&lt;br /&gt;
&lt;br /&gt;
* Specialized for writing poems with vocabulary dictionary.&lt;br /&gt;
* A forum&lt;br /&gt;
* A social networking app&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From certain point of view, PoetryMP is a personal poetry blog which can run as a desktop program or a personal Website. And you can publish your poetry through a full Website or a static Website.&lt;br /&gt;
&lt;br /&gt;
=== Distribution and Installation ===&lt;br /&gt;
PoetryMP is distributed as freeware at the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The app is build on ASP.NET and can run on Windows, MacOS and Linux with ASP.NET 6 runtime installed.&lt;br /&gt;
&lt;br /&gt;
And the static readonly variant of the app Poetry Viewer is a [https://en.wikipedia.org/wiki/Single-page_application SPA], which is using the same codes of the frontend of the full app.  For more details, please check:&lt;br /&gt;
&lt;br /&gt;
*[[Deployment]]&lt;br /&gt;
*[[Deployment for Poetry Viewer]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=244</id>
		<title>Live Examples</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=244"/>
		<updated>2022-11-11T10:53:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;[https://fonlow.com/byron/ George Gordon Byron Poetry]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/libai/ Chinese Poetry of Li Bai Supporting Traditional and Simplified Chinese]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://zijianhuang.github.io/poets/ Poetry Collections of Poets hosted on GitHub], [http://fonlow.poets.s3-website-ap-southeast-2.amazonaws.com/ on AWS],  [https://storage.googleapis.com/poets_bucket/index.html on GCP] and [https://thankful-grass-0793a2d1e.2.azurestaticapps.net/ on Azure].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While the full app is designed for one poet, the static read only variant of the app Poetry Viewer may contain collections of poets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Poetry MP supports backup through exporting data and settings to a JSON file. And you may import the JSON file to an empty database for restore.&lt;br /&gt;
&lt;br /&gt;
You may play the full app through running it as a local app. After [[Download]] and [[Deployment]], follow the Import instructions in [[Restore]]&#039;&#039;&#039;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Login&lt;br /&gt;
# Go to &amp;quot;Import for DB Update/Import JSON file&amp;quot; and select the JSON file.&lt;br /&gt;
# Optionally go to &amp;quot;Import for DB Update/Import Zip File and select the zip file.&lt;br /&gt;
# Logout and then login.&lt;br /&gt;
&lt;br /&gt;
Here are a few JSON files that you can download and then select from local file system:&lt;br /&gt;
&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Shelley.json  &lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Byron.json&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/EdgarAllanPoe.json and images https://poetryappwiki.fonlow.org/w/downloads/EdgarAllanPoe.zip&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/LiBai.json and images https://poetryappwiki.fonlow.org/w/downloads/LiBai.zip&lt;br /&gt;
&lt;br /&gt;
After playing, you may clear the database through running the &amp;quot;Clear Database&amp;quot; menu item.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=243</id>
		<title>Live Examples</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=243"/>
		<updated>2022-11-10T20:57:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;[https://fonlow.com/byron/ George Gordon Byron Poetry]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/libai/ Chinese Poetry of Li Bai Supporting Traditional and Simplified Chinese]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://zijianhuang.github.io/poets/ Poetry Collections of Poets hosted on GitHub], [http://fonlow.poets.s3-website-ap-southeast-2.amazonaws.com/ on AWS],  [https://storage.googleapis.com/poets_bucket/index.html on GCP] and [https://thankful-grass-0793a2d1e.2.azurestaticapps.net/ on Azure].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While the full app is designed for one poet, the static read only variant of the app Poetry Viewer may contain collections of poets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may play the full app through running it as a local app. After [[Download]] and [[Deployment]], follow the Import instructions in [[Restore]]&#039;&#039;&#039;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Login&lt;br /&gt;
# Go to &amp;quot;Import for DB Update/Import JSON file&amp;quot; and select the JSON file.&lt;br /&gt;
# Optionally go to &amp;quot;Import for DB Update/Import Zip File and select the zip file.&lt;br /&gt;
# Logout and then login.&lt;br /&gt;
&lt;br /&gt;
Here are a few JSON files that you can download and then select from local file system:&lt;br /&gt;
&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Shelley.json  &lt;br /&gt;
* https://zijianhuang.github.io/poets/data/Byron.json&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/EdgarAllanPoe.json and images https://poetryappwiki.fonlow.org/w/downloads/EdgarAllanPoe.zip&lt;br /&gt;
* https://zijianhuang.github.io/poets/data/LiBai.json and images https://poetryappwiki.fonlow.org/w/downloads/LiBai.zip&lt;br /&gt;
&lt;br /&gt;
After playing, you may clear the database through running the &amp;quot;Clear Database&amp;quot; menu item.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=242</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=242"/>
		<updated>2022-11-10T12:32:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to {{SITENAME}}! ==&lt;br /&gt;
Poetry Management and Publishing (Poetry MP) is a poetry app for a poet to manage poems and publish online. &lt;br /&gt;
&lt;br /&gt;
The full app can run on Microsoft Windows, MacOS and Linux as a desktop app, or run on a Windows based or Linux based Web server as a Web app.  And the frontend of the app may be hosted as a static Website to publish the poetry content. Thus, you as a poet can use the full app to manage your poetry on Windows/MacOS/Linux PC, and publish content in a static Website which is cheap or free to run. If you would install the full app in a Web server, the full app can support both management and publishing.&lt;br /&gt;
&lt;br /&gt;
The app is distributed as freeware.&lt;br /&gt;
&lt;br /&gt;
To have some impression of the app, please check:&lt;br /&gt;
&lt;br /&gt;
* [[Live Examples]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[User Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is presumed that you are a computer literate who understands basic concept of Website, upload, and Webmastering, though knowledge of Web programming is not required.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
How people have been publishing or sharing poems through electronic means if not involving traditional publishers? Here&#039;s the list of some scenarios:&lt;br /&gt;
&lt;br /&gt;
# Copy machine. After writing some poems on papers, the poet made copies and mail out.&lt;br /&gt;
# Fax.&lt;br /&gt;
# Email since the birth of the Internet.&lt;br /&gt;
# BBS.&lt;br /&gt;
# Gopher.&lt;br /&gt;
# Newsgroup.&lt;br /&gt;
# Static Web pages.&lt;br /&gt;
# Blog&lt;br /&gt;
# Web 2.0 applications such as social networking services and wiki.&lt;br /&gt;
# Poetry portal sites like: &amp;lt;nowiki&amp;gt;https://poets.org/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetryfoundation.org&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetrybyheart.org.uk/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://thepoetryhour.com/&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
# Poetry writing apps, like those listed at https://play.google.com/store/search?q=poetry+writing&amp;amp;c=apps&lt;br /&gt;
&lt;br /&gt;
=== Poetry Management and Publishing (PoetryMP) ===&lt;br /&gt;
The app is designed for the following users:&lt;br /&gt;
&lt;br /&gt;
# Poets who would write poems on computers and publish online. &lt;br /&gt;
# Poetry lovers who would publish poems authorized by the poets, or publish poems which copyright are expired or are in public domain.&lt;br /&gt;
&lt;br /&gt;
And the advanced features are designed for such scenarios:&lt;br /&gt;
&lt;br /&gt;
# The poet had written over 100 poems.&lt;br /&gt;
# Many of the poems contain allusions and quotations which need annotations so readers who may not be familiar with the allusions could understand. This app supports numbered annotations (superscript) and phase-based annotations which may be shared among poems.&lt;br /&gt;
# Full text search.&lt;br /&gt;
# Tagging for categorization.&lt;br /&gt;
# Insert images to a poem. The image could be embedded, locally hosted or external. And you may convert external images to locally hosted, so the full app or the static read only variant may work fully offline with images being hosted locally.&lt;br /&gt;
# The readers will read, browse and search poems on PC, tablets and smartphones.&lt;br /&gt;
# Allocate poems into albums.&lt;br /&gt;
# For Chinese poets and respective readers, the Chinese edition of the app provides simplified/traditional Chinese conversion.&lt;br /&gt;
&lt;br /&gt;
What&#039;s Not:&lt;br /&gt;
&lt;br /&gt;
* Specialized for writing poems with vocabulary dictionary.&lt;br /&gt;
* A forum&lt;br /&gt;
* A social networking app&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From certain point of view, PoetryMP is a personal poetry blog which can run as a desktop program or a personal Website. And you can publish your poetry through a full Website or a static Website.&lt;br /&gt;
&lt;br /&gt;
=== Distribution and Installation ===&lt;br /&gt;
PoetryMP is distributed as freeware at the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The app is build on ASP.NET and can run on Windows, MacOS and Linux with ASP.NET 6 runtime installed.&lt;br /&gt;
&lt;br /&gt;
And the static readonly variant of the app Poetry Viewer is a [https://en.wikipedia.org/wiki/Single-page_application SPA], which is using the same codes of the frontend of the full app.  For more details, please check:&lt;br /&gt;
&lt;br /&gt;
*[[Deployment]]&lt;br /&gt;
*[[Deployment for Poetry Viewer]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=241</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=241"/>
		<updated>2022-11-10T11:54:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for IT administers, Web masters and computer literates who have basic skills of deploying a Website or unzip a file of a software application. The files needed are available in the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The backend and the fontend should be hosted in the same host. And the DB engine is with Sqlite.&lt;br /&gt;
&lt;br /&gt;
== Deploy to IIS ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime Hosting Bundle] for Windows IIS.&lt;br /&gt;
# A Website created with Application Pool of &amp;quot;No Managed Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
# Extract the Zip file to the Website root folder.&lt;br /&gt;
# Alter bin/appsettings.json with `UseHttps: true` to enforce HTTPS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* It may be beneficial to set a IIS rewrite rule in Web.config to further enforce HTTPS, while this is optional, since the app itself along with ASP.NET Core Runtime Hosting Bundle is capable of redirecting HTTP calls to HTTPS.&lt;br /&gt;
* Single Page Applications often have rewrite rules defined either in Web server (IIS or Apache) config for entering the app from any valid frontend routes. Web.config coming with the app supports such. However, when the app is running with Kestrel, web.config is not used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to purchase a SSL certificate, you may use &amp;quot;[https://letsencrypt.org/ Let&#039;s Encrypt]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Windows Desktop App==&lt;br /&gt;
The releases for desktop app are basically the same as the ones for Web App, however, the release is hosted in a local Web server Kestrel included in ASP.NET Core Runtime.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
#Extract the Zip file to a desired folder.&lt;br /&gt;
#In folder, double click &amp;quot;CreateShortcut.bat&amp;quot; which will create a shortcut on Windows desktop. This shortcut actually runs `StartPoetryApp.ps1` which will launch PoetryApp.exe and open the default Web browser browsing [http://localhost:5000 http://localhost:5300].&lt;br /&gt;
&lt;br /&gt;
You can copy or move the shortcut to any launch area of Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In case you have other apps running at port 5300, you need to change the following settings:&lt;br /&gt;
&lt;br /&gt;
# File `bin/appsettings.json`: Alter Kestrel/Endpoints/Http/Url to &amp;quot;[http://localhost:Port http://localhost:PortNotInUse]&amp;quot;, for example, &amp;quot;[http://localhost http://localhost:5310&amp;quot;]&lt;br /&gt;
#File `StartPoetryApp.ps1`: Alter respective URL of &amp;quot;start-process&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*The desktop app&#039;s backend is running on Kestrel which does not read web.config with some rewrite rules, and these rules are for entering the app from any valid frontend routes. However, because you almost always enter the frontend the first time through the startup URL, and the service worker of the frontend will then later on take care of the routing. So eventually you later can access the app from any valid frontend routes.&lt;br /&gt;
*Likewise, the static read only variant (Poetry Viewer) of the app also rely on the service worker for routing. Poetry Viewer is often hosted in a server without explicit backend and you may not have control of the server config for the rewrite rules.&lt;br /&gt;
&lt;br /&gt;
==MacOS Desktop App==&lt;br /&gt;
[[File:Local app on MacOS.png|thumb|local app on MacOS]]&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64 and follow [https://learn.microsoft.com/en-us/dotnet/core/install/macos this article]. Optional. If you install the self contained release, you don&#039;t need to install the runtime separately.&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
# Extract the Zip file to a desired folder, for example, &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;&lt;br /&gt;
#[https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 Apply &amp;quot;chmod 755&amp;quot; to files &amp;quot;StartPoetryApp.command&amp;quot; and &amp;quot;bin/PoetryApp&amp;quot;] to make both become executable.&lt;br /&gt;
&lt;br /&gt;
===Execution===&lt;br /&gt;
&lt;br /&gt;
=====In Terminal=====&lt;br /&gt;
#Under &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;, execute &amp;quot;./StartPoetryApp.command&amp;quot;. And this will launch PoetryApp as a local service hosting http://localhost:5300 and open browser Safari or Chrome, and go to http://localhost:5300&lt;br /&gt;
[[File:PoetryApp Local Service.png|alt=PoetryApp Local Service|thumb|PoetryApp Local Service]]&lt;br /&gt;
=====In Finder=====&lt;br /&gt;
&lt;br /&gt;
#Double click &amp;quot;StartPoetryApp.command&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may make an Alias of &amp;quot;StartPoetryApp.command&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=240</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=240"/>
		<updated>2022-11-10T11:02:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
The default user name is &amp;quot;admin&amp;quot;, and the default password is &amp;quot;Pppppp*8&amp;quot;, and you should change the password after the first login.&lt;br /&gt;
&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The download size of ASP.NET Core Runtime 7 is around 39 MB.&lt;br /&gt;
* As of .NET 6 and .NET 7, Microsoft does not provide installers but only binaries for ASP.NET Core Runtime for Mac. If you find manual installation is too technical and troublesome, you may use one of the .NET SDK 7 installers for MacOS instead, which includes ASP.NET Core Runtime and .NET Desktop Runtime, while the download size is around 188MB.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=239</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=239"/>
		<updated>2022-11-10T11:01:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
The default user name is &amp;quot;admin&amp;quot;, and the default password is &amp;quot;Pppppp*8&amp;quot;, and you should change the password after first login.&lt;br /&gt;
&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The download size of ASP.NET Core Runtime 7 is around 39 MB.&lt;br /&gt;
* As of .NET 6 and .NET 7, Microsoft does not provide installers but only binaries for ASP.NET Core Runtime for Mac. If you find manual installation is too technical and troublesome, you may use one of the .NET SDK 7 installers for MacOS instead, which includes ASP.NET Core Runtime and .NET Desktop Runtime, while the download size is around 188MB.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=238</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=238"/>
		<updated>2022-11-10T05:51:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* MacOS Desktop App */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for IT administers, Web masters and computer literates who have basic skills of deploying a Website or unzip a file of a software application. The files needed are available in the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The backend and the fontend should be hosted in the same host. And the DB engine is with Sqlite.&lt;br /&gt;
&lt;br /&gt;
== Deploy to IIS ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime Hosting Bundle] for Windows IIS.&lt;br /&gt;
# A Website created with Application Pool of &amp;quot;No Managed Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
# Extract the Zip file to the Website root folder.&lt;br /&gt;
# Alter bin/appsettings.json with `UseHttps: true` to enforce HTTPS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* It may be beneficial to set a IIS rewrite rule in Web.config to further enforce HTTPS, while this is optional, since the app itself along with ASP.NET Core Runtime Hosting Bundle is capable of redirecting HTTP calls to HTTPS.&lt;br /&gt;
* Single Page Applications often have rewrite rules defined either in Web server (IIS or Apache) config for entering the app from any valid frontend routes. Web.config coming with the app supports such. However, when the app is running with Kestrel, web.config is not used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to purchase a SSL certificate, you may use &amp;quot;[https://letsencrypt.org/ Let&#039;s Encrypt]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Windows Desktop App==&lt;br /&gt;
The releases for desktop app are basically the same as the ones for Web App, however, the release is hosted in a local Web server Kestrel included in ASP.NET Core Runtime.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
#Either install the MSI file or extract the Zip file to a desired folder.&lt;br /&gt;
#In folder, double click &amp;quot;CreateShortcut.bat&amp;quot; which will create a shortcut on Windows desktop. This shortcut actually runs `StartPoetryApp.ps1` which will launch PoetryApp.exe and open the default Web browser browsing [http://localhost:5000 http://localhost:5300].&lt;br /&gt;
&lt;br /&gt;
You can copy or move the shortcut to any launch area of Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In case you have other apps running at port 5300, you need to change the following settings:&lt;br /&gt;
&lt;br /&gt;
# File `bin/appsettings.json`: Alter Kestrel/Endpoints/Http/Url to &amp;quot;[http://localhost:Port http://localhost:PortNotInUse]&amp;quot;, for example, &amp;quot;[http://localhost http://localhost:5310&amp;quot;]&lt;br /&gt;
#File `StartPoetryApp.ps1`: Alter respective URL of &amp;quot;start-process&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*The desktop app&#039;s backend is running on Kestrel which does not read web.config with some rewrite rules, and these rules are for entering the app from any valid frontend routes. However, because you almost always enter the frontend the first time through the startup URL, and the service worker of the frontend will then later on take care of the routing. So eventually you later can access the app from any valid frontend routes.&lt;br /&gt;
*Likewise, the static read only variant (Poetry Viewer) of the app also rely on the service worker for routing. Poetry Viewer is often hosted in a server without explicit backend and you may not have control of the server config for the rewrite rules.&lt;br /&gt;
&lt;br /&gt;
==MacOS Desktop App==&lt;br /&gt;
[[File:Local app on MacOS.png|thumb|local app on MacOS]]&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64 and follow [https://learn.microsoft.com/en-us/dotnet/core/install/macos this article]. Optional. If you install the self contained release, you don&#039;t need to install the runtime separately.&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
# Extract the Zip file to a desired folder, for example, &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;&lt;br /&gt;
#[https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 Apply &amp;quot;chmod 755&amp;quot; to files &amp;quot;StartPoetryApp.command&amp;quot; and &amp;quot;bin/PoetryApp&amp;quot;] to make both become executable.&lt;br /&gt;
&lt;br /&gt;
===Execution===&lt;br /&gt;
&lt;br /&gt;
=====In Terminal=====&lt;br /&gt;
#Under &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;, execute &amp;quot;./StartPoetryApp.command&amp;quot;. And this will launch PoetryApp as a local service hosting http://localhost:5300 and open browser Safari or Chrome, and go to http://localhost:5300&lt;br /&gt;
&lt;br /&gt;
=====In Finder=====&lt;br /&gt;
&lt;br /&gt;
#Double click &amp;quot;StartPoetryApp.command&amp;quot;.&lt;br /&gt;
[[File:PoetryApp Local Service.png|alt=PoetryApp Local Service|thumb|PoetryApp Local Service]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may make an Alias of &amp;quot;StartPoetryApp.command&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=237</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=237"/>
		<updated>2022-11-10T05:46:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
The default user name is &amp;quot;admin&amp;quot;, and the default password is &amp;quot;Pppppp*8&amp;quot;, and you should change the password after first login.&lt;br /&gt;
&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The download size of ASP.NET Core Runtime 7 is around 39 MB.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=236</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=236"/>
		<updated>2022-11-10T05:11:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for IT administers, Web masters and computer literates who have basic skills of deploying a Website or unzip a file of a software application. The files needed are available in the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The backend and the fontend should be hosted in the same host. And the DB engine is with Sqlite.&lt;br /&gt;
&lt;br /&gt;
== Deploy to IIS ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime Hosting Bundle] for Windows IIS.&lt;br /&gt;
# A Website created with Application Pool of &amp;quot;No Managed Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
# Extract the Zip file to the Website root folder.&lt;br /&gt;
# Alter bin/appsettings.json with `UseHttps: true` to enforce HTTPS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* It may be beneficial to set a IIS rewrite rule in Web.config to further enforce HTTPS, while this is optional, since the app itself along with ASP.NET Core Runtime Hosting Bundle is capable of redirecting HTTP calls to HTTPS.&lt;br /&gt;
* Single Page Applications often have rewrite rules defined either in Web server (IIS or Apache) config for entering the app from any valid frontend routes. Web.config coming with the app supports such. However, when the app is running with Kestrel, web.config is not used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to purchase a SSL certificate, you may use &amp;quot;[https://letsencrypt.org/ Let&#039;s Encrypt]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Windows Desktop App==&lt;br /&gt;
The releases for desktop app are basically the same as the ones for Web App, however, the release is hosted in a local Web server Kestrel included in ASP.NET Core Runtime.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for Windows&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
#Either install the MSI file or extract the Zip file to a desired folder.&lt;br /&gt;
#In folder, double click &amp;quot;CreateShortcut.bat&amp;quot; which will create a shortcut on Windows desktop. This shortcut actually runs `StartPoetryApp.ps1` which will launch PoetryApp.exe and open the default Web browser browsing [http://localhost:5000 http://localhost:5300].&lt;br /&gt;
&lt;br /&gt;
You can copy or move the shortcut to any launch area of Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In case you have other apps running at port 5300, you need to change the following settings:&lt;br /&gt;
&lt;br /&gt;
# File `bin/appsettings.json`: Alter Kestrel/Endpoints/Http/Url to &amp;quot;[http://localhost:Port http://localhost:PortNotInUse]&amp;quot;, for example, &amp;quot;[http://localhost http://localhost:5310&amp;quot;]&lt;br /&gt;
#File `StartPoetryApp.ps1`: Alter respective URL of &amp;quot;start-process&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*The desktop app&#039;s backend is running on Kestrel which does not read web.config with some rewrite rules, and these rules are for entering the app from any valid frontend routes. However, because you almost always enter the frontend the first time through the startup URL, and the service worker of the frontend will then later on take care of the routing. So eventually you later can access the app from any valid frontend routes.&lt;br /&gt;
*Likewise, the static read only variant (Poetry Viewer) of the app also rely on the service worker for routing. Poetry Viewer is often hosted in a server without explicit backend and you may not have control of the server config for the rewrite rules.&lt;br /&gt;
&lt;br /&gt;
==MacOS Desktop App==&lt;br /&gt;
[[File:Local app on MacOS.png|thumb|local app on MacOS]]&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/7.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64. Optional. If you had installed the self contained release, you don&#039;t need to install&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
# Extract the Zip file to a desired folder, for example, &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;&lt;br /&gt;
#[https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 Apply &amp;quot;chmod 755&amp;quot; to files &amp;quot;StartPoetryApp.command&amp;quot; and &amp;quot;bin/PoetryApp&amp;quot;] to make both become executable.&lt;br /&gt;
&lt;br /&gt;
===Execution===&lt;br /&gt;
&lt;br /&gt;
=====In Terminal=====&lt;br /&gt;
#Under &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;, execute &amp;quot;./StartPoetryApp.command&amp;quot;. And this will launch PoetryApp as a local service hosting http://localhost:5300 and open browser Safari or Chrome, and go to http://localhost:5300&lt;br /&gt;
&lt;br /&gt;
=====In Finder=====&lt;br /&gt;
&lt;br /&gt;
#Double click &amp;quot;StartPoetryApp.command&amp;quot;.&lt;br /&gt;
[[File:PoetryApp Local Service.png|alt=PoetryApp Local Service|thumb|PoetryApp Local Service]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may make an Alias of &amp;quot;StartPoetryApp.command&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=235</id>
		<title>Live Examples</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Live_Examples&amp;diff=235"/>
		<updated>2022-11-04T22:01:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;[https://fonlow.com/byron/ George Gordon Byron Poetry]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://fonlow.com/libai/ Chinese Poetry of Li Bai Supporting Traditional and Simplified Chinese]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[https://zijianhuang.github.io/poets/ Poetry Collections of Poets hosted on GitHub], [http://fonlow.poets.s3-website-ap-southeast-2.amazonaws.com/ on AWS],  [https://storage.googleapis.com/poets_bucket/index.html on GCP] and [https://thankful-grass-0793a2d1e.2.azurestaticapps.net/ on Azure].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While the full app is designed for one poet, the static read only variant of the app Poetry Viewer may contain collections of poets.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=234</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=234"/>
		<updated>2022-11-04T22:00:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Deploy to Azure Static Web Apps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according to https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://thankful-grass-0793a2d1e.2.azurestaticapps.net/&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access url have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
[https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html Please check https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html] first for detailed steps.&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Clear all files in root&lt;br /&gt;
#Copy index.html, *.js, ngsw.json and styles*.css.&lt;br /&gt;
#Optionally alter base href in index.html to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;conf/font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=233</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=233"/>
		<updated>2022-11-02T10:16:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according to https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://agreeable-grass-04c89cb10.2.azurestaticapps.net/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access url have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Clear all files in root&lt;br /&gt;
#Copy index.html, *.js, ngsw.json and styles*.css.&lt;br /&gt;
#Optionally alter base href in index.html to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;conf/font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=232</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=232"/>
		<updated>2022-11-02T10:07:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Static Read Only Website (Poetry Viewer) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
[[File:Full app files structure.png|thumb|Full app files structure]]&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
The installation of Poetry MP takes around 36 MB in disk size. After removing folder &amp;quot;bin&amp;quot; and folder &amp;quot;PoetryApp_Data&amp;quot;, the JavaScript files and other assets take around 3 MB.&lt;br /&gt;
[[File:Viewer.png|thumb|View Files Structure]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://agreeable-grass-04c89cb10.2.azurestaticapps.net/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access url have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Production build&lt;br /&gt;
#Update the following files:&lt;br /&gt;
##Clear JavaScript files and index.html.&lt;br /&gt;
##index.html and alter base href to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=File:Viewer.png&amp;diff=231</id>
		<title>File:Viewer.png</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=File:Viewer.png&amp;diff=231"/>
		<updated>2022-11-02T09:58:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;View Files Structure&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=File:Full_app_files_structure.png&amp;diff=230</id>
		<title>File:Full app files structure.png</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=File:Full_app_files_structure.png&amp;diff=230"/>
		<updated>2022-11-02T09:54:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Full app files structure&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=229</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=229"/>
		<updated>2022-11-02T09:39:31Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Distribution and Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to {{SITENAME}}! ==&lt;br /&gt;
Poetry Management and Publishing (Poetry MP) is a poetry app for a poet to manage poems and publish online. &lt;br /&gt;
&lt;br /&gt;
The full app can run on Microsoft Windows, MacOS and Linux as a desktop app, or run on a Windows based or Linux based Web server as a Web app.  And the frontend of the app may be hosted as a static Website to publish the poetry content. Thus, you as a poet can use the full app to manage your poetry on Windows/MacOS/Linux PC, and publish content in a static Website which is cheap or free to run. If you would install the full app in a Web server, the full app can support both management and publishing.&lt;br /&gt;
&lt;br /&gt;
The app is distributed as freeware.&lt;br /&gt;
&lt;br /&gt;
To have some impression of the app, please check:&lt;br /&gt;
&lt;br /&gt;
* [[Live Examples]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[User Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is presumed that you are a computer literate who understands basic concept of Website, upload, and Webmastering, though knowledge of Web programming is not required.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
How people have been publishing or sharing poems through electronic means if not involving traditional publishers? Here&#039;s the list of some scenarios:&lt;br /&gt;
&lt;br /&gt;
# Copy machine. After writing some poems on papers, the poet made copies and mail out.&lt;br /&gt;
# Fax.&lt;br /&gt;
# Email since the birth of the Internet.&lt;br /&gt;
# BBS.&lt;br /&gt;
# Gopher.&lt;br /&gt;
# Newsgroup.&lt;br /&gt;
# Static Web pages.&lt;br /&gt;
# Blog&lt;br /&gt;
# Web 2.0 applications such as social networking services and wiki.&lt;br /&gt;
# Poetry sites like: &amp;lt;nowiki&amp;gt;https://poets.org/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetryfoundation.org&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetrybyheart.org.uk/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://thepoetryhour.com/&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
# Poetry writing apps, like those listed at https://play.google.com/store/search?q=poetry+writing&amp;amp;c=apps &lt;br /&gt;
&lt;br /&gt;
=== Poetry Management and Publishing (PoetryMP) ===&lt;br /&gt;
The app is designed for the following users:&lt;br /&gt;
&lt;br /&gt;
# Poets who would write poems on computers and publish online. &lt;br /&gt;
# Poetry lovers who would publish poems authorized by the poets, or publish poems which copyright are expired or are in public domain.&lt;br /&gt;
&lt;br /&gt;
And the advanced features are designed for such scenarios:&lt;br /&gt;
&lt;br /&gt;
# The poet had written over 100 poems.&lt;br /&gt;
# Many of the poems contain allusions and quotations which need annotations so readers who may not be familiar with the allusions could understand. This app supports numbered annotations (superscript) and phase-based annotations which may be shared among poems.&lt;br /&gt;
# Full text search.&lt;br /&gt;
# Tagging for categorization.&lt;br /&gt;
# Insert images to a poem. The image could be embedded, locally hosted or external. And you may convert external images to locally hosted, so the full app or the static read only variant may work fully offline with images being hosted locally.&lt;br /&gt;
# The readers will read, browse and search poems on PC, tablets and smartphones.&lt;br /&gt;
# Allocate poems into albums.&lt;br /&gt;
# For Chinese poets and respective readers, the Chinese edition of the app provides simplified/traditional Chinese conversion.&lt;br /&gt;
&lt;br /&gt;
What&#039;s Not:&lt;br /&gt;
&lt;br /&gt;
* Specialized for writing poems with vocabulary dictionary.&lt;br /&gt;
* A forum&lt;br /&gt;
* A social networking app&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From certain point of view, PoetryMP is a personal poetry blog which can run as a desktop program or a personal Website. And you can publish your poetry through a full Website or a static Website.&lt;br /&gt;
&lt;br /&gt;
=== Distribution and Installation ===&lt;br /&gt;
PoetryMP is distributed as freeware at the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The app is build on ASP.NET and can run on Windows, MacOS and Linux with ASP.NET 6 runtime installed.&lt;br /&gt;
&lt;br /&gt;
And the static readonly variant of the app Poetry Viewer is a [https://en.wikipedia.org/wiki/Single-page_application SPA], which is using the same codes of the frontend of the full app.  For more details, please check:&lt;br /&gt;
&lt;br /&gt;
*[[Deployment]]&lt;br /&gt;
*[[Deployment for Poetry Viewer]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Maintenance&amp;diff=228</id>
		<title>Maintenance</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Maintenance&amp;diff=228"/>
		<updated>2022-11-02T05:29:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Edit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Export==&lt;br /&gt;
[[File:Export functions.png|thumb|Export functions]]The export functions could be used to export the poetry collection into JSON files and export all images into a zip file, then you download to a local drive for backup or publishing to a static Website.&lt;br /&gt;
===Export All===&lt;br /&gt;
This will result in downloading the poetry collection including settings in a JSON file. And the data in the JSON file can be used as a backup or become the data in a static Website for publishing. If your poetry collection contain locally hosted images, you may also need to &amp;quot;Export All Images&amp;quot;.&lt;br /&gt;
===Export All Published===&lt;br /&gt;
This command is available when &amp;quot;Settings/Edit/Use Published Date&amp;quot; is on. For deceased poets or poems published decades ago, published date is likely insignificant. If you have poems in draft, you may not want to publish them yet, then this command could be useful.[[File:Published Date.png|center|Published Date]]A poem is published if the date published is defined.&lt;br /&gt;
===Export All Images===&lt;br /&gt;
If you had uploaded images into the database, you should export all images into a zip file. The zip file could be used as a backup or become the content of the static Website that you use for publishing.&lt;br /&gt;
==Backup==&lt;br /&gt;
This basically download the poetry database which is with Sqlite database engine.&lt;br /&gt;
===Sqlite Database File===&lt;br /&gt;
If you install PoetryApp MP as local desktop app, you may close the app and go to app&#039;s sub folder &amp;quot;PoetryApp_Data&amp;quot; and copy file poems.db to your backup drive. And it is better to name the backup file as &amp;quot;poemsYYYYMMDD.db&amp;quot; like &amp;quot;poems20211023.db&amp;quot;.&lt;br /&gt;
===JSON File and Optional Images.zip===&lt;br /&gt;
The exported JSON file and the optional images.zip could be used as backup to be restored into a blank poems.db.&lt;br /&gt;
&lt;br /&gt;
To restore the database, please check &#039;&#039;&#039;[[Restore]]&#039;&#039;&#039;.&lt;br /&gt;
==Settings==&lt;br /&gt;
===Author===&lt;br /&gt;
PoetryApp is designed for one poet, and you may input the basic poet info here.&lt;br /&gt;
===Poetry===&lt;br /&gt;
This section defines some language attributes of the poetry collection. It is optional to define the attributes.&lt;br /&gt;
&lt;br /&gt;
For Chinese poetry, the situation could be more complex with 2 written systems and multiple dialects. For more details, check [[Settings for Chinese Poetry]].&lt;br /&gt;
===Edit===&lt;br /&gt;
When editing a poem, you may apply multiple optional attributes to the poem.&lt;br /&gt;
&lt;br /&gt;
Also you may alter the styles of the date picker of the published date, and enable advanced clipboard functions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The settings may apply to all registered users, since the app is designed for managing poetry of one poet only.&lt;br /&gt;
===View===&lt;br /&gt;
The settings affect how the poem viewer displays the attributes of a poem. The settings defined here are stored in Web browser&#039;s local storage, not in the DB, thus the settings are effective as per the browser.&lt;br /&gt;
==Annotations Management==&lt;br /&gt;
[[File:Annotations management.png|thumb|annotations management]]Since phase-based annotations may be shared among poems, this is a center for managing annotations.&lt;br /&gt;
&lt;br /&gt;
The number associated with each chip indicate how many poems are referencing the same annotation.&lt;br /&gt;
&lt;br /&gt;
When you click a chip, you may edit the annotation. Or, if you change the &amp;quot;Click-Chip Action&amp;quot; to &amp;quot;List Poems&amp;quot;, clicking a chip results in listing all poems referencing the same annotation.&lt;br /&gt;
==Local Pictures Management==&lt;br /&gt;
[[File:Pictures Management.png|thumb|Pictures Management]]This is a center for managing locally hosted images which were uploaded and stored in the database.&lt;br /&gt;
&lt;br /&gt;
The number associated with an image is to indicate how many poems are referencing the image, while the poems are listed as chips. Clicking a chip will display the respective poems then you may edit.&lt;br /&gt;
&lt;br /&gt;
Since the poem is loading to HTML img tag like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img class=&amp;quot;local&amp;quot; src=&amp;quot;api/files/file/e65bb512-1a9d-4a78-ac9e-83d74fbf9e8c.jpeg&amp;quot; alt=&amp;quot;Pallas Athena&amp;quot; loading=&amp;quot;lazy&amp;quot; decoding=&amp;quot;async&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;However, the references recorded in the database and the references in HTML codes may lost sync from time to time, for example, you had removed respective HTML tags. Then you need to audit.&lt;br /&gt;
===Audit===&lt;br /&gt;
The app will scan associated poems to find out if the image is really referenced in each poem.&lt;br /&gt;
===Audit All===&lt;br /&gt;
The app will scan all poems to find out if any hosted image is not referenced in any poem.&lt;br /&gt;
===Audit and Reconcile===&lt;br /&gt;
Audit all, then remove orphaned images from the database.&lt;br /&gt;
==External Pictures Management==&lt;br /&gt;
[[File:External Pictures.png|thumb|External Pictures]]A poem may contain images from external source, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img width=&amp;quot;512&amp;quot; alt=&amp;quot;RenÃ©-Antoine Houasse - The Dispute of Minerva and Neptune, 1689&amp;quot; src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Ren%C3%A9-Antoine_Houasse_-_The_Dispute_of_Minerva_and_Neptune%2C_1689.jpg/512px-Ren%C3%A9-Antoine_Houasse_-_The_Dispute_of_Minerva_and_Neptune%2C_1689.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This module will scan all poems and list poems referencing external images.&lt;br /&gt;
===Remote to Local===&lt;br /&gt;
This will download the external picture and save to the database, and make the respective HTML img tag reference to the locally hosted image. And the description will be come the alt attribute of element img.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is entirely your responsibility to sort our the copyright issues of the images used in the content.of poetry, through referencing or locally hosting.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=EULA&amp;diff=227</id>
		<title>EULA</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=EULA&amp;diff=227"/>
		<updated>2022-10-30T05:10:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FONLOW IT SOFTWARE END-USER LICENSE AGREEMENT&lt;br /&gt;
&lt;br /&gt;
Poetry MP is distributed as FREEWARE.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2004-2022 FONLOW IT, All Rights Reserved.&lt;br /&gt;
&lt;br /&gt;
This software is provided &amp;quot;as-is,&amp;quot; without any express or implied warranty. In no event shall the author be held liable for any damages arising from the use of this software.&lt;br /&gt;
&lt;br /&gt;
Permission is granted to anyone to use this software for individual or commercial purposes, provided that the following conditions are met:&lt;br /&gt;
&lt;br /&gt;
1. All redistributions of the Application files must retain all copyright notices that are currently in place, and this list of conditions without modification.&lt;br /&gt;
&lt;br /&gt;
2. All redistributions must retain all occurrences of the above copyright notice and web site addresses that are currently in place (for example, in the About boxes).&lt;br /&gt;
&lt;br /&gt;
3. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.&lt;br /&gt;
&lt;br /&gt;
Distributed as freeware, Poetry MP does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=226</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=226"/>
		<updated>2022-10-29T01:37:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* ISP gives you a Website */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldn&#039;t be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://agreeable-grass-04c89cb10.2.azurestaticapps.net/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access url have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Production build&lt;br /&gt;
#Update the following files:&lt;br /&gt;
##Clear JavaScript files and index.html.&lt;br /&gt;
##index.html and alter base href to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=225</id>
		<title>Deployment for Poetry Viewer</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment_for_Poetry_Viewer&amp;diff=225"/>
		<updated>2022-10-29T01:33:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Static Read Only Website (Poetry Viewer) ==&lt;br /&gt;
PoetryApp can become a static read only Website, serving as a poetry viewer online or locally, without a Web service backend. The poems data is exported into JSON files using the full app. Such deployment makes a static content Website has rich user interfaces and user interactions, including search functions. Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] (PWA), thus after being installed as a local app, and the poetry content is cached locally.&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
Basically any Web server like IIS, Apache and NGINX etc. that could serve HTML, JavaScript, JSON and image files should be fine. In addition to create your own or rent one in DC or Cloud, many ISPs provide a free Website or Web page storage for each customer, which support FTP upload.&lt;br /&gt;
&lt;br /&gt;
=== Client Device Requirements ===&lt;br /&gt;
The GUI of the app is composed through HTML5 and JavaScript, requiring not too old devices, as listed below.&lt;br /&gt;
&lt;br /&gt;
==== iOS ====&lt;br /&gt;
iPhone X and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
iPad 5 and iOS 14 or above.&lt;br /&gt;
&lt;br /&gt;
==== Android ====&lt;br /&gt;
Andoid 7&lt;br /&gt;
&lt;br /&gt;
==== Windows PC ====&lt;br /&gt;
Windows 7, latest Chrome and Firefox.&lt;br /&gt;
&lt;br /&gt;
==== Mac ====&lt;br /&gt;
Catalian, Safari 13.1, Chrome 104&lt;br /&gt;
&lt;br /&gt;
Yosemite, Chrome 87&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
The following files may be modified:&lt;br /&gt;
*index.html&lt;br /&gt;
*conf/siteconfig.js&lt;br /&gt;
*conf/manifest.json&lt;br /&gt;
*conf/favicon.png&lt;br /&gt;
*conf/fonts.css&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The initial site title is &amp;quot;Poetry Collection&amp;quot; as defined in the title tag of index.html. And the site title can also be declared in siteconfig.js as &amp;quot;siteName&amp;quot; which will render the site title in HTML dynamically.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 1: [https://fonlow.com/byron/conf/siteconfig.js conf/siteconfig.js] for [https://fonlow.com/byron/ George Gordon Byron Poetry Demo Page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Byron Collection&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Byron&#039;},&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:ByronDemo.jpg|thumb|Byron poems]]And file &amp;quot;Byron.JSON&amp;quot; should be located at folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Since the SPA is not hosted in a Website root but a sub folder &amp;quot;byron&amp;quot;, in &amp;quot;index.html&amp;quot;, make sure tag base/href point to this, like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/byron/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;This is important for the page to load the JavaScript files of the SPA correctly. If you host the SPA at the Website root, you may have:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;Poetry Viewer conforms to [https://en.wikipedia.org/wiki/Progressive_web_app Progress Web App] ([[PWA]]), and the app is accompanied with file &amp;quot;conf/manifest.json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2: for [https://fonlow.com/libai/ Chinese Poetry of Li Bai with 2 writing systems]&#039;&#039;&#039;[[File:Screenshot 2022-09-16 193539.jpg|thumb|Libai poems in traditional Chinese writing]]&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;李白诗集&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;primary&#039;, secondaryFilename: &#039;secondary&#039;}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Libai poems in simplified Chinese writing.jpg|thumb|Libai poems in simplified Chinese writing]]Both &amp;quot;primary.json&amp;quot; and &amp;quot;secondary.json&amp;quot; should be in folder &amp;quot;data&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 3: for multiple poets at [https://zijianhuang.github.io/poets/ demo page]&#039;&#039;&#039;&amp;lt;pre lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
const SITE_CONFIG = {&lt;br /&gt;
	siteName: &#039;Poetry Collections&#039;,&lt;br /&gt;
	staticReadonly: true,&lt;br /&gt;
	staticDatas: [&lt;br /&gt;
		{filename: &#039;Shelley&#039;, poetName: &#039;Percy Bysshe Shelley&#039;},&lt;br /&gt;
		{filename: &#039;Byron&#039;, poetName: &#039;George Gordon Byron&#039;},&lt;br /&gt;
		{filename: &#039;EdgarAllanPoe&#039;, poetName: &#039;Edgar Allan Poe&#039;},&lt;br /&gt;
		{filename: &#039;LiBai&#039;, poetName: &#039;李白&#039;, secondaryFilename: &#039;LiBai2nd&#039;}&lt;br /&gt;
	]	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[File:Poets on iPad.jpg|thumb|poets]]&lt;br /&gt;
==Deploy to ISP Provided Website==&lt;br /&gt;
An ISP often by default provides a customer with the such Website or Home Pages Service:&lt;br /&gt;
*&amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;, you have a Website.&lt;br /&gt;
*&amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, you have Home Pages Service, under a Website &amp;lt;code&amp;gt;[http://users.isp.com/ http://users.isp.com]&amp;lt;/code&amp;gt; shared by all users/customers.&lt;br /&gt;
Generally you may use FTP to upload your static contents to there. For more details of uploading, please refer to the instructions provided by your ISP.&lt;br /&gt;
===ISP gives you a Website===&lt;br /&gt;
Good luck. The SPA codes should be working right away at &amp;lt;code&amp;gt;[http://yourusername.superisp.com/ http://YourUserName.superisp.com]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And changing &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; may become just optional&lt;br /&gt;
&lt;br /&gt;
If your SPA shouldnât be your home page content, you may want the access URL to your SPA to be such: &amp;lt;code&amp;gt;[http://yourusername.superisp.com/MySPA http://YourUserName.superisp.com/MySPA]&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Create folder MySPA  under the Web root.&lt;br /&gt;
#Modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
#Upload the SPA static contents.&lt;br /&gt;
===ISP give you a path to a Website shared by all users===&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName&amp;lt;/code&amp;gt;, modify &amp;quot;index.html&amp;quot; and &amp;quot;manifest.json&amp;quot; as shown in the examples above.&lt;br /&gt;
&lt;br /&gt;
To host your SPA at &amp;lt;code&amp;gt;http://users.isp.com/YourUserName/MySPA&amp;lt;/code&amp;gt;, modify the base tag of index.html to &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/YourUserName/MySPA/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; and do similar things to &amp;quot;manifest.json&amp;quot;&lt;br /&gt;
==Deploy to Github Pages==&lt;br /&gt;
GitHub gives you are Website like &amp;lt;code&amp;gt;[https://yourusername.github.io/ https://YourUserName.github.io]&amp;lt;/code&amp;gt;. Each repository may have a home page like &amp;lt;code&amp;gt;[https://yourusername.github.io/repo1 https://YourUserName.github.io/repo1]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://yourusername.github.io/repo2 https://YourUserName.github.io/repo2]&amp;lt;/code&amp;gt; and so on. For more details of uploading, please check: &amp;lt;code&amp;gt;https://pages.github.com/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://docs.github.com/en/pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following descriptions assume that you have read the GitHub Pages manual, and the repository gh-pages is already in place.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch gh-pages of the repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/poems/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; or alike, and modify &amp;quot;manifest.json&amp;quot; accordingly.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
#Test. It may take Github.io a few dozen seconds to reflect the changes just being pushed.&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please check https://github.com/zijianhuang/poets/tree/gh-pages/docs for basic structure.&lt;br /&gt;
&lt;br /&gt;
==Deploy to Azure Static Web Apps==&lt;br /&gt;
An instance of Azure Static Web Apps give you a Website, and the free tier gives you around 0.5GB storage according https://azure.microsoft.com/en-us/pricing/details/app-service/static/&lt;br /&gt;
&lt;br /&gt;
Assuming you will be using GitHub as a source, you may prepare the content:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps:&#039;&#039;&#039;&lt;br /&gt;
#Copy the build to branch azure-pages repository.&lt;br /&gt;
#Modify index.html and ensure &amp;lt;code&amp;gt;&amp;amp;lt;base href=&amp;amp;quot;/&amp;amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;if you would deploy the app to the Website root.&lt;br /&gt;
#Commit and push.&lt;br /&gt;
The following steps outlines only a few key steps of deploying, and you should read respective manual of Microsoft Azure Static Web Apps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Steps to deploy&#039;&#039;&#039;:&lt;br /&gt;
#In &amp;quot;Create Static Web App&amp;quot;, choose a name, such as &amp;quot;poets&amp;quot;.&lt;br /&gt;
#In &amp;quot;Deployment Details/Source&amp;quot;, choose GitHub, and select respective organization, repository and branch, such as &amp;quot;azure-pages&amp;quot;.&lt;br /&gt;
#In &amp;quot;Build Details/Build Presets&amp;quot;, select &amp;quot;Custom&amp;quot;, and in &amp;quot;App Location&amp;quot;, select &amp;quot;appcontent&amp;quot; if you had copied the scripts to here rather than the repository&#039;s root.&lt;br /&gt;
A few minutes after the deployment is done, the app should appear in the URL of the static Web app. For example, at &#039;&#039;&#039;https://agreeable-grass-04c89cb10.2.azurestaticapps.net/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Microsoft&#039;s free tier is basically a free trial for up to 12 months.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;When you sign up for an Azure free account, you get a Free Trial subscription, which provides you $200 Azure credit in your billing currency for 30 days and 12 months of free services&#039;&#039;. &amp;quot; @ https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled&lt;br /&gt;
==Deploy to Google Cloud Bucket as a Web page or Website==&lt;br /&gt;
As described in &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot;, without your own custom domain, you could have only static Web page content become publicly accessible, and the access url have to be directly to index.html or alike, even if you have assigned MainPageSuffix with index.html.&lt;br /&gt;
&lt;br /&gt;
Assuming you have read and followed &amp;quot;[https://cloud.google.com/storage/docs/hosting-static-website Host a static website]&amp;quot; and you don&#039;t associate your own custom domain with the bucket, then to access the SPA you will have to use a URL like&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://storage.googleapis.com/poets_bucket/index.html&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And URL like https://storage.googleapis.com/poets_bucket will have Google Cloud Bucket to return an XML content listing all files in the bucket. If you don&#039;t like such listing, you may change principal &amp;quot;allUsers&amp;quot; to role &amp;quot;Storage Legacy Object Reader&amp;quot;, then Google Cloud Bucket will return XML with error message &amp;quot;Access denied&amp;quot;.&lt;br /&gt;
==Deploy to AWS S3 Bucket==&lt;br /&gt;
https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html&lt;br /&gt;
&lt;br /&gt;
For example: &#039;&#039;&#039;http://fonlow.heroes.s3-website-us-east-1.amazonaws.com/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AWS Provide the following means to publish:&lt;br /&gt;
#Web UI the S3 console&lt;br /&gt;
#REST API. This could be used automatic deployment from client sides.&lt;br /&gt;
#AWS SDKs&lt;br /&gt;
#AWS CLI&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;As part of the AWS Free Tier, you can get started with Amazon S3 for free. Upon sign-up, new AWS customers receive 5GB of Amazon S3 storage in the S3 Standard storage class; 20,000 GET Requests; 2,000 PUT, COPY, POST, or LIST Requests; and 100 GB of Data Transfer Out each month&#039;&#039;.&amp;quot; @ https://aws.amazon.com/s3/pricing/?p=ft&amp;amp;amp;c=wa&amp;amp;amp;z=2&lt;br /&gt;
&lt;br /&gt;
And NO HTTPS access.&lt;br /&gt;
&lt;br /&gt;
Good enough for the SPA which requires loading basically once.&lt;br /&gt;
==Casual App Fontend Update==&lt;br /&gt;
#Production build&lt;br /&gt;
#Update the following files:&lt;br /&gt;
##Clear JavaScript files and index.html.&lt;br /&gt;
##index.html and alter base href to &amp;quot;/poems/&amp;quot; or alike.&lt;br /&gt;
If there are changes in assets, copy things accordingly.&lt;br /&gt;
===Customize Styles After Deployment===&lt;br /&gt;
&amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; is not among the NG build process and is referenced in index.html directly. This is an interface for customization of some sections of the app.&lt;br /&gt;
&lt;br /&gt;
You can introduce new fonts and new styles to respective sections through altering &amp;lt;code&amp;gt;font.css&amp;lt;/code&amp;gt; and copying some font files (WOFF2 typically) under &amp;lt;code&amp;gt;assets/fonts&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Prepare Poetry Contents==&lt;br /&gt;
Please check [[Maintenance#Export]].&lt;br /&gt;
==SEO==&lt;br /&gt;
In Index.html, There is a script section like:&amp;lt;pre lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;@context&amp;quot;: &amp;quot;http://schema.org&amp;quot;,&lt;br /&gt;
    &amp;quot;@type&amp;quot;: &amp;quot;WebApplication&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Poetry collection&amp;quot;,&lt;br /&gt;
    &amp;quot;keywords&amp;quot;: &amp;quot;Poetry,Poems,Poet,Muse&amp;quot;,&lt;br /&gt;
    &amp;quot;browserRequirements&amp;quot;: &amp;quot;requires HTML5 support&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;Web spiders will pick up this and make appropriate indexing.&lt;br /&gt;
==Summary of Customization==&lt;br /&gt;
The above sections had introduced various customization during deployment and after build. This section gives a summary.&lt;br /&gt;
===Index.html===&lt;br /&gt;
====Element base/href====&lt;br /&gt;
If you deploy in a sub folder under the Web root, you need to alter the value of this element every time a new build comes in.&lt;br /&gt;
&lt;br /&gt;
==== Element title ====&lt;br /&gt;
The value of title is shown in the browser tab as site title. However, the value defined in this element will be replaced by setting &amp;quot;siteName&amp;quot; defined in &amp;quot;conf/siteconfig.js&amp;quot; unless the setting is not defined. Since index.html is altered in every build, it is generally better to custom site title with setting siteName, though when the index.html page is loaded you may see the title defined in index.html for a few milliseconds then the one defined in siteconfig.js. When a new build comes in, generally you don&#039;t want to alter what in folder &amp;quot;conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== conf/favicon.png ===&lt;br /&gt;
You may want to define your own favicon.&lt;br /&gt;
===conf/fonts.css===&lt;br /&gt;
You may want to custom some fonts being used in the frontend.&lt;br /&gt;
===conf/manifest.json===&lt;br /&gt;
If you expect your readers to install the app as a PWA app, you may alter the following settings, otherwise, just leave the file alone.&lt;br /&gt;
*name: presented when OS or Web browser prompts for installation of the PWA.&lt;br /&gt;
*short_name: used as the label of the shortcut icon.&lt;br /&gt;
*description&lt;br /&gt;
*id: Unique ID to represent an instance of PoetryApp or Poetry Viewer. So when the app is updated and &amp;quot;name&amp;quot; or &amp;quot;short_name&amp;quot; is changed, the OS or the browser may recognize the same instance through this ID.&lt;br /&gt;
===conf/siteconfig.js===&lt;br /&gt;
====siteName====&lt;br /&gt;
If defined, this will overwrite the site title defined in index.html. If you want to customize the site title, this is the setting you should use.&lt;br /&gt;
&lt;br /&gt;
==== staticReadonly ====&lt;br /&gt;
When true, the site is static read only, no Web service backend needed.&lt;br /&gt;
====staticDatas====&lt;br /&gt;
Being used when staticReadonly is true, this setting provides a reference to JSON files located in folder data, and the filenames in the index should not include the file extension name &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== copyPoemEnabled ====&lt;br /&gt;
Enable a button to copy the content of a poem to clipboard.&lt;br /&gt;
&lt;br /&gt;
==== copyAlbumEnabled ====&lt;br /&gt;
Enable a button to copy the content of an album to clipboard.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=224</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=224"/>
		<updated>2022-10-28T08:26:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* MacOS Desktop App */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for IT administers, Web masters and computer literates who have basic skills of deploying a Website or unzip a file of a software application. The files needed are available in the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The backend and the fontend should be hosted in the same host. And the DB engine is with Sqlite.&lt;br /&gt;
&lt;br /&gt;
== Deploy to IIS ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime Hosting Bundle] for Windows IIS.&lt;br /&gt;
# A Website created with Application Pool of &amp;quot;No Managed Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
# Extract the Zip file to the Website root folder.&lt;br /&gt;
# Alter bin/appsettings.json with `UseHttps: true` to enforce HTTPS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* It may be beneficial to set a IIS rewrite rule in Web.config to further enforce HTTPS, while this is optional, since the app itself along with ASP.NET Core Runtime Hosting Bundle is capable of redirecting HTTP calls to HTTPS.&lt;br /&gt;
* Single Page Applications often have rewrite rules defined either in Web server (IIS or Apache) config for entering the app from any valid frontend routes. Web.config coming with the app supports such. However, when the app is running with Kestrel, web.config is not used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to purchase a SSL certificate, you may use &amp;quot;[https://letsencrypt.org/ Let&#039;s Encrypt]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Windows Desktop App==&lt;br /&gt;
The releases for desktop app are basically the same as the ones for Web App, however, the release is hosted in a local Web server Kestrel included in ASP.NET Core Runtime.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
#Either install the MSI file or extract the Zip file to a desired folder.&lt;br /&gt;
#In folder, double click &amp;quot;CreateShortcut.bat&amp;quot; which will create a shortcut on Windows desktop. This shortcut actually runs `StartPoetryApp.ps1` which will launch PoetryApp.exe and open the default Web browser browsing [http://localhost:5000 http://localhost:5300].&lt;br /&gt;
&lt;br /&gt;
You can copy or move the shortcut to any launch area of Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In case you have other apps running at port 5300, you need to change the following settings:&lt;br /&gt;
&lt;br /&gt;
# File `bin/appsettings.json`: Alter Kestrel/Endpoints/Http/Url to &amp;quot;[http://localhost:Port http://localhost:PortNotInUse]&amp;quot;, for example, &amp;quot;[http://localhost http://localhost:5310&amp;quot;]&lt;br /&gt;
#File `StartPoetryApp.ps1`: Alter respective URL of &amp;quot;start-process&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*The desktop app&#039;s backend is running on Kestrel which does not read web.config with some rewrite rules, and these rules are for entering the app from any valid frontend routes. However, because you almost always enter the frontend the first time through the startup URL, and the service worker of the frontend will then later on take care of the routing. So eventually you later can access the app from any valid frontend routes.&lt;br /&gt;
*Likewise, the static read only variant (Poetry Viewer) of the app also rely on the service worker for routing. Poetry Viewer is often hosted in a server without explicit backend and you may not have control of the server config for the rewrite rules.&lt;br /&gt;
&lt;br /&gt;
==MacOS Desktop App==&lt;br /&gt;
[[File:Local app on MacOS.png|thumb|local app on MacOS]]&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64. Optional. If you had installed the self contained release, you don&#039;t need to install&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
# Extract the Zip file to a desired folder, for example, &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;&lt;br /&gt;
#[https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 Apply &amp;quot;chmod 755&amp;quot; to files &amp;quot;StartPoetryApp.command&amp;quot; and &amp;quot;bin/PoetryApp&amp;quot;] to make both become executable.&lt;br /&gt;
&lt;br /&gt;
===Execution===&lt;br /&gt;
&lt;br /&gt;
=====In Terminal=====&lt;br /&gt;
#Under &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;, execute &amp;quot;./StartPoetryApp.command&amp;quot;. And this will launch PoetryApp as a local service hosting http://localhost:5300 and open browser Safari or Chrome, and go to http://localhost:5300&lt;br /&gt;
&lt;br /&gt;
=====In Finder=====&lt;br /&gt;
&lt;br /&gt;
#Double click &amp;quot;StartPoetryApp.command&amp;quot;.&lt;br /&gt;
[[File:PoetryApp Local Service.png|alt=PoetryApp Local Service|thumb|PoetryApp Local Service]]&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may make an Alias of &amp;quot;StartPoetryApp.command&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=File:PoetryApp_Local_Service.png&amp;diff=223</id>
		<title>File:PoetryApp Local Service.png</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=File:PoetryApp_Local_Service.png&amp;diff=223"/>
		<updated>2022-10-28T08:19:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PoetryApp Local Service&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=User_Manual&amp;diff=222</id>
		<title>User Manual</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=User_Manual&amp;diff=222"/>
		<updated>2022-10-28T00:44:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The UI of Poetry MP is designed for PC monitors and tablets, while the UI of Poetry Viewer is designed for PC monitors, tablets and mobile phones.&lt;br /&gt;
&lt;br /&gt;
== Startup ==&lt;br /&gt;
Depending on you had installed the app, the access URL could be:&lt;br /&gt;
&lt;br /&gt;
# http://poetryapp.localhost if you had installed the app on local IIS or Apache.&lt;br /&gt;
# http://localhost:5300 if you run the app directly through the Powershell script or bash script.&lt;br /&gt;
# http://poetryapp.mydomain.com if you had installed the app on a Web server.&lt;br /&gt;
&lt;br /&gt;
[[File:StartupScreen.jpg|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
Without login, the users can view published poems only.&lt;br /&gt;
&lt;br /&gt;
The default password for user admin after installation is &amp;quot;Pppppp*8&amp;quot; and you should alter the password ASAP, and keep the new password in a safe place.&lt;br /&gt;
&lt;br /&gt;
=== Managing Users ===&lt;br /&gt;
[[File:After Login.png|thumb|After Login]]&lt;br /&gt;
Since the app is for one poet, generally you just need one user admin. In case you may more than one to manage, you may create extra users. &lt;br /&gt;
&lt;br /&gt;
[[File:AfterLogin.png|thumb|AfterLogin]]&lt;br /&gt;
&lt;br /&gt;
== Add / Edit Poem ==&lt;br /&gt;
&lt;br /&gt;
If you have been writing blogs with HTML formatting, you should be familiar with the basic operations of composing HTML contents, though composing a poem generally does not require rich formatting.&lt;br /&gt;
&lt;br /&gt;
In addition to basic HTML formatting, Poetry MP provides a few more options specially designed for composing poems with notations and images.&lt;br /&gt;
&lt;br /&gt;
=== Extra HTML Operations ===&lt;br /&gt;
[[File:Extra HTML Operations.png|thumb|Extra HTML Operations]]&lt;br /&gt;
&lt;br /&gt;
==== Insert Sup ====&lt;br /&gt;
This is similar to formatting a piece of text into superscript, however, this operation inserts a numeric superscript incrementally. And the numeric superscripts may be reordered.&lt;br /&gt;
[[File:InsertNumericSup.png|center|frameless]]&lt;br /&gt;
Then you click button &amp;quot;Suggest Numbered Annotations&amp;quot; that pops up numeric superscripts which have not been annotated into numbered annotations.&lt;br /&gt;
[[File:DefineNumberedAnnotations.png|center|Define Numbered Annotations]]&lt;br /&gt;
&lt;br /&gt;
[[File:ManageNumberedAnnotations.png|center|thumb|Manage Numbered Annotations]]&lt;br /&gt;
When clicking the numeric button, you can input content for the numbered annotation.&lt;br /&gt;
[[File:InputNumberedAnnotation.png|center|thumb|Input Numbered Annotation]]&lt;br /&gt;
When the readers of your poetry click a numbered annotation, they will see the content, or a Web paged directed by the Reference URL, or both.&lt;br /&gt;
&lt;br /&gt;
From time to time, you may have numeric superscripts scattering around not in sequential order. If you want them to be ordered incrementally, you may &amp;quot;Reorder Superscripts&amp;quot; and the app will match the numbered annotations accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Upload Image and Insert ====&lt;br /&gt;
This is similar to &amp;quot;Insert Image&amp;quot; of basic HTML formatting, however, &amp;quot;Insert Image&amp;quot; is to load a local image and insert to HTML content as [http://en.wikipedia.org/wiki/Base64 BASE64] chunk, while &amp;quot;Upload Image and Insert&amp;quot; is to store the uploaded image to the database and create a reference to the backend of the app.&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img class=&amp;quot;local&amp;quot; src=&amp;quot;api/files/file/e65bb512-1a9d-4a78-ac9e-83d74fbf9e8c.jpeg&amp;quot; alt=&amp;quot;Pallas Athena&amp;quot; loading=&amp;quot;lazy&amp;quot; decoding=&amp;quot;async&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;BASE64 chunk is generally 37% larger than the source data, thus, it is recommended to upload image and insert.&lt;br /&gt;
&lt;br /&gt;
==== Pick Images and Insert ====&lt;br /&gt;
Images uploaded into the database can be shared across poems.&lt;br /&gt;
&lt;br /&gt;
You may check to select images in &amp;quot;Local Pictures Management&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Paste as Plain Text ====&lt;br /&gt;
The HTML content that you had copied from the other sources may contain over complex or inconsistent or unsafe HTML tags, while generally the HTML content of a poem does not require rich formatting. Thus it is safer and simpler to page HTML content as plain text.&lt;br /&gt;
&lt;br /&gt;
==== Replace Double Linebreaks with One ====&lt;br /&gt;
HTML provides a few ways of rendering linebreaks. Sometimes content copied from the other sources may contain more than one linebreak between lines. This command will reduce double linebreaks into one.&lt;br /&gt;
&lt;br /&gt;
=== Annotations ===&lt;br /&gt;
&lt;br /&gt;
Phase-based annotations match phases in a poem, and the annotations may be shared across poems containing the same phases.&lt;br /&gt;
[[File:ManagePhaseBasedAnnotations.png|center|thumb|Manage Phase-based Annotations]]&lt;br /&gt;
Through clicking &amp;quot;Suggest Numbered Annotations&amp;quot; the app will scan the poem for matching existing annotations, then you may select matched annotations and associate with the poem.&lt;br /&gt;
&lt;br /&gt;
=== Albums ===&lt;br /&gt;
If you had defined some albums, you may associate an album or multiple albums with the poem.&lt;br /&gt;
[[File:AssociateAlbum.png|center|Associate Album]]&lt;br /&gt;
&lt;br /&gt;
== Album ==&lt;br /&gt;
An album is to contain a collection of poems. And you may have a description on the top as a preface.&lt;br /&gt;
[[File:Check Poems.png|thumb|Check Poems]]&lt;br /&gt;
[[File:Select Album.png|center|frameless|Select Album]]&lt;br /&gt;
Album functionality is available if &amp;quot;Settings/Edit/Use Albums&amp;quot; is on.&lt;br /&gt;
[[File:Pick Album.png|center|frameless|Pick Album]]&lt;br /&gt;
Checked poems will be contained in the album.&lt;br /&gt;
&lt;br /&gt;
To quit, click this button highlighted:&lt;br /&gt;
[[File:Deselect album.png|center|frameless|Deselect album]]&lt;br /&gt;
&lt;br /&gt;
== Maintenance ==&lt;br /&gt;
From time to time, you may need to adjust some settings, backup, export data, or manage locally hosted pictures etc. Please check [[Maintenance]] for more details.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=User_Manual&amp;diff=221</id>
		<title>User Manual</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=User_Manual&amp;diff=221"/>
		<updated>2022-10-27T12:05:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Login */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The UIk of Poetry MP is designed for PC monitors and tablets, while the UI of Poetry Viewer is designed for PC monitors, tablets and mobile phones.&lt;br /&gt;
&lt;br /&gt;
== Startup ==&lt;br /&gt;
Depending on you had installed the app, the access URL could be:&lt;br /&gt;
&lt;br /&gt;
# http://poetryapp.localhost if you had installed the app on local IIS or Apache.&lt;br /&gt;
# http://localhost:5300 if you run the app directly through the Powershell script or bash script.&lt;br /&gt;
# http://poetryapp.mydomain.com if you had installed the app on a Web server.&lt;br /&gt;
&lt;br /&gt;
[[File:StartupScreen.jpg|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
Without login, the users can view published poems only.&lt;br /&gt;
&lt;br /&gt;
The default password for user admin after installation is &amp;quot;Pppppp*8&amp;quot; and you should alter the password ASAP, and keep the new password in a safe place.&lt;br /&gt;
&lt;br /&gt;
=== Managing Users ===&lt;br /&gt;
[[File:After Login.png|thumb|After Login]]&lt;br /&gt;
Since the app is for one poet, generally you just need one user admin. In case you may more than one to manage, you may create extra users. &lt;br /&gt;
&lt;br /&gt;
[[File:AfterLogin.png|thumb|AfterLogin]]&lt;br /&gt;
&lt;br /&gt;
== Add / Edit Poem ==&lt;br /&gt;
&lt;br /&gt;
If you have been writing blogs with HTML formatting, you should be familiar with the basic operations of composing HTML contents, though composing a poem generally does not require rich formatting.&lt;br /&gt;
&lt;br /&gt;
In addition to basic HTML formatting, Poetry MP provides a few more options specially designed for composing poems with notations and images.&lt;br /&gt;
&lt;br /&gt;
=== Extra HTML Operations ===&lt;br /&gt;
[[File:Extra HTML Operations.png|thumb|Extra HTML Operations]]&lt;br /&gt;
&lt;br /&gt;
==== Insert Sup ====&lt;br /&gt;
This is similar to formatting a piece of text into superscript, however, this operation inserts a numeric superscript incrementally. And the numeric superscripts may be reordered.&lt;br /&gt;
[[File:InsertNumericSup.png|center|frameless]]&lt;br /&gt;
Then you click button &amp;quot;Suggest Numbered Annotations&amp;quot; that pops up numeric superscripts which have not been annotated into numbered annotations.&lt;br /&gt;
[[File:DefineNumberedAnnotations.png|center|Define Numbered Annotations]]&lt;br /&gt;
&lt;br /&gt;
[[File:ManageNumberedAnnotations.png|center|thumb|Manage Numbered Annotations]]&lt;br /&gt;
When clicking the numeric button, you can input content for the numbered annotation.&lt;br /&gt;
[[File:InputNumberedAnnotation.png|center|thumb|Input Numbered Annotation]]&lt;br /&gt;
When the readers of your poetry click a numbered annotation, they will see the content, or a Web paged directed by the Reference URL, or both.&lt;br /&gt;
&lt;br /&gt;
From time to time, you may have numeric superscripts scattering around not in sequential order. If you want them to be ordered incrementally, you may &amp;quot;Reorder Superscripts&amp;quot; and the app will match the numbered annotations accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Upload Image and Insert ====&lt;br /&gt;
This is similar to &amp;quot;Insert Image&amp;quot; of basic HTML formatting, however, &amp;quot;Insert Image&amp;quot; is to load a local image and insert to HTML content as [http://en.wikipedia.org/wiki/Base64 BASE64] chunk, while &amp;quot;Upload Image and Insert&amp;quot; is to store the uploaded image to the database and create a reference to the backend of the app.&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img class=&amp;quot;local&amp;quot; src=&amp;quot;api/files/file/e65bb512-1a9d-4a78-ac9e-83d74fbf9e8c.jpeg&amp;quot; alt=&amp;quot;Pallas Athena&amp;quot; loading=&amp;quot;lazy&amp;quot; decoding=&amp;quot;async&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;BASE64 chunk is generally 37% larger than the source data, thus, it is recommended to upload image and insert.&lt;br /&gt;
&lt;br /&gt;
==== Pick Images and Insert ====&lt;br /&gt;
Images uploaded into the database can be shared across poems.&lt;br /&gt;
&lt;br /&gt;
You may check to select images in &amp;quot;Local Pictures Management&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Paste as Plain Text ====&lt;br /&gt;
The HTML content that you had copied from the other sources may contain over complex or inconsistent or unsafe HTML tags, while generally the HTML content of a poem does not require rich formatting. Thus it is safer and simpler to page HTML content as plain text.&lt;br /&gt;
&lt;br /&gt;
==== Replace Double Linebreaks with One ====&lt;br /&gt;
HTML provides a few ways of rendering linebreaks. Sometimes content copied from the other sources may contain more than one linebreak between lines. This command will reduce double linebreaks into one.&lt;br /&gt;
&lt;br /&gt;
=== Annotations ===&lt;br /&gt;
&lt;br /&gt;
Phase-based annotations match phases in a poem, and the annotations may be shared across poems containing the same phases.&lt;br /&gt;
[[File:ManagePhaseBasedAnnotations.png|center|thumb|Manage Phase-based Annotations]]&lt;br /&gt;
Through clicking &amp;quot;Suggest Numbered Annotations&amp;quot; the app will scan the poem for matching existing annotations, then you may select matched annotations and associate with the poem.&lt;br /&gt;
&lt;br /&gt;
=== Albums ===&lt;br /&gt;
If you had defined some albums, you may associate an album or multiple albums with the poem.&lt;br /&gt;
[[File:AssociateAlbum.png|center|Associate Album]]&lt;br /&gt;
&lt;br /&gt;
== Album ==&lt;br /&gt;
An album is to contain a collection of poems. And you may have a description on the top as a preface.&lt;br /&gt;
[[File:Check Poems.png|thumb|Check Poems]]&lt;br /&gt;
[[File:Select Album.png|center|frameless|Select Album]]&lt;br /&gt;
Album functionality is available if &amp;quot;Settings/Edit/Use Albums&amp;quot; is on.&lt;br /&gt;
[[File:Pick Album.png|center|frameless|Pick Album]]&lt;br /&gt;
Checked poems will be contained in the album.&lt;br /&gt;
&lt;br /&gt;
To quit, click this button highlighted:&lt;br /&gt;
[[File:Deselect album.png|center|frameless|Deselect album]]&lt;br /&gt;
&lt;br /&gt;
== Maintenance ==&lt;br /&gt;
From time to time, you may need to adjust some settings, backup, export data, or manage locally hosted pictures etc. Please check [[Maintenance]] for more details.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=220</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=220"/>
		<updated>2022-10-27T12:00:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
The default user name is &amp;quot;admin&amp;quot;, and the default password is &amp;quot;Pppppp*8&amp;quot;, and you should change the password after first login.&lt;br /&gt;
&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=219</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=219"/>
		<updated>2022-10-27T10:16:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;br /&gt;
Check [[Deployment]] for installation and execution.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=218</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=218"/>
		<updated>2022-10-27T10:15:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for IT administers, Web masters and computer literates who have basic skills of deploying a Website or unzip a file of a software application. The files needed are available in the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The backend and the fontend should be hosted in the same host. And the DB engine is with Sqlite.&lt;br /&gt;
&lt;br /&gt;
== Deploy to IIS ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime Hosting Bundle] for Windows IIS.&lt;br /&gt;
# A Website created with Application Pool of &amp;quot;No Managed Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
# Extract the Zip file to the Website root folder.&lt;br /&gt;
# Alter bin/appsettings.json with `UseHttps: true` to enforce HTTPS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* It may be beneficial to set a IIS rewrite rule in Web.config to further enforce HTTPS, while this is optional, since the app itself along with ASP.NET Core Runtime Hosting Bundle is capable of redirecting HTTP calls to HTTPS.&lt;br /&gt;
* Single Page Applications often have rewrite rules defined either in Web server (IIS or Apache) config for entering the app from any valid frontend routes. Web.config coming with the app supports such. However, when the app is running with Kestrel, web.config is not used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to purchase a SSL certificate, you may use &amp;quot;[https://letsencrypt.org/ Let&#039;s Encrypt]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Windows Desktop App==&lt;br /&gt;
The releases for desktop app are basically the same as the ones for Web App, however, the release is hosted in a local Web server Kestrel included in ASP.NET Core Runtime.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
#Either install the MSI file or extract the Zip file to a desired folder.&lt;br /&gt;
#In folder, double click &amp;quot;CreateShortcut.bat&amp;quot; which will create a shortcut on Windows desktop. This shortcut actually runs `StartPoetryApp.ps1` which will launch PoetryApp.exe and open the default Web browser browsing [http://localhost:5000 http://localhost:5300].&lt;br /&gt;
&lt;br /&gt;
You can copy or move the shortcut to any launch area of Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In case you have other apps running at port 5300, you need to change the following settings:&lt;br /&gt;
&lt;br /&gt;
# File `bin/appsettings.json`: Alter Kestrel/Endpoints/Http/Url to &amp;quot;[http://localhost:Port http://localhost:PortNotInUse]&amp;quot;, for example, &amp;quot;[http://localhost http://localhost:5310&amp;quot;]&lt;br /&gt;
#File `StartPoetryApp.ps1`: Alter respective URL of &amp;quot;start-process&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*The desktop app&#039;s backend is running on Kestrel which does not read web.config with some rewrite rules, and these rules are for entering the app from any valid frontend routes. However, because you almost always enter the frontend the first time through the startup URL, and the service worker of the frontend will then later on take care of the routing. So eventually you later can access the app from any valid frontend routes.&lt;br /&gt;
*Likewise, the static read only variant (Poetry Viewer) of the app also rely on the service worker for routing. Poetry Viewer is often hosted in a server without explicit backend and you may not have control of the server config for the rewrite rules.&lt;br /&gt;
&lt;br /&gt;
==MacOS Desktop App==&lt;br /&gt;
[[File:Local app on MacOS.png|thumb|local app on MacOS]]&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Prerequisites&#039;&#039;&#039;===&lt;br /&gt;
#[https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64. Optional. If you had installed the self contained release, you don&#039;t need to install&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Installation&#039;&#039;&#039;===&lt;br /&gt;
# Extract the Zip file to a desired folder, for example, &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;&lt;br /&gt;
#[https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 Apply &amp;quot;chmod 755&amp;quot; to files &amp;quot;StartPoetryApp.sh&amp;quot; and &amp;quot;bin/PoetryApp&amp;quot;] to make both become executable.&lt;br /&gt;
&lt;br /&gt;
===Execution===&lt;br /&gt;
&lt;br /&gt;
=====In Terminal=====&lt;br /&gt;
#Under &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;, execute &amp;quot;./StartPoetryApp.sh&amp;quot;. And this will launch PoetryApp as a local service hosting http://localhost:5300 and open browser Safari or Chrome, and go to http://localhost:5300&lt;br /&gt;
&lt;br /&gt;
=====In Finder=====&lt;br /&gt;
&lt;br /&gt;
#Double click &amp;quot;StartPoetryApp.sh&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Mac terminal.png|alt=mac terminal|thumb|mac terminal]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=217</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=217"/>
		<updated>2022-10-27T09:49:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Welcome to {{SITENAME}}! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to {{SITENAME}}! ==&lt;br /&gt;
Poetry Management and Publishing (Poetry MP) is a poetry app for a poet to manage poems and publish online. &lt;br /&gt;
&lt;br /&gt;
The full app can run on Microsoft Windows, MacOS and Linux as a desktop app, or run on a Windows based or Linux based Web server as a Web app.  And the frontend of the app may be hosted as a static Website to publish the poetry content. Thus, you as a poet can use the full app to manage your poetry on Windows/MacOS/Linux PC, and publish content in a static Website which is cheap or free to run. If you would install the full app in a Web server, the full app can support both management and publishing.&lt;br /&gt;
&lt;br /&gt;
The app is distributed as freeware.&lt;br /&gt;
&lt;br /&gt;
To have some impression of the app, please check:&lt;br /&gt;
&lt;br /&gt;
* [[Live Examples]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[User Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is presumed that you are a computer literate who understands basic concept of Website, upload, and Webmastering, though knowledge of Web programming is not required.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
How people have been publishing or sharing poems through electronic means if not involving traditional publishers? Here&#039;s the list of some scenarios:&lt;br /&gt;
&lt;br /&gt;
# Copy machine. After writing some poems on papers, the poet made copies and mail out.&lt;br /&gt;
# Fax.&lt;br /&gt;
# Email since the birth of the Internet.&lt;br /&gt;
# BBS.&lt;br /&gt;
# Gopher.&lt;br /&gt;
# Newsgroup.&lt;br /&gt;
# Static Web pages.&lt;br /&gt;
# Blog&lt;br /&gt;
# Web 2.0 applications such as social networking services and wiki.&lt;br /&gt;
# Poetry sites like: &amp;lt;nowiki&amp;gt;https://poets.org/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetryfoundation.org&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetrybyheart.org.uk/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://thepoetryhour.com/&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
# Poetry writing apps, like those listed at https://play.google.com/store/search?q=poetry+writing&amp;amp;c=apps &lt;br /&gt;
&lt;br /&gt;
=== Poetry Management and Publishing (PoetryMP) ===&lt;br /&gt;
The app is designed for the following users:&lt;br /&gt;
&lt;br /&gt;
# Poets who would write poems on computers and publish online. &lt;br /&gt;
# Poetry lovers who would publish poems authorized by the poets, or publish poems which copyright are expired or are in public domain.&lt;br /&gt;
&lt;br /&gt;
And the advanced features are designed for such scenarios:&lt;br /&gt;
&lt;br /&gt;
# The poet had written over 100 poems.&lt;br /&gt;
# Many of the poems contain allusions and quotations which need annotations so readers who may not be familiar with the allusions could understand. This app supports numbered annotations (superscript) and phase-based annotations which may be shared among poems.&lt;br /&gt;
# Full text search.&lt;br /&gt;
# Tagging for categorization.&lt;br /&gt;
# Insert images to a poem. The image could be embedded, locally hosted or external. And you may convert external images to locally hosted, so the full app or the static read only variant may work fully offline with images being hosted locally.&lt;br /&gt;
# The readers will read, browse and search poems on PC, tablets and smartphones.&lt;br /&gt;
# Allocate poems into albums.&lt;br /&gt;
# For Chinese poets and respective readers, the Chinese edition of the app provides simplified/traditional Chinese conversion.&lt;br /&gt;
&lt;br /&gt;
What&#039;s Not:&lt;br /&gt;
&lt;br /&gt;
* Specialized for writing poems with vocabulary dictionary.&lt;br /&gt;
* A forum&lt;br /&gt;
* A social networking app&lt;br /&gt;
&lt;br /&gt;
Some poetry apps and Websites have the following features, however PoetryMP does not.&lt;br /&gt;
&lt;br /&gt;
From certain point of view, PoetryMP is a personal poetry blog which can run as a desktop program or a Website. And you can publish your poetry through the full blow Website or a static Website.&lt;br /&gt;
&lt;br /&gt;
=== Distribution and Installation ===&lt;br /&gt;
PoetryMP is distributed in 2 forms: Zip and MSI at the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The app is build on ASP.NET Core and can run on Windows, MacOS and Linux with ASP.NET 6 runtime installed.&lt;br /&gt;
&lt;br /&gt;
And the static readonly variant of the app is a [https://en.wikipedia.org/wiki/Single-page_application SPA], which is using the same codes of the frontend of the full app.  For more details, please check:&lt;br /&gt;
&lt;br /&gt;
*[[Deployment]]&lt;br /&gt;
*[[Deployment for Poetry Viewer]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=216</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=216"/>
		<updated>2022-10-27T09:23:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWinSelfContained.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppWin.zip PoetryAppWin.zip] for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMacSelfContained.zip PoetryAppMacSelfContained.zip] for MacOS (51MB, 123MB installed)&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/PoetryAppMac.zip PoetryAppMac.zip] for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=215</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=215"/>
		<updated>2022-10-27T09:20:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
(Under construction: https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads)&lt;br /&gt;
&lt;br /&gt;
* [https://poetryappwiki.fonlow.org/w/downloads/CreateZips.zip PoetryAppWinSelfContained.zip] for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* PoetryAppWin.zip for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* PoetryAppMacSelfContained.zip for MacOS (51MB, 123MB installed)&lt;br /&gt;
* PoetryAppMac.zip for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=File:CreateZips.zip&amp;diff=214</id>
		<title>File:CreateZips.zip</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=File:CreateZips.zip&amp;diff=214"/>
		<updated>2022-10-27T09:07:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ok&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=213</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Download&amp;diff=213"/>
		<updated>2022-10-26T21:31:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distributed as freeware, PoetryApp does not contain any adware/spyware/backdoor, and does not listen to any public port except when being installed as a Web servcie on a Web server, or send out info through any port without your consent. Please check [[EULA]] before downloading and installation.&lt;br /&gt;
&lt;br /&gt;
(Under construction: https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads)&lt;br /&gt;
&lt;br /&gt;
* PoetryAppWinSelfContained.zip for Microsoft Windows (52MB, 124MB installed)&lt;br /&gt;
* PoetryAppWin.zip for Microsoft Windows (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows required)&lt;br /&gt;
* PoetryAppMacSelfContained.zip for MacOS (51MB, 123MB installed)&lt;br /&gt;
* PoetryAppMac.zip for MacOS (12MB, 36MB installed; [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=212</id>
		<title>Deployment</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Deployment&amp;diff=212"/>
		<updated>2022-10-26T21:27:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for IT administers, Web masters and computer literates who have basic skills of deploying a Website or unzip a file of a software application. The files needed are available in the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The backend and the fontend should be hosted in the same host. And the DB engine is with Sqlite.&lt;br /&gt;
&lt;br /&gt;
== Deploy to IIS ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime Hosting Bundle] for Windows IIS.&lt;br /&gt;
# A Website created with Application Pool of &amp;quot;No Managed Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
# Extract the Zip file to the Website root folder.&lt;br /&gt;
# Alter bin/appsettings.json with `UseHttps: true` to enforce HTTPS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* It may be beneficial to set a IIS rewrite rule in Web.config to further enforce HTTPS, while this is optional, since the app itself along with ASP.NET Core Runtime Hosting Bundle is capable of redirecting HTTP calls to HTTPS.&lt;br /&gt;
* Single Page Applications often have rewrite rules defined either in Web server (IIS or Apache) config for entering the app from any valid frontend routes. Web.config coming with the app supports such. However, when the app is running with Kestrel, web.config is not used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to purchase a SSL certificate, you may use &amp;quot;[https://letsencrypt.org/ Let&#039;s Encrypt]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Desktop App ==&lt;br /&gt;
The releases for desktop app are basically the same as the ones for Web App, however, the release is hosted in a local Web server Kestrel included in ASP.NET Core Runtime.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ====&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for Windows&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Installation&#039;&#039;&#039; ====&lt;br /&gt;
# Either install the MSI file or extract the Zip file to a desired folder.&lt;br /&gt;
# In folder, double click &amp;quot;CreateShortcut.bat&amp;quot; which will create a shortcut on Windows desktop. This shortcut actually runs `StartPoetryApp.ps1` which will launch PoetryApp.exe and open the default Web browser browsing [http://localhost:5000 http://localhost:5300].&lt;br /&gt;
&lt;br /&gt;
You can copy or move the shortcut to any launch area of Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In case you have other apps running at port 5300, you need to change the following settings:&lt;br /&gt;
&lt;br /&gt;
# File `bin/appsettings.json`: Alter Kestrel/Endpoints/Http/Url to &amp;quot;[http://localhost:Port http://localhost:PortNotInUse]&amp;quot;, for example, &amp;quot;[http://localhost http://localhost:5310&amp;quot;]&lt;br /&gt;
# File `StartPoetryApp.ps1`: Alter respective URL of &amp;quot;start-process&amp;quot;.&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The desktop app&#039;s backend is running on Kestrel which does not read web.config with some rewrite rules, and these rules are for entering the app from any valid frontend routes. However, because you almost always enter the frontend the first time through the startup URL, and the service worker of the frontend will then later on take care of the routing. So eventually you later can access the app from any valid frontend routes.&lt;br /&gt;
* Likewise, the static read only variant (Poetry Viewer) of the app also rely on the service worker for routing. Poetry Viewer is often hosted in a server without explicit backend and you may not have control of the server config for the rewrite rules.&lt;br /&gt;
&lt;br /&gt;
=== MacOS ===&lt;br /&gt;
[[File:Local app on MacOS.png|thumb|local app on MacOS]]&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Prerequisites&#039;&#039;&#039; ====&lt;br /&gt;
# [https://dotnet.microsoft.com/en-us/download/dotnet/6.0 ASP.NET Core Runtime] for macOS Binaries Arm64 or x64. Optional. If you had installed the self contained release, you don&#039;t need to install&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;Installation&#039;&#039;&#039; ====&lt;br /&gt;
# Extract the Zip file to a desired folder, for example, &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;&lt;br /&gt;
# [https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 Apply &amp;quot;chmod 755&amp;quot; to files &amp;quot;StartPoetryApp.sh&amp;quot; and &amp;quot;bin/PoetryApp&amp;quot;] to make both become executable.&lt;br /&gt;
&lt;br /&gt;
==== Execution ====&lt;br /&gt;
&lt;br /&gt;
===== Terminal =====&lt;br /&gt;
# Under &amp;quot;/Users/YourUsername/Documents/PoetryApp&amp;quot;, execute &amp;quot;./StartPoetryApp.sh&amp;quot;. And this will launch PoetryApp as a local service hosting http://localhost:5300 and open browser Safari or Chrome, and go to http://localhost:5300&lt;br /&gt;
&lt;br /&gt;
===== Finder =====&lt;br /&gt;
&lt;br /&gt;
# Double click &amp;quot;StartPoetryApp.sh&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hints:&#039;&#039;&#039;[[File:Mac terminal.png|alt=mac terminal|thumb|mac terminal]]You may want to edit [https://support.apple.com/en-au/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/2.12/mac/11.0 the shell script] to execute &amp;quot;PoetryApp&amp;quot; which comes with the following content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: blue&amp;quot;&amp;gt;&lt;br /&gt;
realpath(){&lt;br /&gt;
    [[ $1 = /* ]] &amp;amp;&amp;amp; echo &amp;quot;$1&amp;quot; || &amp;quot;$PWD/${1#./}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
shPath=$(realpath &amp;quot;$0&amp;quot;)&lt;br /&gt;
shDir=$(dirname &amp;quot;shPath&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
osascript - &amp;quot;shDir&amp;quot; &amp;lt;&amp;lt;EOF&lt;br /&gt;
  on run argv&lt;br /&gt;
     tell application &amp;quot;Terminal&amp;quot;&lt;br /&gt;
       do script (&amp;quot;cd shDir &amp;amp;&amp;amp; bin/PoetryApp&amp;quot;)&lt;br /&gt;
end tell&lt;br /&gt;
end run&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
echo lauching PoetryApp service &amp;amp; sleep 2&lt;br /&gt;
open http://localhost:5300&lt;br /&gt;
echo PoetryApp service and Web browser launched&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The shell script launch &amp;quot;PoetryApp&amp;quot; in a Terminal window. However, after closing the window, the app is still running at the background.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Development&amp;diff=211</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Development&amp;diff=211"/>
		<updated>2022-10-26T21:25:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexts ==&lt;br /&gt;
The design of the app had considered the following factors:&lt;br /&gt;
&lt;br /&gt;
# The app is primarily for one poet only, while a poet could write at almost a few hundreds to thousands poems in a life time, and each poem could be short comparing to a general article.&lt;br /&gt;
# The whole content could be exported into a portable format, such as JSON, thus the works of a poet may not be restrained by an app and the established content is future proof. The JSON data could be rendered into HTML, and used for importing if the database of the app is to be upgraded.&lt;br /&gt;
&lt;br /&gt;
== Development Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Backend ===&lt;br /&gt;
Visual Studio, C# .NET, Entity Framework, MySql or Sqlite&lt;br /&gt;
&lt;br /&gt;
=== Frontend ===&lt;br /&gt;
TypeScript, Angular, Angular Material&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Architectural Features ===&lt;br /&gt;
The app will load data to the Web browser as much as possible, such as tags, annotations and poem names, and actively maintain the lists in the frontend without reloading from the backend.&lt;br /&gt;
&lt;br /&gt;
The static read only variant of the app loads the entire collection of a poet into memory.&lt;br /&gt;
&lt;br /&gt;
The app provides some extra features for Chinese, since there exist two writing systems: Simplified and Traditional. A poet should pick either of the two writing systems, and the app may provide instant translation in the reader view. For the static read only variant of the app, each writing system is supported by an exported JSON file. That is, one JSON file for each writing system.&lt;br /&gt;
&lt;br /&gt;
=== Frontend ===&lt;br /&gt;
&lt;br /&gt;
* Material Design&lt;br /&gt;
* Buttons are generally presented in 3D.&lt;br /&gt;
* Editor mode on desktop PC and tablet, and reader mode on all devices.&lt;br /&gt;
During development, the frontend and the backend are often running on different hosts. Almost all features of the app could run well in such config, except the locally hosted pictures. The locally hosted pictures are using relative patch in &amp;lt;code&amp;gt;img src&amp;lt;/code&amp;gt;, and such constraint is good for static readonly deployment.&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
&lt;br /&gt;
=== Frontend ===&lt;br /&gt;
After running âbuildProd.batâ, then copy the files to local Website poems.localhost for testing and packaging. &lt;br /&gt;
&lt;br /&gt;
=== Backend ===&lt;br /&gt;
Run &amp;quot;DotNetPublishToLocal.bat&amp;quot; to build and publish to locally hosted &amp;quot;poems.localhost&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The build includes data for Chinese data of 2 writing systems. And to make a general release, just exclude folders &amp;quot;Dictionary&amp;quot; and &amp;quot;JiebaReource&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Builds for Linux, MacOS, iOS and Android (Under Construction)&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
The releases are available at [[Download]] in the following form:&lt;br /&gt;
&lt;br /&gt;
* Zip&lt;br /&gt;
* MSI&lt;br /&gt;
* Android app (Under development)&lt;br /&gt;
* iOS app (Under development)&lt;br /&gt;
&lt;br /&gt;
=== Zip ===&lt;br /&gt;
Zip all files in poems.localhost to a file like PoetryApp1.zip&lt;br /&gt;
&lt;br /&gt;
=== MSI ===&lt;br /&gt;
PoetryAppSetup.vdproj is a basic MSI project. Since the JavaScript files will mostly have the names changed for versioning, most files of the NG build need to be redefined in the project file.&lt;br /&gt;
&lt;br /&gt;
Android&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=210</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://poetryappwiki.fonlow.org/w/index.php?title=Main_Page&amp;diff=210"/>
		<updated>2022-10-26T10:31:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Distribution and Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to {{SITENAME}}! ==&lt;br /&gt;
Poetry Management and Publishing (Poetry MP) is a poetry app for a poet to manage poems and publishing online. &lt;br /&gt;
&lt;br /&gt;
The full app can run on  Microsoft Windows, MacOS and Linux as a desktop app, or run on a Windows based or Linux based Web server as a Web app.  And the frontend of the app may be hosted as a static Website to publish the poetry content. Thus, you as a poet can use the full app to manage your poetry on Windows/MacOS/Linux PC, and publish content in a static Website which is cheap or free to run. If you can install the full app in a Web server, the full app can support both management and publishing.&lt;br /&gt;
&lt;br /&gt;
The app is distributed as freeware.&lt;br /&gt;
&lt;br /&gt;
To have some impression of the app, please check:&lt;br /&gt;
&lt;br /&gt;
* [[Live Examples]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[User Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is presumed that you are a computer literate who understand basic concept of Website, upload, and Webmastering, though knowledge of Web programming is not required.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
How people have been publishing or sharing poems through electronic means if not involving traditional publishers? Here&#039;s the list of some scenarios:&lt;br /&gt;
&lt;br /&gt;
# Copy machine. After writing some poems on papers, the poet made copies and mail out.&lt;br /&gt;
# Fax.&lt;br /&gt;
# Email since the birth of the Internet.&lt;br /&gt;
# BBS.&lt;br /&gt;
# Gopher.&lt;br /&gt;
# Newsgroup.&lt;br /&gt;
# Static Web pages.&lt;br /&gt;
# Blog&lt;br /&gt;
# Web 2.0 applications such as social networking services and wiki.&lt;br /&gt;
# Poetry sites like: &amp;lt;nowiki&amp;gt;https://poets.org/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetryfoundation.org&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://www.poetrybyheart.org.uk/&amp;lt;/nowiki&amp;gt; ; &amp;lt;nowiki&amp;gt;https://thepoetryhour.com/&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
# Poetry writing apps, like those listed at https://play.google.com/store/search?q=poetry+writing&amp;amp;c=apps &lt;br /&gt;
&lt;br /&gt;
=== Poetry Management and Publishing (PoetryMP) ===&lt;br /&gt;
The app is designed for the following users:&lt;br /&gt;
&lt;br /&gt;
# Poets who would write poems on computers and publish online. &lt;br /&gt;
# Poetry lovers who would publish poems authorized by the poets, or publish poems which copyright are expired or are in public domain.&lt;br /&gt;
&lt;br /&gt;
And the advanced features are designed for such scenarios:&lt;br /&gt;
&lt;br /&gt;
# The poet had written over 100 poems.&lt;br /&gt;
# Many of the poems contain allusions and quotations which need annotations so readers who may not be familiar with the allusions could understand. This app supports numbered annotations (superscript) and phase-based annotations which may be shared among poems.&lt;br /&gt;
# Full text search.&lt;br /&gt;
# Tagging for categorization.&lt;br /&gt;
# Insert images to a poem. The image could be embedded, locally hosted or external. And you may convert external images to locally hosted, so the full app or the static read only variant may work fully offline with images being hosted locally.&lt;br /&gt;
# The readers will read, browse and search poems on PC, tablets and smartphones.&lt;br /&gt;
# Allocate poems into albums.&lt;br /&gt;
# For Chinese poets and respective readers, the Chinese edition of the app provides simplified/traditional Chinese conversion.&lt;br /&gt;
&lt;br /&gt;
What&#039;s Not:&lt;br /&gt;
&lt;br /&gt;
* Specialized for writing poems with vocabulary dictionary.&lt;br /&gt;
* A forum&lt;br /&gt;
* A social networking app&lt;br /&gt;
&lt;br /&gt;
Some poetry apps and Websites have the following features, however PoetryMP does not.&lt;br /&gt;
&lt;br /&gt;
From certain point of view, PoetryMP is a personal poetry blog which can run as a desktop program or a Website. And you can publish your poetry through the full blow Website or a static Website.&lt;br /&gt;
&lt;br /&gt;
=== Distribution and Installation ===&lt;br /&gt;
PoetryMP is distributed in 2 forms: Zip and MSI at the &#039;&#039;&#039;[[Download]]&#039;&#039;&#039; area.&lt;br /&gt;
&lt;br /&gt;
The app is build on ASP.NET Core and can run on Windows, MacOS and Linux with ASP.NET 6 runtime installed.&lt;br /&gt;
&lt;br /&gt;
And the static readonly variant of the app is a [https://en.wikipedia.org/wiki/Single-page_application SPA], which is using the same codes of the frontend of the full app.  For more details, please check:&lt;br /&gt;
&lt;br /&gt;
*[[Deployment]]&lt;br /&gt;
*[[Deployment for Poetry Viewer]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>