Adding PDF generation

This commit is contained in:
Ed Ward 2019-07-30 16:14:34 +02:00
parent ccd3a8420b
commit 74d200e341
16 changed files with 142 additions and 732 deletions

157
build.py
View File

@ -9,9 +9,6 @@
# Remnants (could go into the master document as the first header)
#bootstrap_path: /bootstrap-3.3.7
#page_title: The Ardour Manual
import os
import re
import shutil
@ -19,11 +16,19 @@ import argparse
# Global vars
global_bootstrap_path = '/bootstrap-3.3.7'
global_page_title = 'The Ardour Manual'
global_site_dir = './website/'
global_githuburl = 'https://github.com/Ardour/manual/edit/master/include/'
global_screen_template = 'page-template.html'
global_onepage_template = 'onepage-template.html'
global_pdf_template = 'pdf-template.html'
global_master_doc = 'master-doc.txt'
# This matches all *non* letter/number, ' ', '.', '-', and '_' chars
cleanString = re.compile(r'[^a-zA-Z0-9 \._-]+')
# This matches new 'unbreakable' links, up to the closing quote or anchor
findLinks = re.compile(r'"@@[^#"]*[#"]')
githuburl = 'https://github.com/Ardour/manual/edit/master/include/'
#
# Create an all lowercase filename without special characters and with spaces
@ -70,19 +75,12 @@ def ParseHeader(fileObj):
#
def PartToLevel(s):
level = -1
lvl = {'part': 0, 'chapter': 1, 'subchapter': 2}
if s in lvl:
return lvl[s]
else:
return -1
if s == 'part':
level = 0
elif s == 'chapter':
level = 1
elif s == 'subchapter':
level = 2
elif s == 'section':
level = 3
elif s == 'subsection':
level = 4
return level
#
# Converts a integer to a roman number
@ -107,7 +105,7 @@ def GetFileStructure():
fnames = [None]*6
content = ''
grab = False
mf = open('master-doc.txt')
mf = open(global_master_doc)
for ln in mf:
if ln.startswith('---'):
@ -202,12 +200,19 @@ def GetParent(fs, pos):
return pos
#
# Change the hierarchy of titles : h1->hn, h2->hn+1, etc... n being delta-1
#
def reheader(txt, delta):
for i in range(6, 0, -1):
txt = txt.replace('<h' + str(i),'<h' + str(i+delta))
txt = txt.replace('</h' + str(i),'</h' + str(i+delta))
return txt
#
# Creates the BreadCrumbs
#
def GetBreadCrumbs(fs, pos):
# The <span class="divider">&gt;</span> is for Bootstrap pre-3.0
breadcrumbs = '<li class="active">'+ fs[pos]['title'] + '</li>'
while pos >= 0:
@ -342,26 +347,15 @@ def BuildList(lst, fs, pagePos, cList):
#
def BuildOnePageSidebar(fs):
content = '\n\n<ul style="white-space:nowrap;">\n'
content = '\n\n<ul class="toc" style="white-space:nowrap;">\n'
lvl = 0
levelNums = [0]*6
levelNums = [0]*3
for i in range(len(fs)):
# Handle Part/Chapter/subchapter/section/subsection numbering
level = fs[i]['level']
if level == 0:
if level < 2:
levelNums[2] = 0
levelNums[3] = 0
levelNums[4] = 0
elif level == 1:
levelNums[2] = 0
levelNums[3] = 0
levelNums[4] = 0
elif level == 2:
levelNums[3] = 0
levelNums[4] = 0
elif level == 3:
levelNums[4] = 0
levelNums[level] = levelNums[level] + 1;
j = level
txtlevel = ''
@ -420,44 +414,49 @@ if quiet:
level = 0
fileCount = 0
levelNums = [0]*6
levelNums = [0]*3
lastFile = ''
page = ''
onepage = ''
pdfpage = ''
toc = ''
pageNumber = 0
siteDir = './website/'
if not quiet and devmode:
print('Devmode active: scribbling extra junk to the manual...')
if os.access(siteDir, os.F_OK):
if os.access(global_site_dir, os.F_OK):
if not quiet:
print('Removing stale HTML data...')
shutil.rmtree(siteDir)
shutil.rmtree(global_site_dir)
shutil.copytree('./source', siteDir)
shutil.copytree('./source', global_site_dir)
# Read the template, and fix the stuff that's fixed for all pages
temp = open('page-template.txt')
temp = open(global_screen_template)
template = temp.read()
temp.close()
template = template.replace('{{page.bootstrap_path}}', '/bootstrap-3.3.7')
template = template.replace('{{page.page_title}}', 'The Ardour Manual')
template = template.replace('{{page.bootstrap_path}}', global_bootstrap_path)
template = template.replace('{{page.page_title}}', global_page_title)
# Same as above, but for the One-page version
temp = open('onepage-template.txt')
temp = open(global_onepage_template)
onepage = temp.read()
temp.close()
onepage = onepage.replace('{{page.bootstrap_path}}', global_bootstrap_path)
onepage = onepage.replace('{{page.page_title}}', global_page_title)
onepage = onepage.replace('{{page.bootstrap_path}}', '/bootstrap-3.3.7')
onepage = onepage.replace('{{page.page_title}}', 'The Ardour Manual')
# Same as above, but for the PDF version
temp = open(global_pdf_template)
pdfpage = temp.read()
temp.close()
pdfpage = pdfpage.replace('{{page.page_title}}', global_page_title)
# Parse out the master docuemnt's structure into a dictionary list
# Parse out the master document's structure into a dictionary list
fileStruct = GetFileStructure()
# Build a quasi-tree structure listing children at level + 1 for each node
@ -472,7 +471,7 @@ if not quiet:
print('.') if len(links) == 1 else print('s.')
if not quiet:
master = open('master-doc.txt')
master = open(global_master_doc)
firstLine = master.readline().rstrip('\r\n')
master.close()
@ -493,21 +492,9 @@ for header in fileStruct:
lastLevel = level
level = header['level']
# Handle Part/Chapter/subchapter/section/subsection numbering
if level == 0:
# Handle Part/Chapter/subchapter numbering
if level < 2:
levelNums[2] = 0
levelNums[3] = 0
levelNums[4] = 0
elif level == 1:
levelNums[2] = 0
levelNums[3] = 0
levelNums[4] = 0
elif level == 2:
levelNums[3] = 0
levelNums[4] = 0
elif level == 3:
levelNums[4] = 0
levelNums[level] = levelNums[level] + 1;
# This is totally unnecessary, but nice; besides which, you can capture
@ -525,7 +512,6 @@ for header in fileStruct:
# Handle TOC scriblings and one-page titles...
opl = ''
if 'link' in header:
opl = ' id="' + header['link'] + '"'
else:
@ -536,19 +522,10 @@ for header in fileStruct:
oph = '<h1 class="clear"' + opl +'>Part ' + num2roman(levelNums[level]) + ' - ' + header['title'] + '</h1>\n';
elif level == 1:
toc = toc + '\t<p class="chapter">Ch. ' + str(levelNums[level]) + ':&nbsp;&nbsp;<a href="/' + header['filename'] + '/">' + header['title'] + '</a></p>\n'
oph = '<h1 class="clear"' + opl +'>' + str(levelNums[level]) + ' - ' + header['title'] + '</h1>\n';
oph = '<h2 class="clear"' + opl +'>' + str(levelNums[level]) + ' - ' + header['title'] + '</h3>\n';
elif level == 2:
toc = toc + '\t\t<p class="subchapter"><a href="/' + header['filename'] + '/">' + header['title'] + '</a></p>\n'
oph = '<h1 class="clear"' + opl +'>' + str(levelNums[level-1]) + '.' + str(levelNums[level]) + ' - ' + header['title'] + '</h1>\n';
elif level == 3:
toc = toc + '\t\t\t<p class="section"><a href="/' + header['filename'] + '/">' + header['title'] + '</a></p>\n'
oph = '<h1 class="clear"' + opl +'>' + str(levelNums[level-2]) + '.' + str(levelNums[level-1]) + '.' + str(levelNums[level]) + ' - ' + header['title'] + '</h1>\n';
elif level == 4:
toc = toc + '\t\t\t\t<p class="subsection"><a href="/' + header['filename'] + '/">' + header['title'] + '</a></p>\n'
oph = '<h1 class="clear"' + opl +'>' + str(levelNums[level-3]) + '.' + str(levelNums[level-2]) + '.' + str(levelNums[level-1]) + '.' + str(levelNums[level]) + ' - ' + header['title'] + '</h1>\n';
oph = '<h3 class="clear"' + opl +'>' + str(levelNums[level-1]) + '.' + str(levelNums[level]) + ' - ' + header['title'] + '</h3>\n';
# Make the 'this thing contains...' stuff
if HaveChildren(fileStruct, pageNumber):
@ -593,7 +570,7 @@ for header in fileStruct:
if level > 0:
if 'include' in header:
srcFile = open('include/' + header['include'])
githubedit = '<span style="float:right;"><a title="Edit in GitHub" href="' + githuburl + header['include'] + '"><img src="/images/github.png" alt="Edit on GitHub"/></a></span>'
githubedit = '<span style="float:right;"><a title="Edit in GitHub" href="' + global_githuburl + header['include'] + '"><img src="/images/github.png" alt="Edit in GitHub"/></a></span>'
content = srcFile.read()
srcFile.close()
@ -620,17 +597,15 @@ for header in fileStruct:
devnote = devnote + 'link: ' + header['link'] + '<br>'
content = devnote + '</aside>' + content
# ----- One page version -----
# ----- One page and PDF version -----
# Fix up any internal links
opcontent = FixInternalLinks(oplinks, content, header['title'])
# Create the link sidebar
opsidebar = BuildOnePageSidebar(fileStruct)
opcontent = reheader(opcontent, 2)
# Set up the actual page from the template
onepage = onepage.replace('{% tree %}', opsidebar)
onepage = onepage.replace('{{ content }}', oph + '\n' + opcontent + '{{ content }}')
onepage = onepage.replace('{{ content }}', oph + '\n' + opcontent + '\n{{ content }}')
pdfpage = pdfpage.replace('{{ content }}', oph + '\n' + opcontent + '\n{{ content }}')
# ----- Normal version -----
@ -654,10 +629,10 @@ for header in fileStruct:
# Create the directory for the index.html file to go into (we use makedirs,
# because we have to in order to accomodate the 'uri' keyword)
os.makedirs(siteDir + header['filename'], 0o775, exist_ok=True)
os.makedirs(global_site_dir + header['filename'], 0o775, exist_ok=True)
# Finally, write the file!
destFile = open(siteDir + header['filename'] + '/index.html', 'w')
destFile = open(global_site_dir + header['filename'] + '/index.html', 'w')
destFile.write(page)
destFile.close()
@ -676,17 +651,31 @@ page = page.replace('{% prevnext %}', '')
page = page.replace('{% githubedit %}', '')
page = page.replace('{% breadcrumbs %}', '')
os.mkdir(siteDir + 'toc', 0o775)
tocFile = open(siteDir + 'toc/index.html', 'w')
os.mkdir(global_site_dir + 'toc', 0o775)
tocFile = open(global_site_dir + 'toc/index.html', 'w')
tocFile.write(page)
tocFile.close()
# Create the one-page version of the documentation
onepageFile = open(siteDir + 'ardourmanual.html', 'w')
onepageFile = open(global_site_dir + 'ardourmanual.html', 'w')
opsidebar = BuildOnePageSidebar(fileStruct) # create the link sidebar
onepage = onepage.replace('{% tree %}', opsidebar)
onepage = onepage.replace('{{ content }}', '') # cleans up the last spaceholder
onepageFile.write(onepage)
onepageFile.close()
if not quiet:
print('Generating the PDF...')
# Create the PDF version of the documentation
pdfpageFile = open(global_site_dir + 'pdf.html', 'w')
pdfpage = pdfpage.replace('{% tree %}', opsidebar) # create the TOC
pdfpage = pdfpage.replace('{{ content }}', '') # cleans up the last spaceholder
pdfpageFile.write(pdfpage)
pdfpageFile.close()
from weasyprint import HTML
doc = HTML(filename = global_site_dir + 'pdf.html') #, base_url = os.path.dirname(os.path.realpath(__file__)))
doc.write_pdf(global_site_dir + 'manual.pdf')
if not quiet:
print('Processed ' + str(fileCount) + ' files.')

