! Copyright (C) 2008, 2011 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays ascii assocs combinators.short-circuit
-debugger formatting help help.home help.topics help.vocabs html
-html.streams io.directories io.encodings.ascii
-io.encodings.binary io.encodings.utf8 io.files io.files.temp
-io.pathnames kernel make math math.parser namespaces regexp
-sequences sequences.deep serialize sorting splitting system
-tools.completion vocabs vocabs.hierarchy words xml.data
-xml.syntax xml.traversal xml.writer ;
+USING: accessors arrays ascii assocs colors
+combinators.short-circuit debugger formatting help help.home
+help.topics help.vocabs html html.streams io.directories
+io.encodings.ascii io.encodings.binary io.encodings.utf8
+io.files io.files.temp io.pathnames kernel make math math.parser
+namespaces regexp sequences sequences.deep serialize sets
+sorting splitting strings system tools.completion vocabs
+vocabs.hierarchy words xml.data xml.syntax xml.traversal
+xml.writer ;
FROM: io.encodings.ascii => ascii ;
FROM: ascii => ascii? ;
IN: help.html
swap "\n" glue [XML <style><-></style> XML] ;
: help-meta ( -- xml )
- [XML <meta
+ [XML
+ <meta
name="viewport"
content="width=device-width, initial-scale=1"
charset="utf-8"
- /> XML] ;
+ />
+ <meta
+ name="theme-color"
+ content="#f5f5f5"
+ media="(prefers-color-scheme: light)"
+ />
+ <meta
+ name="theme-color"
+ content="#373e48"
+ media="(prefers-color-scheme: dark)"
+ />
+ XML] ;
+
+: help-script ( -- xml )
+ [XML
+ <script type="text/javascript">
+ document.addEventListener('keydown', function (event) {
+ if (event.code == 'Slash') {
+ let input = document.getElementById('search');
+ if (input !== document.activeElement) {
+ setTimeout(function() {
+ input.focus().select()
+ }, 0);
+ }
+ }
+ });
+ </script>
+ XML] ;
+
+: help-header ( stylesheet -- xml )
+ help-stylesheet help-meta swap help-script 3append ;
-: help-navbar ( -- xml )
+: help-nav ( -- xml )
"conventions" >link topic>filename
[XML
- <div class="navbar">
- <div class="navrow">
- <a href="https://factorcode.org">
- <img src="favicon.ico" width="24" height="24" />
- </a>
- <a href="/">Handbook</a>
- <a href=<->>Glossary</a>
- <form method="get" action="/search" style="float: right;">
- <input placeholder="Search" name="search" type="text"/>
- <input type="submit" value="Go"/>
- </form>
- </div>
- </div>
+ <nav>
+ <form method="get" action="/search" style="float: right;">
+ <input placeholder="Search" id="search" name="search" type="text" tabindex="1" />
+ <input type="submit" value="Go" tabindex="1" />
+ </form>
+ <a href="https://factorcode.org">
+ <img src="favicon.ico" width="24" height="24" />
+ </a>
+ <a href="/">Handbook</a>
+ <a href=<->>Glossary</a>
+ </nav>
XML] ;
: help-footer ( -- xml )
version-info "\n" split1 drop
[XML
- <div class="footer">
+ <footer>
<p>
This documentation was generated offline from a
<code>load-all</code> image. If you want, you can also
for more information.
</p>
<p><-></p>
- </div>
+ </footer>
XML] ;
: bijective-base26 ( n -- name )
R/ font-family: monospace;/ [
" white-space: pre-wrap; line-height: 125%;" append
- ] re-replace-with ;
+ ] re-replace-with
+
+ dup { "font-family: monospace;" "background-color:" } [ subseq-of? ] with all? [
+ " margin: 10px 0px;" append
+ ] when
+
+ dup { "border:" "background-color:" } [ subseq-of? ] with all? [
+ " border-radius: 5px;" append
+ ] when ;
: fix-help-header ( classes -- classes )
dup [
- [ ".a" head? ] [ "#f4efd9;" swap subseq? ] bi and
+ [ ".a" head? ] [ "#f4efd9;" subseq-of? ] bi and
] find [
"padding: 10px;" "padding: 0px;" replace
"background-color: #f4efd9;" "background-color: white;" replace
"}" ?tail drop
- " border-bottom: 1px dashed #ccc; width: 100%; padding-top: 15px; padding-bottom: 10px; }"
+ " border-bottom: 1px dashed #d5d5d5 width: 100%; padding-top: 15px; padding-bottom: 10px; }"
append swap pick set-nth {
".a a { color: black; font-size: 24pt; line-height: 100%; }"
- ".a * a { color: #2A5DB0; font-size: 12pt; }"
+ ".a * a { color: #2a5db0; font-size: 12pt; }"
".a td { border: none; }"
".a tr:hover { background-color: white; }"
} prepend
] [ drop ] if* ;
+: dark-mode-css ( classes -- classes' )
+ { "" "/* Dark mode */" "@media (prefers-color-scheme:dark) {" }
+ swap [
+ R/ {[^}]+}/ [
+ "{" ?head drop "}" ?tail drop ";" split
+ [ [ blank? ] trim ] map harvest [ ";" append ] map
+ [ R/ (#[0-9a-fA-F]+|white|black);/ re-contains? ] filter
+ [
+ R/ (#[0-9a-fA-F]+|white|black);/ [
+ >string H{
+ { "#000000;" "#bdc1c6;" }
+ { "#2a5db0;" "#8ab4f8;" }
+ { "#333333;" "#d5d5d5;" }
+ { "#373e48;" "#ffffff;" }
+ { "#8b4500;" "orange;" }
+ { "#e3e2db;" "#444444;" }
+ { "white;" "#202124;" }
+ { "black;" "white;" }
+ } ?at [
+ but-last parse-color inverse-color color>hex ";" append
+ ] unless
+ ] re-replace-with
+ ] map " " join "{ " " }" surround
+ ] re-replace-with " " prepend
+ dup "{ }" subseq-of? [ drop f ] when
+ ] map harvest append "}" suffix ;
+
: css-classes ( classes -- stylesheet )
[
[ fix-css-style " { " "}" surround ] [ "." prepend ] bi* prepend
- ] { } assoc>map fix-help-header join-lines ;
+ ] { } assoc>map fix-help-header dup dark-mode-css append join-lines ;
:: css-styles-to-classes ( body -- stylesheet body )
H{ } clone :> classes
] each classes sort-values css-classes body ;
: retina-image ( path -- path' )
- "@2x" over subseq? [ "." split1-last "@2x." glue ] unless ;
+ dup "@2x" subseq-of? [ "." split1-last "@2x." glue ] unless ;
: ?copy-file ( from to -- )
dup file-exists? [ 2drop ] [ copy-file ] if ;
[ print-topic ] with-html-writer
css-styles-to-classes cache-images
"resource:extra/websites/factorcode/favicon.ico" dup file-name ?copy-file
- [ help-stylesheet help-meta prepend help-navbar ] dip help-footer
+ [ help-header help-nav ] dip help-footer
[XML <-><div class="page"><-><-></div> XML]
] bi simple-page ;
: article-apropos ( string -- results )
"articles.idx" offline-apropos ;
-: word-apropos ( string -- results )
- "words.idx" offline-apropos ;
-
: vocab-apropos ( string -- results )
"vocabs.idx" offline-apropos ;
+
+: generate-qualified-index ( index -- )
+ H{ } clone [
+ '[
+ over "," split1 nip ".html" ?tail drop
+ [ swap ":" glue 2array ] [ _ push-at ] bi
+ ] assoc-each
+ ] keep [ swap ] { } assoc-map-as
+ "qualified.idx" binary [ serialize ] with-file-writer ;
+
+: qualified-index ( str index -- str index' )
+ over ":" split1 [
+ "qualified.idx"
+ dup file-exists? [ pick generate-qualified-index ] unless
+ load-index completions keys concat
+ ] [ drop f ] if [ append ] unless-empty ;
+
+: word-apropos ( string -- results )
+ "words.idx" load-index qualified-index completions ;