From 0c19018fbb2ae22b06df87b4d458f07404e8ff58 Mon Sep 17 00:00:00 2001 From: gabe Date: Thu, 16 Sep 2021 15:35:09 -0500 Subject: [PATCH 01/14] changed testing suite. Corresponds with new feature. --- tests/result/include/include.html | 552 ------------------ .../include/{include.adoc => include.txt} | 0 tests/test/landing_page.adoc | 2 +- 3 files changed, 1 insertion(+), 553 deletions(-) delete mode 100644 tests/result/include/include.html rename tests/test/include/{include.adoc => include.txt} (100%) diff --git a/tests/result/include/include.html b/tests/result/include/include.html deleted file mode 100644 index 74d8e07..0000000 --- a/tests/result/include/include.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - -included section - - - - - -
-
-

included section

-
-
-

Fusce maximus nec magna eu ultricies. -Fusce quis tellus vitae arcu facilisis lobortis. -Donec id erat at enim porta placerat in vitae sapien. -Duis justo arcu, hendrerit nec nulla eu, dictum dapibus ipsum. -Sed fermentum id elit eget fringilla. -Suspendisse volutpat imperdiet justo, ut efficitur odio maximus et. -Nunc interdum sollicitudin eros sit amet convallis. -Praesent volutpat tempus metus id tincidunt. -Proin aliquet justo a fermentum consectetur. -Nunc scelerisque, nisi id scelerisque dictum, nibh lectus ultrices nunc, quis ultricies erat velit sit amet urna. -Maecenas orci felis, volutpat at bibendum ut, mattis eu justo.

-
-
-

blocks

-
-
listing block
-
-
example of _listing block_
-with verbatim line break
-
-
-
-
Example 1. example block
-
-
-

example block -with line break

-
-
-
-
-
literal block
-
-
_literal_ block
-with line break
-
-
-pass block -with underlined text -
-
quote block
-
-
-

quote block -with line break

-
-
-
-
-
-
sidebar block
-
-

sidebar block -with line break

-
-
-
-
- - - - - -
-
Note
-
-
-

This is an example of an admonition block.

-
-
-

Unlike an admonition paragraph, it may contain any AsciiDoc content. -The style can be any one of the admonition labels:

-
-
-
    -
  • -

    NOTE

    -
  • -
  • -

    TIP

    -
  • -
  • -

    WARNING

    -
  • -
  • -

    CAUTION

    -
  • -
  • -

    IMPORTANT

    -
  • -