View File

@ -33,27 +33,27 @@
The control buttons are:
</p>
<table class="dl">
<tr><th id="record"><kbd style="color:red;">&#9679;</kbd> (Record)</th>
<tr><th id="audiotrack-record"><kbd style="color:red;">&#9679;</kbd> (Record)</th>
<td>The button with the pink circle arms the track
for recording. When armed, the entire button will turn pink, and change to
bright red as soon as the transport is rolling and the track is recording.
<kbd class="mouse">Right</kbd> clicking will allow to en/disable Rec-safe,
protecting the track against accidental recording.</td></tr>
<tr><th id="mute"><kbd>M</kbd> (Mute)</th>
<tr><th id="audiotrack-mute"><kbd>M</kbd> (Mute)</th>
<td>Mutes the track. <kbd class="mouse">Right</kbd> clicking displays
a menu which dictates what particular parts of the track should be muted.</td></tr>
<tr><th id="solo"><kbd>S</kbd> (Solo)</th>
<tr><th id="audiotrack-solo"><kbd>S</kbd> (Solo)</th>
<td>Soloes the track. The behaviour of the solo system
is described in detail in the section <a href="@@muting-and-soloing">Muting and Soloing</a>.
<kbd class="mouse">Right</kbd> clicking will allow to en/disable Solo isolate
and Solo safe.</td></tr>
<tr><th id="playlist"><kbd>P</kbd> (Playlist)</th>
<tr><th id="audiotrack-playlist"><kbd>P</kbd> (Playlist)</th>
<td>Opens a playlist menu when clicked. The menu
offers various operations related to the track's <a href="@@playlists">playlist</a>.</td></tr>
<tr><th id="automation"><kbd>A</kbd> (Automation)</th>
<tr><th id="audiotrack-automation"><kbd>A</kbd> (Automation)</th>
<td>Opens the automation menu for the
track. For details see <a href="@@automation">Automation</a>.</td></tr>
<tr><th id="group"><kbd>G</kbd> (Group)</th>
<tr><th id="audiotrack-group"><kbd>G</kbd> (Group)</th>
<td>Allows to assign the track to an existing or a
new group. For details see <a href="@@track-and-bus-groups">Track and bus groups</a>.</td></tr>
</table>

View File

@ -13,7 +13,7 @@
<ul>
<li>There is no color affected to the master strip</li>
<li>The master strip cannot be hidden, so there is not <kbd class="menu">X</kbd> in the top right</li>
<li>It is by definition always solo, so no <kbd class="menu">Solo</kbd>, <kbd class="menu">Iso</kbd> or <kbd class="menu">Lock</kbd> buttons. It is replaced by a button to show the Monitoring section if <a href="@@session-properties#monitoring">the session has one</a></li>
<li>It is by definition always solo, so no <kbd class="menu">Solo</kbd>, <kbd class="menu">Iso</kbd> or <kbd class="menu">Lock</kbd> buttons. It is replaced by a button to show the Monitoring section if <a href="@@session-properties#properties-monitoring">the session has one</a></li>
<li>It cannot belong to a mix group, so the button is removed.</li>
</ul>

View File

@ -9,7 +9,7 @@
<p>
The <dfn>Monitor section</dfn> is an optional feature that provides Control Room/Monitor Speaker outputs.
It can be activated for the current session in the
<a href="@@session-properties#monitoring">
<a href="@@session-properties#properties-monitoring">
<kbd class="menu">Session &gt; Properties</kbd> window</a> by enabling the
<kbd class="option">Use monitor section in this session</kbd> option in the
<kbd class="menu">Monitoring</kbd> tab. By default the Monitor Section is fed with audio from the Master Bus,

View File