-
-
-
-
-
-
-
- - - \ No newline at end of file diff --git a/tests/test/include/include.adoc b/tests/test/include/include.txt similarity index 100% rename from tests/test/include/include.adoc rename to tests/test/include/include.txt diff --git a/tests/test/landing_page.adoc b/tests/test/landing_page.adoc index 0a4b2f5..ea59699 100644 --- a/tests/test/landing_page.adoc +++ b/tests/test/landing_page.adoc @@ -131,4 +131,4 @@ It's designed for: |=== -include::{includedir}/include.adoc[] +include::{includedir}/include.txt[] From 4cd780be6de40fa1bc261e547123d26242086085 Mon Sep 17 00:00:00 2001 From: gabe Date: Thu, 16 Sep 2021 21:16:34 -0500 Subject: [PATCH 02/14] added glob pattern based exclude Will not copy over files that match the exclude paramater. This can be usefull for things that are needed to compile the asciidoc, but should not be included in the final website. resolves #4 --- ASCIIsite.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ASCIIsite.py b/ASCIIsite.py index cd825c0..8d5b212 100755 --- a/ASCIIsite.py +++ b/ASCIIsite.py @@ -12,6 +12,7 @@ def parse_arguments(): parser.add_argument('inputDir', type=Path, help='The directory of adoc files to be copied and converted.') parser.add_argument('-o', '--output', type=Path, help='What to name the generated directory or tar file') parser.add_argument('-z', '--compress', action='store_true', help='whether to compress the resulting directory to a tar.gz file. can be usefull for scripting to transfer the site to a remote server.') + parser.add_argument('--exclude', nargs='+', help='A list of glob patterns to ignore. Remember to quote them so your shell doesnt escape them!') args=parser.parse_args() #set compress flag @@ -43,15 +44,17 @@ def parse_arguments(): logging.info(f'outputting to {outFile.resolve()}') logging.debug(f'compress is {compress}') - return args.inputDir.resolve(), outFile, compress + return args.inputDir.resolve(), outFile, compress, args.exclude #Doing it in a tmpDir first, as some distrubutions put temp files on a ramdisk. this should speed up the operation sigificantly. class TmpDir: - def __init__(self, srcDir): + def __init__(self, srcDir, exclude): self.tmpDir=tempfile.TemporaryDirectory() logging.debug(f'making tmp file from {srcDir} at {self.tmpDir.name}') self.path=self.tmpDir.name+'/'+Path(srcDir).resolve().name - self.ignorePattern=shutil.ignore_patterns('*.adoc', '.git', '.gitignore') + self.ignorePatterns=['*.adoc', '.gitignore', '.git/*'] + self.ignorePatterns.extend(exclude) + self.ignorePattern=shutil.ignore_patterns(*self.ignorePatterns) shutil.copytree(srcDir, self.path, ignore=self.ignorePattern, symlinks=False) #copy out from tmpDir (which may be in RAM, depending on distrubution) to disk @@ -92,9 +95,9 @@ def convert_file(inDir, outDir, inFile): logging.error(f'stdOut was {e.stdout}') if __name__ == '__main__': - inFile, outFile, compress=parse_arguments() + inFile, outFile, compress, exclude=parse_arguments() os.chdir(inFile) - tmpDir=TmpDir('./') + tmpDir=TmpDir('./', exclude) pathsToConvert=find_paths_to_convert('*.adoc') for i in pathsToConvert: From c5abd57ab44afbc5ce63a6093efb917f1ba56bc1 Mon Sep 17 00:00:00 2001 From: gabe Date: Thu, 16 Sep 2021 21:28:56 -0500 Subject: [PATCH 03/14] Edited readme for the glob ignore feature. --- README.md | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e95c43b..9d81680 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,18 @@ ![Licence](https://img.shields.io/badge/Licence-GPL-blue) ## What is it? -ASCIIsite is a simple, barebones static site generator. You give it a directory contaning asciidoctor documents and supporing media in the strucutre you want your site to be in, and it spits out a fully functional static site based on that input directory. +ASCIIsite is a simple, bare bones static site generator. You give it a directory containing asciidoctor documents and supporting media in the structure you want your site to be in, and it spits out a fully functional static site based on that input directory. ## Usage -ASCIISite takes 2 (so far) optional arguments followed by the single mandatory arument telling it what directory to convert. +ASCIISite takes 2 (so far) optional arguments followed by the single mandatory argument telling it what directory to convert. the -o or --output option simply tells ASCIISite what to name the output file. +the --exclude flag allows you to specify a list of glob patterns. Any file matching these glob patterns will not be copied to the output. +This is helpful for any files that are needed for the compilation of the asciidoc files, but do not need to be in the final site. +The main use case I am aware of is files that are put into an asciidoc document via an include statement. + the -z or --compress flag tells ASCIISite to put the final product in a compressed tar.gz file as its output. This is especially useful if you are running ASCIISite on your personal computer, and will be uploading the tar.gz file to your server. @@ -29,7 +33,7 @@ test ├── images │   └── test_pattern.svg ├── include -│   └── include.adoc +│   └── include.txt └── landing_page.adoc ``` @@ -50,7 +54,25 @@ result ├── images │   └── test_pattern.svg ├── include -│   └── include.html +│   └── include.txt +└── landing_page.html +``` + +If, say, the include directory is a directory needed for the asciidoc compilation, +but not needed for the final website, you can use the --exclude option to specify a list of glob patterns to exclude. For example, +```` +ASCIIsite.py --exclude 'include*' -o output test +``` + +will get you an output like: +``` +result +├── dir +│   ├── collatz.py +│   └── subdir +│   └── linked.html +├── images +│   └── test_pattern.svg └── landing_page.html ``` From 3ffc96453e3eb57ce1277dc71b28b8d2c38a6b6b Mon Sep 17 00:00:00 2001 From: gabe Date: Sun, 26 Sep 2021 12:32:22 -0500 Subject: [PATCH 04/14] implemented importing exclude globs from a file. --- ASCIIsite.py | 11 +++++- tests/globignore | 1 + tests/result/include/include.txt | 65 ++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 tests/globignore create mode 100644 tests/result/include/include.txt diff --git a/ASCIIsite.py b/ASCIIsite.py index 8d5b212..50c9479 100755 --- a/ASCIIsite.py +++ b/ASCIIsite.py @@ -11,8 +11,9 @@ def parse_arguments(): parser=argparse.ArgumentParser(description='create a website directory structure by converting .adoc files in a directory strucutre to .html files.') parser.add_argument('inputDir', type=Path, help='The directory of adoc files to be copied and converted.') parser.add_argument('-o', '--output', type=Path, help='What to name the generated directory or tar file') - parser.add_argument('-z', '--compress', action='store_true', help='whether to compress the resulting directory to a tar.gz file. can be usefull for scripting to transfer the site to a remote server.') + parser.add_argument('--exclude-file', type=Path, help='A text file containing glob patterns to exclude, 1 per line.') parser.add_argument('--exclude', nargs='+', help='A list of glob patterns to ignore. Remember to quote them so your shell doesnt escape them!') + parser.add_argument('-z', '--compress', action='store_true', help='whether to compress the resulting directory to a tar.gz file. can be usefull for scripting to transfer the site to a remote server.') args=parser.parse_args() #set compress flag @@ -44,7 +45,13 @@ def parse_arguments(): logging.info(f'outputting to {outFile.resolve()}') logging.debug(f'compress is {compress}') - return args.inputDir.resolve(), outFile, compress, args.exclude + with open(args.exclude_file, 'r') as file: + exclude=[glob.strip() for glob in file] + + if args.exclude != None: + exclude.extend(args.exclude) + + return args.inputDir.resolve(), outFile, compress, exclude #Doing it in a tmpDir first, as some distrubutions put temp files on a ramdisk. this should speed up the operation sigificantly. class TmpDir: diff --git a/tests/globignore b/tests/globignore new file mode 100644 index 0000000..0eddfc6 --- /dev/null +++ b/tests/globignore @@ -0,0 +1 @@ +include* diff --git a/tests/result/include/include.txt b/tests/result/include/include.txt new file mode 100644 index 0000000..a7151a2 --- /dev/null +++ b/tests/result/include/include.txt @@ -0,0 +1,65 @@ +== included section + +Fusce maximus nec magna eu ultricies. +Fusce quis tellus vitae arcu facilisis lobortis. +Donec id erat at enim porta placerat in vitae sapien. +Duis justo arcu, hendrerit nec nulla eu, dictum dapibus ipsum. +Sed fermentum id elit eget fringilla. +Suspendisse volutpat imperdiet justo, ut efficitur odio maximus et. +Nunc interdum sollicitudin eros sit amet convallis. +Praesent volutpat tempus metus id tincidunt. +Proin aliquet justo a fermentum consectetur. +Nunc scelerisque, nisi id scelerisque dictum, nibh lectus ultrices nunc, quis ultricies erat velit sit amet urna. +Maecenas orci felis, volutpat at bibendum ut, mattis eu justo. + +=== blocks + +.listing block +---- +example of _listing block_ +with verbatim line break +---- + +.example block +==== +example block +with line break +==== + +.literal block +.... +_literal_ block +with line break +.... + +.pass block +++++ +pass block +with underlined text +++++ + +.quote block +____ +quote block +with line break +____ + +.sidebar block +**** +sidebar block +with line break +**** + +[NOTE] +==== +This is an example of an admonition block. + +Unlike an admonition paragraph, it may contain any AsciiDoc content. +The style can be any one of the admonition labels: + +* NOTE +* TIP +* WARNING +* CAUTION +* IMPORTANT +==== From 08a56839068343b99a73b61af1a68a0cd708519a Mon Sep 17 00:00:00 2001 From: gabe Date: Sun, 26 Sep 2021 12:45:45 -0500 Subject: [PATCH 05/14] updated readme for new feature --- README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9d81680..464838f 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,17 @@ ASCIISite takes 2 (so far) optional arguments followed by the single mandatory a the -o or --output option simply tells ASCIISite what to name the output file. -the --exclude flag allows you to specify a list of glob patterns. Any file matching these glob patterns will not be copied to the output. -This is helpful for any files that are needed for the compilation of the asciidoc files, but do not need to be in the final site. -The main use case I am aware of is files that are put into an asciidoc document via an include statement. - the -z or --compress flag tells ASCIISite to put the final product in a compressed tar.gz file as its output. This is especially useful if you are running ASCIISite on your personal computer, and will be uploading the tar.gz file to your server. +the --exclude flag allows you to specify a list of glob patterns. Any file matching these glob patterns will not be copied to the output. + +The --exclude-file flag allows you to specify a file containing one glob to exclude per line. Other than inputting from a file, works exactly the same as --exclude. Note that it cannot parse the full spec of .gitignore files, only traditional globs. + +Exclusions are helpful for any files that are needed for the compilation of the asciidoc files, but do not need to be in the final site. +The main use case I am aware of is files that are put into an asciidoc document via an include statement. + + As for how to format the input directory, thats up to you. The directory structure of the input will be mirrored in the structure of the output website. The only real rule you need to follow is that all your links to other pages in the input directory should be relative, so they dont get broken when you move the output directory around. From 6e2bdb0c8d042bb9bff93c9e090d79323d58bad9 Mon Sep 17 00:00:00 2001 From: gabe Date: Mon, 27 Sep 2021 14:52:02 -0500 Subject: [PATCH 06/14] Caught a few errors. --- ASCIIsite.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ASCIIsite.py b/ASCIIsite.py index 50c9479..d0ad22a 100755 --- a/ASCIIsite.py +++ b/ASCIIsite.py @@ -45,11 +45,19 @@ def parse_arguments(): logging.info(f'outputting to {outFile.resolve()}') logging.debug(f'compress is {compress}') - with open(args.exclude_file, 'r') as file: - exclude=[glob.strip() for glob in file] + try: + with open(args.exclude_file, 'r') as file: + exclude=[glob.strip() for glob in file] - if args.exclude != None: - exclude.extend(args.exclude) + if args.exclude != None: + exclude.extend(args.exclude) + except Exception as e: + print(str(e)) + exit() + + if args.inputDir.resolve().exists(): + print(f'Inputdir {args.inputDir.resolve()} does not exist!') + exit() return args.inputDir.resolve(), outFile, compress, exclude From 3e5250a8dc4847ad829f52de67b700c63584f134 Mon Sep 17 00:00:00 2001 From: gabe Date: Mon, 27 Sep 2021 14:55:37 -0500 Subject: [PATCH 07/14] include.txt snuck into results again. --- tests/result/include/include.txt | 65 -------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 tests/result/include/include.txt diff --git a/tests/result/include/include.txt b/tests/result/include/include.txt deleted file mode 100644 index a7151a2..0000000 --- a/tests/result/include/include.txt +++ /dev/null @@ -1,65 +0,0 @@ -== included section - -Fusce maximus nec magna eu ultricies. -Fusce quis tellus vitae arcu facilisis lobortis. -Donec id erat at enim porta placerat in vitae sapien. -Duis justo arcu, hendrerit nec nulla eu, dictum dapibus ipsum. -Sed fermentum id elit eget fringilla. -Suspendisse volutpat imperdiet justo, ut efficitur odio maximus et. -Nunc interdum sollicitudin eros sit amet convallis. -Praesent volutpat tempus metus id tincidunt. -Proin aliquet justo a fermentum consectetur. -Nunc scelerisque, nisi id scelerisque dictum, nibh lectus ultrices nunc, quis ultricies erat velit sit amet urna. -Maecenas orci felis, volutpat at bibendum ut, mattis eu justo. - -=== blocks - -.listing block ----- -example of _listing block_ -with verbatim line break ----- - -.example block -==== -example block -with line break -==== - -.literal block -.... -_literal_ block -with line break -.... - -.pass block -++++ -pass block -with underlined text -++++ - -.quote block -____ -quote block -with line break -____ - -.sidebar block -**** -sidebar block -with line break -**** - -[NOTE] -==== -This is an example of an admonition block. - -Unlike an admonition paragraph, it may contain any AsciiDoc content. -The style can be any one of the admonition labels: - -* NOTE -* TIP -* WARNING -* CAUTION -* IMPORTANT -==== From 3e1a15ac48739a17d47297a76e6ba76dc4292bfc Mon Sep 17 00:00:00 2001 From: gabe Date: Sun, 9 Jan 2022 21:55:23 -0600 Subject: [PATCH 08/14] fixed logic error in inputdir validation. --- ASCIIsite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ASCIIsite.py b/ASCIIsite.py index d0ad22a..be356fb 100755 --- a/ASCIIsite.py +++ b/ASCIIsite.py @@ -55,7 +55,7 @@ def parse_arguments(): print(str(e)) exit() - if args.inputDir.resolve().exists(): + if not args.inputDir.resolve().exists(): print(f'Inputdir {args.inputDir.resolve()} does not exist!') exit() From d611923e89eb9f2f46a4868c83b283bd2d74d131 Mon Sep 17 00:00:00 2001 From: gabe Date: Sun, 9 Jan 2022 21:56:47 -0600 Subject: [PATCH 09/14] added a few more things to test suite --- tests/result/dir/subdir/linked.html | 25 ++++++++++++++- tests/result/landing_page.html | 48 ++++++++++++++++++++++++++--- tests/test.sh | 2 ++ tests/test/dir/subdir/linked.adoc | 17 ++++++++-- tests/test/landing_page.adoc | 13 ++++++++ 5 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 tests/test.sh diff --git a/tests/result/dir/subdir/linked.html b/tests/result/dir/subdir/linked.html index 31be3d8..1a4a433 100644 --- a/tests/result/dir/subdir/linked.html +++ b/tests/result/dir/subdir/linked.html @@ -448,10 +448,33 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
-Stand By +Stand By
Figure 1. Technical Difficulties
+
+
+While the creative works from the 16th century can still be accessed and used by others, the data in some software programs from the 1990s is already inaccessible. Once a company that produces a certain product goes out of business, it has no simple way to uncover how its product encoded data. The code is thus lost, and the software is inaccessible. Knowledge has been destroyed. +
+
+— Lawrence Lessig
+May the Source Be With You +
+
+
+
Three Rings for the Elven-kings under the sky,
+Seven for the dwarf-lords in their halls of stone,
+Nine for Mortal Men doomed to die,
+One for the Dark Lord on his dark throne,
+In the Land of Mordor where the Shadows lie.
+One Ring to rule them all, One Ring to find them,
+One Ring to bring them all and in the darkness bind them
+In the Land of Mordor where the Shadows lie.
+
+— J.R.R. Tolkien
+The Fellowship of the Ring +
+
diff --git a/tests/result/landing_page.html b/tests/result/landing_page.html index cf05dcc..3aaf826 100644 --- a/tests/result/landing_page.html +++ b/tests/result/landing_page.html @@ -449,7 +449,6 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
Table of Contents
  • inline formatting tests
  • -
  • list tests
  • link tests
  • tables test
  • included section @@ -527,11 +526,15 @@ Sed eleifend, enim vitae ultrices auctor, dolor ipsum molestie dui, id dignissim

    → ⇒ ← ⇐

    +
    +

    ==colapsable block

    +
    +Details +
    +
    +

    == list tests

    -
    -

    list tests

    -
    unordered list test
      @@ -666,6 +669,17 @@ Sed eleifend, enim vitae ultrices auctor, dolor ipsum molestie dui, id dignissim
    +
    +
    +
    +
    math test
    +

    \(\frac{\frac{1}{x}+\frac{1}{y}}{y-z}\)

    +
    +
    +
    +\$[[a,b\],[c,d\]\]((n),(k))\$ +
    +
    description list test
    @@ -701,7 +715,7 @@ printers
    -

    Lets go back to the list tests or to the tables

    +

    Lets go back to the [list tests] or to the tables

    gittea absolute link

    @@ -893,5 +907,29 @@ The style can be any one of the admonition labels:

    + + \ No newline at end of file diff --git a/tests/test.sh b/tests/test.sh new file mode 100644 index 0000000..f379168 --- /dev/null +++ b/tests/test.sh @@ -0,0 +1,2 @@ +rm -r result +../ASCIIsite.py --output result --exclude-file globignore test diff --git a/tests/test/dir/subdir/linked.adoc b/tests/test/dir/subdir/linked.adoc index 4225eb8..307c515 100644 --- a/tests/test/dir/subdir/linked.adoc +++ b/tests/test/dir/subdir/linked.adoc @@ -1,13 +1,26 @@ = relatively linked doc Gabe Venberg -:imagesdir: ../../images/ +:imagesdir: ../../images :reproducible: :giturl: git.venberg.xyz/Gabe/adocStaticSiteGen [#test-pattern] .Technical Difficulties [link={giturl}] -image::test_patern.jpg[Stand By] +image::test_pattern.svg[Stand By] + +[quote, Lawrence Lessig, May the Source Be With You] +While the creative works from the 16th century can still be accessed and used by others, the data in some software programs from the 1990s is already inaccessible. Once a company that produces a certain product goes out of business, it has no simple way to uncover how its product encoded data. The code is thus lost, and the software is inaccessible. Knowledge has been destroyed. + +[verse, J.R.R. Tolkien, The Fellowship of the Ring] +Three Rings for the Elven-kings under the sky, +Seven for the dwarf-lords in their halls of stone, +Nine for Mortal Men doomed to die, +One for the Dark Lord on his dark throne, +In the Land of Mordor where the Shadows lie. +One Ring to rule them all, One Ring to find them, +One Ring to bring them all and in the darkness bind them +In the Land of Mordor where the Shadows lie. https://git.venberg.xyz/Gabe/adocStaticSiteGen diff --git a/tests/test/landing_page.adoc b/tests/test/landing_page.adoc index ea59699..ea08317 100644 --- a/tests/test/landing_page.adoc +++ b/tests/test/landing_page.adoc @@ -6,6 +6,7 @@ Gabe Venberg :giturl: https://git.venberg.xyz/Gabe/adocStaticSiteGen :toc: :icons: font +:stem: latexmath :includedir: include/ @@ -48,6 +49,9 @@ _*italic bold test*_ -> => <- <= +==colapsable block +[%collapsible] +==== == list tests .unordered list test @@ -85,6 +89,15 @@ _*italic bold test*_ ** adipiscing ** elit +==== + +.math test +stem:[\frac{\frac{1}{x}+\frac{1}{y}}{y-z}] +[asciimath] +++++ +[[a,b\],[c,d\]\]((n),(k)) +++++ + .description list test [horizontal] test:: to make sure software works correctly From 8972e43113700c6c6c912f2d2bda672f5b303a4b Mon Sep 17 00:00:00 2001 From: gabe Date: Sun, 9 Jan 2022 22:52:10 -0600 Subject: [PATCH 10/14] allowed setting the log level via command line. --- ASCIIsite.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ASCIIsite.py b/ASCIIsite.py index be356fb..3277b64 100755 --- a/ASCIIsite.py +++ b/ASCIIsite.py @@ -14,8 +14,14 @@ def parse_arguments(): parser.add_argument('--exclude-file', type=Path, help='A text file containing glob patterns to exclude, 1 per line.') parser.add_argument('--exclude', nargs='+', help='A list of glob patterns to ignore. Remember to quote them so your shell doesnt escape them!') parser.add_argument('-z', '--compress', action='store_true', help='whether to compress the resulting directory to a tar.gz file. can be usefull for scripting to transfer the site to a remote server.') + parser.add_argument('-v', '--verbose', action='store_true', help='outputs debug messages onto the console.') args=parser.parse_args() + #setting log level + if args.verbose: + logging.info('setting log level to verbose') + logging.getLogger().setLevel(level=logging.DEBUG) + #set compress flag if args.output != None and not args.compress: #detect based on whether outFile has a .tar.gz filename. From 80d510a282b66366b56e73f95a7244f7e15f86d3 Mon Sep 17 00:00:00 2001 From: gabe Date: Sun, 9 Jan 2022 22:52:39 -0600 Subject: [PATCH 11/14] made auto-tester script. tests against a known compiled file. --- .gitignore | 2 + tests/control/dir/collatz.py | 16 + tests/control/dir/subdir/linked.html | 496 +++++ tests/control/images/test_pattern.svg | 2495 +++++++++++++++++++++++++ tests/control/landing_page.html | 935 +++++++++ tests/test.sh | 15 +- 6 files changed, 3958 insertions(+), 1 deletion(-) create mode 100755 tests/control/dir/collatz.py create mode 100644 tests/control/dir/subdir/linked.html create mode 100644 tests/control/images/test_pattern.svg create mode 100644 tests/control/landing_page.html diff --git a/.gitignore b/.gitignore index eb0a0b1..d793de9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +#test result +result/* #vim session files *.vims diff --git a/tests/control/dir/collatz.py b/tests/control/dir/collatz.py new file mode 100755 index 0000000..073528a --- /dev/null +++ b/tests/control/dir/collatz.py @@ -0,0 +1,16 @@ + +def nextInSequence(number): + if isinstance(number, int): + if number % 2 == 0: + return number // 2 + else: + return 3*number+1 + else: + raise TypeError('input must be int!') + +def seqenceLength(number): + length = 0 + while number != 1: + number = nextInSequence(number) + length += 1 + return length diff --git a/tests/control/dir/subdir/linked.html b/tests/control/dir/subdir/linked.html new file mode 100644 index 0000000..1a4a433 --- /dev/null +++ b/tests/control/dir/subdir/linked.html @@ -0,0 +1,496 @@ + + + + + + + + +relatively linked doc + + + + + +
    +
    +
    +Stand By +
    +
    Figure 1. Technical Difficulties
    +
    +
    +
    +While the creative works from the 16th century can still be accessed and used by others, the data in some software programs from the 1990s is already inaccessible. Once a company that produces a certain product goes out of business, it has no simple way to uncover how its product encoded data. The code is thus lost, and the software is inaccessible. Knowledge has been destroyed. +
    +
    +— Lawrence Lessig
    +May the Source Be With You +
    +
    +
    +
    Three Rings for the Elven-kings under the sky,
    +Seven for the dwarf-lords in their halls of stone,
    +Nine for Mortal Men doomed to die,
    +One for the Dark Lord on his dark throne,
    +In the Land of Mordor where the Shadows lie.
    +One Ring to rule them all, One Ring to find them,
    +One Ring to bring them all and in the darkness bind them
    +In the Land of Mordor where the Shadows lie.
    +
    +— J.R.R. Tolkien
    +The Fellowship of the Ring +
    +
    + +
    +
    A mechanical marvel
    +
    + +
    +
    + +
    + + + \ No newline at end of file diff --git a/tests/control/images/test_pattern.svg b/tests/control/images/test_pattern.svg new file mode 100644 index 0000000..7e86992 --- /dev/null +++ b/tests/control/images/test_pattern.svg @@ -0,0 +1,2495 @@ + + + + + + + + image/svg+xml + + Carta de Ajuste + 11/JUN/08 + + + EBNZ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/control/landing_page.html b/tests/control/landing_page.html new file mode 100644 index 0000000..3aaf826 --- /dev/null +++ b/tests/control/landing_page.html @@ -0,0 +1,935 @@ + + + + + + + + +test page for an adoc static site generator. + + + + + + +
    +
    +
    +
    +
    + + + + +
    + + +Test the links in this page! +
    +
    +
    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Phasellus mi tellus, suscipit in dolor nec, faucibus aliquam nulla. +Mauris gravida, felis commodo molestie tincidunt, sem erat varius lorem, nec lobortis eros sem ut augue. +Donec suscipit tristique imperdiet. +Sed maximus est ultrices urna imperdiet, vitae facilisis eros posuere. +Quisque a mollis mauris. +Pellentesque fermentum, libero sed sollicitudin interdum, dolor nunc euismod purus, et laoreet tellus augue vitae turpis. +Pellentesque condimentum elit quis semper tincidunt. +Nullam consectetur euismod accumsan. +In dictum nibh ut iaculis euismod. +Phasellus ut nibh non ipsum volutpat cursus. +Sed eleifend, enim vitae ultrices auctor, dolor ipsum molestie dui, id dignissim massa neque a mauris.

    +
    +
+ +
+

inline formatting tests

+
+
+

bold test

+
+
+

italics test

+
+
+

'monospace test'

+
+
+

'monospace bold test'

+
+
+

'monospace italic test'

+
+
+

*italic bold test*

+
+
+

'all three test'

+
+
+

*escaped bold test*

+
+
+

underline test using html passthrough test

+
+
+

*escaped bold test with plus*

+
+
+

→ ⇒ ← ⇐

+
+
+

==colapsable block

+
+
+Details +
+
+

== list tests

+
+
+
unordered list test
+
    +
  • +

    Lorum

    +
  • +
  • +

    ipsum

    +
    +
      +
    • +

      dolor

      +
    • +
    • +

      sit

      +
      +
        +
      • +

        amet

        +
      • +
      +
      +
    • +
    • +

      consectetur

      +
    • +
    +
    +
  • +
+
+
+
ordered list test.
+
    +
  1. +

    Lorum

    +
  2. +
  3. +

    ipsum

    +
    +
      +
    1. +

      dolor

      +
    2. +
    3. +

      sit

      +
      +
        +
      1. +

        amet

        +
      2. +
      +
      +
    4. +
    5. +

      consectetur

      +
    6. +
    +
    +
  4. +
+
+
+
reversed ordered list test.
+
    +
  1. +

    Lorum

    +
  2. +
  3. +

    ipsum

    +
    +
      +
    1. +

      dolor

      +
    2. +
    3. +

      sit

      +
      +
        +
      1. +

        amet

        +
      2. +
      +
      +
    4. +
    5. +

      consectetur

      +
    6. +
    +
    +
  4. +
+
+
+
mixed list
+
    +
  1. +

    Lorum

    +
  2. +
  3. +

    ipsum

    +
    +
      +
    • +

      dolor

      +
    • +
    • +

      sit

      +
      +
        +
      • +

        amet

        +
      • +
      +
      +
    • +
    +
    +
  4. +
  5. +

    consectetur

    +
    +
      +
    • +

      adipiscing

      +
    • +
    • +

      elit

      +
    • +
    +
    +
  6. +
+
+
+
+
+
math test
+

\(\frac{\frac{1}{x}+\frac{1}{y}}{y-z}\)

+
+
+
+\$[[a,b\],[c,d\]\]((n),(k))\$ +
+
+
+
description list test
+ + + + + + + + + + + + + +
+test + +

to make sure software works correctly

+
+git + +

a gift from the machine spirits

+
+printers + +

the greatest evil to ever befall IT.

+
+
+
+
+
+ +
+
+

Lets go back to the [list tests] or to the tables

+
+ +
+
+Stand By +
+
Figure 1. Technical Difficulties
+
+
+

link!

+
+
+

xref!

+
+
+
Source code test
+
+
def nextInSequence(number):
+    if isinstance(number, int):
+        if number % 2 == 0:
+            return number // 2
+        else:
+            return 3*number+1
+    else:
+        raise TypeError('input must be int!')
+
+def seqenceLength(number):
+    length = 0
+    while number != 1:
+        number = nextInSequence(number)
+        length += 1
+    return length
+
+
+
+
+
+

tables test

+
+ +++++ + + + + + + + + + + + + + + + + + + + +
NameGroupDescription

Firefox

Web Browser

+

Mozilla Firefox is an open-source web browser. +It’s designed for:

+
+
+
    +
  • +

    standards compliance,

    +
  • +
  • +

    performance and

    +
  • +
  • +

    portability.

    +
  • +
+

Ruby

Programming Language

A programmer’s best friend.

+
+
+
+

included section

+
+
+

Fusce maximus nec magna eu ultricies. +Fusce quis tellus vitae arcu facilisis lobortis. +Donec id erat at enim porta placerat in vitae sapien. +Duis justo arcu, hendrerit nec nulla eu, dictum dapibus ipsum. +Sed fermentum id elit eget fringilla. +Suspendisse volutpat imperdiet justo, ut efficitur odio maximus et. +Nunc interdum sollicitudin eros sit amet convallis. +Praesent volutpat tempus metus id tincidunt. +Proin aliquet justo a fermentum consectetur. +Nunc scelerisque, nisi id scelerisque dictum, nibh lectus ultrices nunc, quis ultricies erat velit sit amet urna. +Maecenas orci felis, volutpat at bibendum ut, mattis eu justo.

+
+
+

blocks

+
+
listing block
+
+
example of _listing block_
+with verbatim line break
+
+
+
+
Example 1. example block
+
+
+

example block +with line break

+
+
+
+
+
literal block
+
+
_literal_ block
+with line break
+
+
+pass block +with underlined text +
+
quote block
+
+
+

quote block +with line break

+
+
+
+
+
+
sidebar block
+
+

sidebar block +with line break

+
+
+
+
+ + + + + +
+ + +
+

This is an example of an admonition block.

+
+
+

Unlike an admonition paragraph, it may contain any AsciiDoc content. +The style can be any one of the admonition labels:

+
+
+
    +
  • +

    NOTE

    +
  • +
  • +

    TIP

    +
  • +
  • +

    WARNING

    +
  • +
  • +

    CAUTION

    +
  • +
  • +

    IMPORTANT

    +
  • +
+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/tests/test.sh b/tests/test.sh index f379168..f704c8a 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -1,2 +1,15 @@ rm -r result -../ASCIIsite.py --output result --exclude-file globignore test +../ASCIIsite.py --verbose --output result --exclude-file globignore test +#find the sha1sum of the output +cd result +result=$(find . -type f -print0 | xargs -0 -P0 -n1 md5sum | sort -k 2 | md5sum) +cd ../control +control=$(find . -type f -print0 | xargs -0 -P0 -n1 md5sum | sort -k 2 | md5sum) +cd ../ +echo result sum is $result +echo control sum is $control +if [ "$result" = "$control" ]; then + echo test passed! +else + echo test did not pass!!!!! +fi From 817953c6f1fe07857e3684008b35ed09053f4771 Mon Sep 17 00:00:00 2001 From: gabe Date: Mon, 10 Jan 2022 00:45:51 -0600 Subject: [PATCH 12/14] split stylesheet into seperate file. Instead of being embedded in every document, the stylesheet is now copied to a single directory at the top of the website directory structure. Also reused that code to automatically set the imagesdir attribute. fixes #5 --- ASCIIsite.py | 30 +- tests/control/css/asciidoctor.css | 427 ++++++++++++++++++++++++++ tests/control/dir/subdir/linked.html | 430 +-------------------------- tests/control/landing_page.html | 430 +-------------------------- tests/result/css/asciidoctor.css | 427 ++++++++++++++++++++++++++ tests/result/dir/subdir/linked.html | 430 +-------------------------- tests/result/landing_page.html | 430 +-------------------------- tests/test.sh | 1 + tests/test/dir/subdir/linked.adoc | 1 - tests/test/landing_page.adoc | 1 - 10 files changed, 882 insertions(+), 1725 deletions(-) create mode 100644 tests/control/css/asciidoctor.css create mode 100644 tests/result/css/asciidoctor.css diff --git a/ASCIIsite.py b/ASCIIsite.py index 3277b64..9860f1d 100755 --- a/ASCIIsite.py +++ b/ASCIIsite.py @@ -51,15 +51,13 @@ def parse_arguments(): logging.info(f'outputting to {outFile.resolve()}') logging.debug(f'compress is {compress}') - try: + exclude=[] + if args.exclude_file != None: with open(args.exclude_file, 'r') as file: exclude=[glob.strip() for glob in file] - if args.exclude != None: - exclude.extend(args.exclude) - except Exception as e: - print(str(e)) - exit() + if args.exclude != None: + exclude.extend(args.exclude) if not args.inputDir.resolve().exists(): print(f'Inputdir {args.inputDir.resolve()} does not exist!') @@ -97,13 +95,31 @@ class TmpDir: def find_paths_to_convert(fileNameGlob): return glob.glob(f'**/{fileNameGlob}', recursive=True) +#finds the depth of a file relative to given directory +def find_relative_file_depth (subfile, parentDir): + subfile=Path(subfile).resolve() + parentDir=Path(parentDir).resolve() + return len(subfile.parts)-len(parentDir.parts)-1 + #simple wrapper around the asciidoctor cli. def convert_file(inDir, outDir, inFile): + #in order for the stylesdir and imagesdir to be linked to correctly, we need to know the relative depth between the two directories. + depth=find_relative_file_depth(inFile, inDir) + logging.info(f'converting {Path(inFile).resolve()}') - logging.debug(f'converting {inFile} from directory {inDir} to directory {outDir}') + logging.debug(f'converting {inFile} from directory {inDir} to directory {outDir} with a relative depth of {depth}') + + depthstring= '../'*depth + try: #the destdir can be used instead of destfile in order to preserve the directory structure relative to the base dir. really useful. subprocess.run(['asciidoctor', + #makes the stylesheet linked, but still includes it in the output. + '--attribute=linkcss', + '--attribute=copycss', + f'--attribute=stylesdir={depthstring}css', + #set imagesdir + f'--attribute=imagesdir={depthstring}images', #specifies the source directory root. f'--source-dir={inDir}', #Destination dir. It takes the file from the subtree --source-dir and puts it in the equivilant location in the subtree --destination-dir. (talking about filesystem subtrees). diff --git a/tests/control/css/asciidoctor.css b/tests/control/css/asciidoctor.css new file mode 100644 index 0000000..d6d02fb --- /dev/null +++ b/tests/control/css/asciidoctor.css @@ -0,0 +1,427 @@ +/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ +/* Uncomment the following line when using as a custom stylesheet */ +/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */ +html{font-family:sans-serif;-webkit-text-size-adjust:100%} +a{background:none} +a:focus{outline:thin dotted} +a:active,a:hover{outline:0} +h1{font-size:2em;margin:.67em 0} +b,strong{font-weight:bold} +abbr{font-size:.9em} +abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none} +dfn{font-style:italic} +hr{height:0} +mark{background:#ff0;color:#000} +code,kbd,pre,samp{font-family:monospace;font-size:1em} +pre{white-space:pre-wrap} +q{quotes:"\201C" "\201D" "\2018" "\2019"} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sup{top:-.5em} +sub{bottom:-.25em} +img{border:0} +svg:not(:root){overflow:hidden} +figure{margin:0} +audio,video{display:inline-block} +audio:not([controls]){display:none;height:0} +fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} +legend{border:0;padding:0} +button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} +button,input{line-height:normal} +button,select{text-transform:none} +button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer} +button[disabled],html input[disabled]{cursor:default} +input[type=checkbox],input[type=radio]{padding:0} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} +textarea{overflow:auto;vertical-align:top} +table{border-collapse:collapse;border-spacing:0} +*,::before,::after{box-sizing:border-box} +html,body{font-size:100%} +body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} +a:hover{cursor:pointer} +img,object,embed{max-width:100%;height:auto} +object,embed{height:100%} +img{-ms-interpolation-mode:bicubic} +.left{float:left!important} +.right{float:right!important} +.text-left{text-align:left!important} +.text-right{text-align:right!important} +.text-center{text-align:center!important} +.text-justify{text-align:justify!important} +.hide{display:none} +img,object,svg{display:inline-block;vertical-align:middle} +textarea{height:auto;min-height:50px} +select{width:100%} +.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} +div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0} +a{color:#2156a5;text-decoration:underline;line-height:inherit} +a:hover,a:focus{color:#1d4b8f} +a img{border:0} +p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} +p aside{font-size:.875em;line-height:1.35;font-style:italic} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} +h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} +h1{font-size:2.125em} +h2{font-size:1.6875em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} +h4,h5{font-size:1.125em} +h6{font-size:1em} +hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em} +em,i{font-style:italic;line-height:inherit} +strong,b{font-weight:bold;line-height:inherit} +small{font-size:60%;line-height:inherit} +code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} +ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} +ul,ol{margin-left:1.5em} +ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0} +ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} +ul.square{list-style-type:square} +ul.circle{list-style-type:circle} +ul.disc{list-style-type:disc} +ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} +dl dt{margin-bottom:.3125em;font-weight:bold} +dl dd{margin-bottom:1.25em} +blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} +blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} +@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} +h1{font-size:2.75em} +h2{font-size:2.3125em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} +h4{font-size:1.4375em}} +table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal} +table thead,table tfoot{background:#f7f8f7} +table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} +table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} +table tr.even,table tr.alt{background:#f8f8f7} +table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} +h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} +.center{margin-left:auto;margin-right:auto} +.stretch{width:100%} +.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} +.clearfix::after,.float-group::after{clear:both} +:not(pre).nobreak{word-wrap:normal} +:not(pre).nowrap{white-space:nowrap} +:not(pre).pre-wrap{white-space:pre-wrap} +:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed} +pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} +pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} +pre>code{display:block} +pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} +em em{font-style:normal} +strong strong{font-weight:400} +.keyseq{color:rgba(51,51,51,.8)} +kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} +.keyseq kbd:first-child{margin-left:0} +.keyseq kbd:last-child{margin-right:0} +.menuseq,.menuref{color:#000} +.menuseq b:not(.caret),.menuref{font-weight:inherit} +.menuseq{word-spacing:-.02em} +.menuseq b.caret{font-size:1.25em;line-height:.8} +.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} +b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} +b.button::before{content:"[";padding:0 3px 0 2px} +b.button::after{content:"]";padding:0 2px 0 3px} +p a>code:hover{color:rgba(0,0,0,.9)} +#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} +#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} +#header::after,#content::after,#footnotes::after,#footer::after{clear:both} +#content{margin-top:1.25em} +#content::before{content:none} +#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} +#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} +#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} +#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap} +#header .details span:first-child{margin-left:-.125em} +#header .details span.email a{color:rgba(0,0,0,.85)} +#header .details br{display:none} +#header .details br+span::before{content:"\00a0\2013\00a0"} +#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} +#header .details br+span#revremark::before{content:"\00a0|\00a0"} +#header #revnumber{text-transform:capitalize} +#header #revnumber::after{content:"\00a0"} +#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} +#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} +#toc>ul{margin-left:.125em} +#toc ul.sectlevel0>li>a{font-style:italic} +#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} +#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} +#toc li{line-height:1.3334;margin-top:.3334em} +#toc a{text-decoration:none} +#toc a:active{text-decoration:underline} +#toctitle{color:#7a2518;font-size:1.2em} +@media screen and (min-width:768px){#toctitle{font-size:1.375em} +body.toc2{padding-left:15em;padding-right:0} +#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} +#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} +#toc.toc2>ul{font-size:.9em;margin-bottom:0} +#toc.toc2 ul ul{margin-left:0;padding-left:1em} +#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} +body.toc2.toc-right{padding-left:0;padding-right:15em} +body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} +@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} +#toc.toc2{width:20em} +#toc.toc2 #toctitle{font-size:1.375em} +#toc.toc2>ul{font-size:.95em} +#toc.toc2 ul ul{padding-left:1.25em} +body.toc2.toc-right{padding-left:0;padding-right:20em}} +#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px} +#content #toc>:first-child{margin-top:0} +#content #toc>:last-child{margin-bottom:0} +#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em} +#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44} +#content{margin-bottom:.625em} +.sect1{padding-bottom:.625em} +@media screen and (min-width:768px){#content{margin-bottom:1.25em} +.sect1{padding-bottom:1.25em}} +.sect1:last-child{padding-bottom:0} +.sect1+.sect1{border-top:1px solid #e7e7e9} +#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} +#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} +#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} +#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} +#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} +details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} +details{margin-left:1.25rem} +details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;-webkit-tap-highlight-color:transparent} +details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)} +details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)} +details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem} +.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} +table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} +.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} +.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} +.admonitionblock>table td.icon{text-align:center;width:80px} +.admonitionblock>table td.icon img{max-width:none} +.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} +.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere} +.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} +.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px} +.exampleblock>.content>:first-child{margin-top:0} +.exampleblock>.content>:last-child{margin-bottom:0} +.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px} +.sidebarblock>:first-child{margin-top:0} +.sidebarblock>:last-child{margin-bottom:0} +.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} +.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} +.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em} +@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} +@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} +.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} +.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} +.listingblock>.content{position:relative} +.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} +.listingblock:hover code[data-lang]::before{display:block} +.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} +.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} +.listingblock pre.highlightjs{padding:0} +.listingblock pre.highlightjs>code{padding:1em;border-radius:4px} +.listingblock pre.prettyprint{border-width:0} +.prettyprint{background:#f7f7f8} +pre.prettyprint .linenums{line-height:1.45;margin-left:2em} +pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} +pre.prettyprint li code[data-lang]::before{opacity:1} +pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} +table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} +table.linenotable td.code{padding-left:.75em} +table.linenotable td.linenos{border-right:1px solid;opacity:.35;padding-right:.5em} +pre.pygments .lineno{border-right:1px solid;opacity:.35;display:inline-block;margin-right:.75em} +pre.pygments .lineno::before{content:"";margin-right:-.125em} +.quoteblock{margin:0 1em 1.25em 1.5em;display:table} +.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} +.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} +.quoteblock blockquote{margin:0;padding:0;border:0} +.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} +.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} +.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} +.verseblock{margin:0 1em 1.25em} +.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} +.verseblock pre strong{font-weight:400} +.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} +.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} +.quoteblock .attribution br,.verseblock .attribution br{display:none} +.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} +.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} +.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} +.quoteblock.abstract{margin:0 1em 1.25em;display:block} +.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} +.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} +.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} +.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} +.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0} +p.tableblock:last-child{margin-bottom:0} +td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere} +td.tableblock>.content>:last-child{margin-bottom:-1.25em} +table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} +table.grid-all>*>tr>*{border-width:1px} +table.grid-cols>*>tr>*{border-width:0 1px} +table.grid-rows>*>tr>*{border-width:1px 0} +table.frame-all{border-width:1px} +table.frame-ends{border-width:1px 0} +table.frame-sides{border-width:0 1px} +table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0} +table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0} +table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0} +table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0} +table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} +th.halign-left,td.halign-left{text-align:left} +th.halign-right,td.halign-right{text-align:right} +th.halign-center,td.halign-center{text-align:center} +th.valign-top,td.valign-top{vertical-align:top} +th.valign-bottom,td.valign-bottom{vertical-align:bottom} +th.valign-middle,td.valign-middle{vertical-align:middle} +table thead th,table tfoot th{font-weight:bold} +tbody tr th{background:#f7f8f7} +tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} +p.tableblock>code:only-child{background:none;padding:0} +p.tableblock{font-size:1em} +ol{margin-left:1.75em} +ul li ol{margin-left:1.5em} +dl dd{margin-left:1.125em} +dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} +ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} +ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} +ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} +ul.unstyled,ol.unstyled{margin-left:0} +ul.checklist>li>p:first-child{margin-left:-1em} +ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} +ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em} +ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} +ul.inline>li{margin-left:1.25em} +.unstyled dl dt{font-weight:400;font-style:normal} +ol.arabic{list-style-type:decimal} +ol.decimal{list-style-type:decimal-leading-zero} +ol.loweralpha{list-style-type:lower-alpha} +ol.upperalpha{list-style-type:upper-alpha} +ol.lowerroman{list-style-type:lower-roman} +ol.upperroman{list-style-type:upper-roman} +ol.lowergreek{list-style-type:lower-greek} +.hdlist>table,.colist>table{border:0;background:none} +.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} +td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} +td.hdlist1{font-weight:bold;padding-bottom:1.25em} +td.hdlist2{word-wrap:anywhere} +.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} +.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} +.colist td:not([class]):first-child img{max-width:none} +.colist td:not([class]):last-child{padding:.25em 0} +.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd} +.imageblock.left{margin:.25em .625em 1.25em 0} +.imageblock.right{margin:.25em 0 1.25em .625em} +.imageblock>.title{margin-bottom:0} +.imageblock.thumb,.imageblock.th{border-width:6px} +.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} +.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} +.image.left{margin-right:.625em} +.image.right{margin-left:.625em} +a.image{text-decoration:none;display:inline-block} +a.image object{pointer-events:none} +sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} +sup.footnote a,sup.footnoteref a{text-decoration:none} +sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} +#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} +#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} +#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} +#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} +#footnotes .footnote:last-of-type{margin-bottom:0} +#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} +.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} +.gist .file-data>table td.line-data{width:99%} +div.unbreakable{page-break-inside:avoid} +.big{font-size:larger} +.small{font-size:smaller} +.underline{text-decoration:underline} +.overline{text-decoration:overline} +.line-through{text-decoration:line-through} +.aqua{color:#00bfbf} +.aqua-background{background:#00fafa} +.black{color:#000} +.black-background{background:#000} +.blue{color:#0000bf} +.blue-background{background:#0000fa} +.fuchsia{color:#bf00bf} +.fuchsia-background{background:#fa00fa} +.gray{color:#606060} +.gray-background{background:#7d7d7d} +.green{color:#006000} +.green-background{background:#007d00} +.lime{color:#00bf00} +.lime-background{background:#00fa00} +.maroon{color:#600000} +.maroon-background{background:#7d0000} +.navy{color:#000060} +.navy-background{background:#00007d} +.olive{color:#606000} +.olive-background{background:#7d7d00} +.purple{color:#600060} +.purple-background{background:#7d007d} +.red{color:#bf0000} +.red-background{background:#fa0000} +.silver{color:#909090} +.silver-background{background:#bcbcbc} +.teal{color:#006060} +.teal-background{background:#007d7d} +.white{color:#bfbfbf} +.white-background{background:#fafafa} +.yellow{color:#bfbf00} +.yellow-background{background:#fafa00} +span.icon>.fa{cursor:default} +a span.icon>.fa{cursor:inherit} +.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} +.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} +.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} +.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} +.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} +.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} +.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} +.conum[data-value] *{color:#fff!important} +.conum[data-value]+b{display:none} +.conum[data-value]::after{content:attr(data-value)} +pre .conum[data-value]{position:relative;top:-.125em} +b.conum *{color:inherit!important} +.conum:not([data-value]):empty{display:none} +dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} +h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em} +p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} +p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem} +p{margin-bottom:1.25rem} +.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} +.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc} +.print-only{display:none!important} +@page{margin:1.25cm .75cm} +@media print{*{box-shadow:none!important;text-shadow:none!important} +html{font-size:80%} +a{color:inherit!important;text-decoration:underline!important} +a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} +a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} +abbr[title]{border-bottom:1px dotted} +abbr[title]::after{content:" (" attr(title) ")"} +pre,blockquote,tr,img,object,svg{page-break-inside:avoid} +thead{display:table-header-group} +svg{max-width:100%} +p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} +h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} +#header,#content,#footnotes,#footer{max-width:none} +#toc,.sidebarblock,.exampleblock>.content{background:none!important} +#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} +body.book #header{text-align:center} +body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} +body.book #header .details{border:0!important;display:block;padding:0!important} +body.book #header .details span:first-child{margin-left:0!important} +body.book #header .details br{display:block} +body.book #header .details br+span::before{content:none!important} +body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} +body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} +.listingblock code[data-lang]::before{display:block} +#footer{padding:0 .9375em} +.hide-on-print{display:none!important} +.print-only{display:block!important} +.hide-for-print{display:none!important} +.show-for-print{display:inherit!important}} +@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem} +.sect1{padding:0!important} +.sect1+.sect1{border:0} +#footer{background:none} +#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} +@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} \ No newline at end of file diff --git a/tests/control/dir/subdir/linked.html b/tests/control/dir/subdir/linked.html index 1a4a433..cf08c73 100644 --- a/tests/control/dir/subdir/linked.html +++ b/tests/control/dir/subdir/linked.html @@ -8,435 +8,7 @@ relatively linked doc - +