@ -17,24 +17,24 @@
</p>
<ul>
<li><a href="#general">General</a></li>
<li><a href="#editor">Editor</a></li>
<li><a href="#mixer">Mixer</a></li>
<li><a href="#signal_flow">Signal Flow</a></li>
<li><a href="#audio">Audio</a></li>
<li><a href="#midi">MIDI</a></li>
<li><a href="#metronome">Metronome</a></li>
<li><a href="#metering">Metering</a></li>
<li><a href="#transport">Transport</a></li>
<li><a href="#sync">Sync</a></li>
<li><a href="#control_surfaces">Control Surfaces</a></li>
<li><a href="#midi_ports">MIDI Ports</a></li>
<li><a href="#plugins">Plugins</a></li>
<li><a href="#appearance">Appearance</a></li>
<li><a href="#video">Video</a></li>
<li><a href="#preferences-general">General</a></li>
<li><a href="#preferences-editor">Editor</a></li>
<li><a href="#preferences-mixer">Mixer</a></li>
<li><a href="#preferences-signal_flow">Signal Flow</a></li>
<li><a href="#preferences-audio">Audio</a></li>
<li><a href="#preferences-midi">MIDI</a></li>
<li><a href="#preferences-metronome">Metronome</a></li>
<li><a href="#preferences-metering">Metering</a></li>
<li><a href="#preferences-transport">Transport</a></li>
<li><a href="#preferences-sync">Sync</a></li>
<li><a href="#preferences-control_surfaces">Control Surfaces</a></li>
<li><a href="#preferences-midi_ports">MIDI Ports</a></li>
<li><a href="#preferences-plugins">Plugins</a></li>
<li><a href="#preferences-appearance">Appearance</a></li>
<li><a href="#preferences-video">Video</a></li>
</ul>
<h2 id="general">General</h2>
<h2 id="preferences-general">General</h2>
<ul>
<li>
@ -184,7 +184,7 @@
</li>
</ul>
<h2 id="editor">Editor</h2>
<h2 id="preferences-editor">Editor</h2>
<ul>
<li>
@ -304,7 +304,7 @@
provides a way to revert any user made change to its default value.
</p>
<h2 id="mixer">Mixer</h2>
<h2 id="preferences-mixer">Mixer</h2>
<ul>
<li>
@ -397,7 +397,7 @@
</ul>
<h2 id="signal_flow">Signal Flow</h2>
<h2 id="preferences-signal_flow">Signal Flow</h2>
<ul>
<li>
@ -447,7 +447,7 @@
</li>
</ul>
<h2 id="audio">Audio</h2>
<h2 id="preferences-audio">Audio</h2>
<ul>
<li>
@ -510,7 +510,7 @@
</li>
</ul>
<h2 id="midi">MIDI</h2>
<h2 id="preferences-midi">MIDI</h2>
<ul>
<li>
@ -555,7 +555,7 @@
</li>
</ul>
<h2 id="metronome">Metronome</h2>
<h2 id="preferences-metronome">Metronome</h2>
<ul>
<li>
@ -599,7 +599,7 @@
</li>
</ul>
<h2 id="metering">Metering</h2>
<h2 id="preferences-metering">Metering</h2>
<ul>
<li>
@ -675,7 +675,7 @@
</li>
</ul>
<h2 id="transport">Transport</h2>
<h2 id="preferences-transport">Transport</h2>
<ul>
<li>
@ -746,7 +746,7 @@
</li>
</ul>
<h2 id="sync">Sync</h2>
<h2 id="preferences-sync">Sync</h2>
<ul>
<li>
@ -886,7 +886,7 @@
</li>
</ul>
<h2 id="control_surfaces">Control Surfaces</h2>
<h2 id="preferences-control_surfaces">Control Surfaces</h2>
<p>
This tab contains settings for <a href="@@control-surfaces">control surfaces</a>.
@ -899,7 +899,7 @@
protocol settings</kbd> (only for Generic MIDI and Open Sound Control).
</p>
<h2 id="midi_ports">MIDI Ports</h2>
<h2 id="preferences-midi_ports">MIDI Ports</h2>
<ul>
<li>
@ -952,7 +952,7 @@
</li>
</ul>
<h2 id="plugins">Plugins</h2>
<h2 id="preferences-plugins">Plugins</h2>
<p class="note">
The content of this preference page varies heavily between versions or Ardour:
@ -1131,7 +1131,7 @@
</li>
</ul>
<h2 id="appearance">Appearance</h2>
<h2 id="preferences-appearance">Appearance</h2>
<ul>
<li>
@ -1464,7 +1464,7 @@
</li>
</ul>
<h2 id="video">Video</h2>
<h2 id="preferences-video">Video</h2>
<ul>
<li>

View File

@ -37,7 +37,7 @@
<th><kbd class="menu">Audition</kbd></th>
<td>This button allows to listen to the region and only the region, dry (with
no effects, regardless of the processors applied to the track). For MIDI,
the default MIDI synth, set in the <a href="@@preferences#midi">Preferences</a>,
the default MIDI synth, set in the <a href="@@preferences#preferences-midi">Preferences</a>,
is used to audition the region.</td>
<td></td>
</tr>

View File

@ -18,21 +18,21 @@
</p>
<ul>
<li><a href="#timecode">Timecode</a></li>
<li><a href="#sync">Sync</a></li>
<li><a href="#fade">Fades</a></li>
<li><a href="#media">Media</a></li>
<li><a href="#locations">Locations</a></li>
<li><a href="#filenames">Filenames</a></li>
<li><a href="#monitoring">Monitoring</a></li>
<li><a href="#meterbridge">Meterbridge</a></li>
<li><a href="#misc">Misc</a></li>
<li><a href="#properties-timecode">Timecode</a></li>
<li><a href="#properties-sync">Sync</a></li>
<li><a href="#properties-fade">Fades</a></li>
<li><a href="#properties-media">Media</a></li>
<li><a href="#properties-locations">Locations</a></li>
<li><a href="#properties-filenames">Filenames</a></li>
<li><a href="#properties-monitoring">Monitoring</a></li>
<li><a href="#properties-meterbridge">Meterbridge</a></li>
<li><a href="#properties-misc">Misc</a></li>
</ul>
<h2 id="timecode">Timecode</h2>
<h2 id="properties-timecode">Timecode</h2>
<ul>
<li>
@ -78,7 +78,7 @@
</li>
</ul>
<h2 id="sync">Sync</h2>
<h2 id="properties-sync">Sync</h2>
<ul>
<li>
@ -87,12 +87,12 @@
<li>
<dfn>Use Video File's FPS Instead of Timecode Value for Timeline and Video
Monitor</dfn> when checked, uses the timecode FPS value of the standard
used by the video file instead of forcing the FPS set in the <a href="#timecode">
used by the video file instead of forcing the FPS set in the <a href="#properties-timecode">
Timecode tab</a>.
</li>
<li>
<dfn>Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using
JACK-sync)</dfn> allows to apply the pull-up/down as set in the <a href="#timecode">
JACK-sync)</dfn> allows to apply the pull-up/down as set in the <a href="#properties-timecode">
Timecode tab</a> to the <a href="@@video-timeline-and-monitoring">video
timeline</a> as displayed in the editor and to the Video Monitor, resulting
in a shorter/longer video in the editor and a speed-up/down in the Video
@ -102,7 +102,7 @@
</li>
</ul>
<h2 id="fade">Fades</h2>
<h2 id="properties-fade">Fades</h2>
<ul>
<li>
@ -140,7 +140,7 @@
</li>
</ul>
<h2 id="media">Media</h2>
<h2 id="properties-media">Media</h2>
<p>
Change how sound is stored on disk. These options do not change how sound is handled
@ -169,7 +169,7 @@
</li>
</ul>
<h2 id="locations">Locations</h2>
<h2 id="properties-locations">Locations</h2>
<p>
These options add file locations that will be searched to find the audio and
@ -197,7 +197,7 @@
</li>
</ul>
<h2 id="filenames">Filenames</h2>
<h2 id="properties-filenames">Filenames</h2>
<p>
This tab is used to change how Ardour names recorded regions.
@ -231,7 +231,7 @@
</ul>
<h2 id="monitoring">Monitoring</h2>
<h2 id="properties-monitoring">Monitoring</h2>
<p>
Provides options affecting monitoring.
@ -257,7 +257,7 @@
</ul>
<h2 id="meterbridge">Meterbridge</h2>
<h2 id="properties-meterbridge">Meterbridge</h2>
<p>
This tab changes what controls are displayed in the Meterbridge that is
@ -313,7 +313,7 @@
</li>
</ul>
<h2 id="misc">Misc</h2>
<h2 id="properties-misc">Misc</h2>
<p>
This tab has several things that don't fit on the other tabs.

View File

@ -7,14 +7,14 @@
<tr><th>Start/Stop</th><td>Starts or stops the playhead, and recording if it is armed</td></tr>
<tr><th>Play</th>
<tr><th class="sub1">Play Selection</th><td>Only plays the selected part of the session, be it a range or selected regions</td></tr>
<tr><th class="sub1">Play Selection w/Preroll</th><td>As the previous menu, except it starts the playback a few bars or seconds before the beginning of the selection (the amount of time can be set in the <a href="@@preferences#transport">Preferences</a>)</td></tr>
<tr><th class="sub1">Play Selection w/Preroll</th><td>As the previous menu, except it starts the playback a few bars or seconds before the beginning of the selection (the amount of time can be set in the <a href="@@preferences#preferences-transport">Preferences</a>)</td></tr>
<tr><th class="sub1">Start/Continue/Stop</th><td>Leaves loop play or range play mode but without stopping the transport</td></tr>
<tr><th class="sub1">Play from Edit Point and Return</th><td>Starts the playback at the <a href="@@edit-point-control">Edit point</a>, and when stopped, goes back to the original location</td></tr>
<tr><th class="sub1">Play Loop Range</th><td>If a <a href="@@the-loop-range">Loop range</a> is defined, play it and loop until stopped</td></tr>
<tr><th>Start Recording</th><td>This is a shortcut to trigger the global recording, and start playback at once</td></tr>
<tr><th>Stop and Forget Capture</th><td>Stops the recording, removes the newly created material, and goes back to the original position</td></tr>
<tr><th>Enable Record</th><td>Triggers the global recording. Next time "Play" is pressed, it will record on the track(s) that are armed for recording</td></tr>
<tr><th>Record w/Preroll</th><td>As the Start Recording menu, except it starts the recording a few bars or seconds before the playhead's position (the amount of time can be set in the <a href="@@preferences#transport">Preferences</a>)</td></tr>
<tr><th>Record w/Preroll</th><td>As the Start Recording menu, except it starts the recording a few bars or seconds before the playhead's position (the amount of time can be set in the <a href="@@preferences#preferences-transport">Preferences</a>)</td></tr>
<tr><th>Record w/Count-In</th><td>As the Start Recording menu, except it waits for 2 bars before the playhead's position. The Metronome will tick (even if disabled) during the count-in</td></tr>
<tr><th>Set Loop from Selection</th><td>Converts the selection into a <a href="@@the-loop-range">Loop range</a> by placing loop markers at the start and end of the selected range</td></tr>

View File

@ -72,7 +72,7 @@
<tr><th>[] Show Editor Mixer</th><td>When checked, the selected tracks' mixer strip is displayed on the left of the editor window, allowing for a quick access to e.g. effects and routing</td></tr>
<tr><th>[] Show Editor List</th><td>In the Editor window, shows the <a href="@@editor-lists">Editor List</a>, giving access to a number of handy lists (regions, tracks, &hellip;)</td></tr>
<tr><th>[] Toggle Mixer List</th><td>In the Mixer view, shows the Mixer list, giving access to some handy lists (<a href="@@favorite-plugins-window">Favorite plugins</a>, <a href="@@strips-list">The Strip list</a>,&hellip;)</td></tr>
<tr><th>[] Toggle Monitor Section Visibility</th><td>If the <kbd class="option">Use monitoring section on this session</kbd> has been checked in the <a href="@@session-properties#monitoring">Session Properties window</a>, shows or hides the Monitor Section in the Mixer</td></tr>
<tr><th>[] Toggle Monitor Section Visibility</th><td>If the <kbd class="option">Use monitoring section on this session</kbd> has been checked in the <a href="@@session-properties#properties-monitoring">Session Properties window</a>, shows or hides the Monitor Section in the Mixer</td></tr>
<tr><th>[] Show Measure Lines</th><td>If checked, in the Editor, shows a vertical white line at each measure start</td></tr>
<tr><th>[] Show Summary</th><td>If checked, in the Editor, shows the <a href="@@summary">Summary</a>, allowing a faster navigation in the session</td></tr>
<tr><th>[] Show Group Tabs</th><td>If checked, makes the groups visible as tabs on the left in the Editor, and on the top in the mixer</td></tr>

View File

@ -175,7 +175,7 @@
<h3>Clock Sync Lock</h3>
<p>
As described in the
<a href="http://manual.ardour.org/synchronization/on-clock-and-time/">On Clock and Time</a>
<a href="@@on-clock-and-time">On Clock and Time</a>
chapter, timecode and clock are independent. If the external timecode
source is not in sample-sync with the audio hardware (and JACK), Ardour
needs to run at varispeed to adjust for the discrepancy.

View File

@ -106,9 +106,9 @@
&minus;4&nbsp;dB (the <em>difference</em> of the gains remains the same).
</p>
<p>
<a href="@@bus-controls#mute"><kbd class="option">Muting</kbd></a>,
<a href="@@bus-controls#solo"><kbd class="option">Soloing</kbd></a>,
<a href="@@audio-track-controls#record"><kbd class="option">record enable</kbd></a>,
<a href="@@bus-controls"><kbd class="option">Muting</kbd></a>,
<a href="@@bus-controls"><kbd class="option">Soloing</kbd></a>,
<a href="@@audio-track-controls#audiotrack-record"><kbd class="option">record enable</kbd></a>,
<a href="@@the-tracks-and-busses-list"><kbd class="option">active state</kbd></a>,
<a href="@@track-color"><kbd class="option">color</kbd></a> and
<a href="@@monitoring"><kbd class="option">monitoring</kbd></a>

View File

@ -23,8 +23,8 @@
<tr><th>Audio</th>
<td>An <dfn>Audio Track</dfn> is created with a user-specified number of
inputs. The number of outputs is defined by the master bus channel count
(for details see <a href="#channelconfiguration">Channel Configuration</a>
below). This is the type of track to use when planning to work with
(for details see <a href="@@channel-configuration">Channel Configuration</a>).
This is the type of track to use when planning to work with
existing or newly recorded audio.</td></tr>
<tr><th>MIDI</th>
<td>A <dfn>MIDI track</dfn> is created with a single MIDI input, and a

View File

@ -41,7 +41,7 @@
Importing a video makes Ardour start the video server automatically. If
the <kbd class="option">Show video Server Startup Dialog</kbd> option in the
<kbd class="menu">Video</kbd> section of the
<a href="@@preferences#video">preferences</a> is checked, the
<a href="@@preferences#preferences-video">preferences</a> is checked, the
<kbd class="menu">Launch Video Server</kbd> window is shown, allowing more
complex operations, e.g. connecting to a remote video server instead of a local
one.

View File

@ -1,46 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>The Ardour Manual</title>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<meta name="description" content="The Ardour Manual">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="{{page.bootstrap_path}}/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/app.css" rel="stylesheet">
</head>
<body>
<div class="container-fluid">
<div class="row-fluid">
<div id="tree" class="navbar">
<h1><a href="/"><img class="img-responsive" src="/images/logo.png" alt="The Ardour Manual" /></a></h1>
{% tree %}
</div> <!-- tree -->
<div class="span12" id="content">
{{ content }}
</div> <!-- content -->
</div> <!-- row-fluid -->
</div> <!-- container-fluid -->
<script type="text/javascript">
// I'll go to hell for this
var isA = function(regex) { return navigator.userAgent.match(regex) };
var isAbout = function(regex) { return document.getElementsByTagName('h1')[1].textContent.match(regex) };
if ( (isA(/Mac/) || isAbout(/OS X/)) && (!isAbout(/Linux/)) ) {
var e = document.getElementsByTagName('body')[0];
e.className += ' mac'; // class magic for Cmd vs. Ctrl keys.
}
</script>
</body>
</html>

View File

@ -1,81 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>{{page.page_title}}</title>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<meta name="description" content="The Ardour Manual">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="{{page.bootstrap_path}}/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/app.css" rel="stylesheet">
{% if page.style %}
<link href="/css/{{page.style}}.css" rel="stylesheet">
{% endif %}
</head>
<body>
<div class="container-fluid">
<div class="row-fluid">
<div id="tree">
<h1><a href="/"><img class="img-responsive" src="/images/logo.png" alt="The Ardour Manual" /></a></h1>
<form id="custom-search-form" class="navbar-form" method="post" action="https://duckduckgo.com">
<div class="input-group">
<input type="text" class="form-control" placeholder="Search &hellip;" name="q">
<span class="input-group-btn">
<button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></button>
<button class="btn btn-default" type="button" onclick="window.location.href='/ardourmanual.html'"><span class="glyphicon glyphicon-book" aria-hidden="true"></span></button>
</span>
</div>
<input type="hidden" name="sites" value="manual.ardour.org"><!-- domain -->
<input type="hidden" name="kh" value="1"> <!--HTTPS on/off -->
<input type="hidden" name="kl" value="wt-wt"> <!--region wt-wt = no region/worldwide -->
<input type="hidden" name="kg" value="p"> <!--get [g] vs post [p] -->
<input type="hidden" name="k7" value="w"> <!-- background colour -->
<input type="hidden" name="kj" value="#212a30"> <!-- results page header colour -->
<input type="hidden" name="kx" value="#59acd4"> <!-- URLs colour -->
<input type="hidden" name="k1" value="-1"> <!-- adverts on/off -->
<input type="hidden" name="k9" value="#59acd4"> <!-- links colour -->
<input type="hidden" name="kaa" value="#2d586c"> <!-- visited links colour -->
<input type="hidden" name="kae" value="#cc0000"> <!-- theme [changes result titles] colour -->
<input type="hidden" name="ka" value="junge"> <!-- link font -->
<input type="hidden" name="kt" value="junge"> <!-- text font -->
</form>
{% tree %}
</div> <!-- tree -->
<div class="span12" id="content">
{% breadcrumbs %}
{% githubedit %}
<h1 class="title">{{ page.title }}</h1>
{{ content }}
<div class="clear"></div>
{% prevnext %}
</div> <!-- content -->
</div> <!-- row-fluid -->
</div> <!-- container-fluid -->
<script type="text/javascript">
// I'll go to hell for this
var isA = function(regex) { return navigator.userAgent.match(regex) };
var isAbout = function(regex) { return document.getElementsByTagName('h1')[1].textContent.match(regex) };
if ( (isA(/Mac/) || isAbout(/OS X/)) && (!isAbout(/Linux/)) ) {
var e = document.getElementsByTagName('body')[0];
e.className += ' mac'; // class magic for Cmd vs. Ctrl keys.
}
</script>
</body>
</html>

View File

@ -1,452 +0,0 @@
@font-face {
font-family: 'junge-regular';
src: url('junge-regular-webfont.woff2') format('woff2'),
url('junge-regular-webfont.woff') format('woff'),
url('junge-regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
body {
font-family: 'junge-regular';
font-size: 16px;
line-height: 2ex;
}
.clear {
clear:both;
}
#tree {
background-color: #212A30;
line-height: 1.8ex;
height: 100%;
overflow: scroll;
position: fixed;
top: 0;
bottom: 0;
left: 0;
width: 20em;
padding: 1em 1em 2em 1.5em;
}
#tree h1 {
font-size: 1.75em;
margin-bottom: 1em;
font-weight: normal;
}
#tree ul {
padding-left: 1em;
list-style-type: none;
}
#tree a {
display: inline !important;
font-size: 0.88em;
line-height: 2em;
color: #E4E4E4;
border-bottom: 1px solid transparent;
}
#tree a:hover {
text-decoration: none;
border-bottom: 1px solid #aaa;
}
#tree .active > a {
display: inline;
color: #FF8080;
}
#content {
padding: 1em 2em 2ex 21em;
margin-left: 0;
line-height: 2em;
}
#content h1,
#content h2,
#content h3,
#content h4 {
font-weight: normal;
padding-bottom: .3ex;
}
#content h1 {
font-size: 1.8em;
margin: 0 0 2ex 0;
padding-bottom: .8ex;
border-bottom: 2px solid #ccc;
}
#content h2 {
font-size: 1.3em;
margin: 2ex 0 1ex 0;
border-bottom: 2px solid #ddd;
}
#content h3 {
font-size: 1.2em;
margin: 1.5ex 0 1ex 0;
border-bottom: 1px solid #eee;
}
#content h4 {
font-size: 1.1em;
margin: 1.5ex 0 .5ex 0;
border-bottom: 1px solid #eee;
}
#content table {
width:100%;
margin: 1em 0;
padding: 0;
font-weight: normal;
text-align: left;
}
#content table tr {
border-bottom: 2px solid #eeeeee;
}
#content table tr:nth-child(odd){
background-color: white;
}
#content table tr:nth-child(even){
background-color: #f5f5f5;
}
#content table tr:hover {
background-color: #F2F9FF;
}
#content table td,
#content table th {
margin: 0;
padding: .5em;
}
#content table th {
font-weight: bold;
}
#content table th.sub1 {
padding-left: 2em;
}
#content table th.sub2 {
padding-left: 4em;
}
#content table thead {
font-weight:bold;
}
#content table.dl th {
/* dl class (definition list) is for 2-columns tables that describe properties:
maximmizes the width of the 2nd (description) column */
vertical-align: top;
min-width: 20%;
white-space:nowrap
}
#content table.dl td {
vertical-align: top;
width: 100%;
}
#content ul,
#content ol {
overflow: hidden;
}
#content figure {
display: table;
}
#content figcaption {
display: table-caption;
caption-side: bottom;
font-style: italic;
padding-top: 0.5em;
padding-bottom: 1em;
}
#content figcaption.center {
text-align: center;
}
#content figcaption.titleover {
text-align: center;
caption-side: top ;
}
#content figure.right {
margin: 0 0 1em 1em;
float: right;
clear: right;
}
#content figure.left {
margin: 0 1em 1em 0;
float: left;
clear: left;
}
#content figure.center {
margin: 1em auto 1em auto;
clear: both;
}
kbd {
display: inline-block;
min-width: 1em;
padding: .2em .3em;
font: normal .8em/1 sans-serif;
text-align: center;
text-decoration: none;
border-radius: .3em;
background: rgb(250, 250, 250);
background: linear-gradient(to top, rgb(210, 210, 210), rgb(255, 255, 255));
color: rgb(50, 50, 50);
text-shadow: 0 0 2px rgb(255, 255, 255);
box-shadow: inset 0 0 1px rgb(255, 255, 255), inset 0 0 .4em rgb(200, 200, 200), 0 .1em 0 rgb(130, 130, 130), 0 .11em 0 rgba(0, 0, 0, .4), 0 .1em .11em rgba(0, 0, 0, .9);
white-space:nowrap;
text-transform:capitalize;
}
kbd.def {
font-weight:bolder;
margin-right:.2em;
}
kbd.input,
kbd.cmd,
kbd.osc {
font-family:mono;
border-width:0;
text-transform:none;
}
kbd.input {
background:none;
border-radius: 0;
}
kbd.cmd {
display:block;
width:100%;
margin-bottom:1ex;
text-transform:none;
background: rgb(220, 220, 220);
text-shadow: none;
box-shadow: none;
text-align:left;
}
kbd.cmd.lin:before {
content: 'user@linux:~ ';
color:#999999;
}
kbd.cmd.mac:before {
content: 'MacBook:~/Desktop User\$ ';
color:#999999;
}
kbd.cmd.win:before {
content: 'C:\\Users\\myAccount> ';
color:#999999;
}
kbd.optoff,
kbd.option {
border:none;
background:none;
}
kbd.optoff:before {
content:url('/images/checkbox-unchecked.png');
margin: 0 1em 0 0;
vertical-align:middle;
}
kbd.option:before {
content:url('/images/checkbox-checked.png');
margin: 0 1em 0 0;
vertical-align:middle;
}
kbd.menu {
border:none;
background:none;
font-weight:bold;
font-stretch:extra-condensed;
white-space:normal;
}
kbd.osc {
border:none;
background: rgb(208, 208, 243);
font-stretch:extra-condensed;
white-space: nowrap;
text-align:left;
}
kbd.fader,
kbd.knob,
kbd.button {
background: rgb(174, 174, 217);
background: linear-gradient(to top, rgb(174, 174, 217), rgb(221, 221, 255));
color:#000044;
}
kbd.fader {
border-width: 1px 1px 9px 9px;
}
kbd.knob {
border-radius:12px;
border-width: 1px 1px 9px 9px;
}
kbd.button {
border-radius:8px;
border-width: 1px 1px 3px 3px;
}
kbd.mouse {
border-radius:10px;
}
samp {
font-family:mono;
color:#666666;
background-color:#EBEBEB;
margin-left: .5em;
margin-right: .5em;
}
#content dfn {
font-weight: bold;
font-style: normal;
}
#content img.mini {
width: 200px;
}
#content img.mini:hover {
width: 100%;
}
#content p.center {
text-align:center;
}
#content .note,
#content .warning,
#content .fixme {
min-height: 1.5ex;
padding: 1em;
margin-bottom: 1em;
border-style: solid;
border-width: 1px 1px 1px 8px;
}
#content code {
font-size: .9em;
color: #555;
}
#content .note {
border-color: #e3e3e3;
background-color: #f5f5f5;
}
#content .warning {
border-color: #995555;
background-color: #ffeeee;
}
#content .fixme {
border-color: #999944;
background-color: #f0f0e0;
font-weight:bold;
}
.fixme:before {
content:'FIXME: ';
font-style: italic;
font-size:2em;
}
/* Keyboard modifiers */
.mod1:before { content: "Ctrl ";}
.mod2:before { content: "Alt ";}
.mod3:before { content: "Shift ";}
.mod4:before { content: "Win ";}
.mod12:before { content: "Ctrl Alt ";}
.mod13:before { content: "Ctrl Shift ";}
.mod14:before { content: "Ctrl Win ";}
.mod23:before { content: "Alt Shift ";}
.kp:before { content: "Keypad ";}
/* Variants *without* space after them (yes, these are needed!) */
.mod1n:before { content: "Ctrl";}
.mod2n:before { content: "Alt";}
.mod3n:before { content: "Shift";}
.mod4n:before { content: "Win";}
.mod12n:before { content: "Ctrl Alt";}
.mod13n:before { content: "Ctrl Shift";}
.mod14n:before { content: "Ctrl Win";}
.mod23n:before { content: "Alt Shift";}
/* Automagic translation for Mac based display */
.mac .mod1:before { content: "Cmd ";}
.mac .mod2:before { content: "Ctrl ";}
.mac .mod3:before { content: "Shift ";}
.mac .mod4:before { content: "Opt ";}
.mac .mod12:before { content: "Cmd Ctrl ";}
.mac .mod13:before { content: "Cmd Shift ";}
.mac .mod14:before { content: "Cmd Opt ";}
.mac .mod23:before { content: "Ctrl Shift ";}
/* No space variants (Mac based) */
.mac .mod1n:before { content: "Cmd";}
.mac .mod2n:before { content: "Ctrl";}
.mac .mod3n:before { content: "Shift";}
.mac .mod4n:before { content: "Opt";}
.mac .mod12n:before { content: "Cmd Ctrl";}
.mac .mod13n:before { content: "Cmd Shift";}
.mac .mod14n:before { content: "Cmd Opt";}
.mac .mod23n:before { content: "Ctrl Shift";}
@media (max-width: 800px) {
#tree {
position: relative;
height: 250px;
width: 100%;
margin-top: 20px;
}
#content {
padding-left: 20px;
margin-top: 0px;
}
}
/* for the TOC */
#content p.chapter,
#content p.subchapter,
#content p.section,
#content p.subsection {
line-height:1em;
}
#content p.chapter { padding-top: 1em; padding-left: 1em; padding-bottom:1em; }
#content p.subchapter { padding-left: 4em; }
#content p.section { padding-left: 6em; }
#content p.subsection { padding-left: 8em; }
/* for images sliced in divs, as in http://manual.ardour.org/ardours-interface/about/ */
.container { position: relative; border: none; }
.hoverimg { position: absolute; border: none; }
.hoverimg:hover{ z-index:100; box-shadow: 0 0 .2em .2em lightgreen; }