Compare commits
13 Commits
d26e775764
...
a892df3389
Author | SHA1 | Date |
---|---|---|
Sean Dockray | a892df3389 | |
Sean Dockray | e4a46c5357 | |
Sean Dockray | 95b5ac6aae | |
Sean Dockray | 9f6bac915e | |
Sean Dockray | 3a3d3628c3 | |
Sean Dockray | b3ca36ac5c | |
Sean Dockray | ef75acd1b3 | |
Sean Dockray | c802904abc | |
Sean Dockray | 7cfd757a49 | |
Sean Dockray | 8312d274bb | |
Sean Dockray | 52afc04fb6 | |
Sean Dockray | c3ca25a0b6 | |
Sean Dockray | dcf4cac458 |
|
@ -1,14 +1,14 @@
|
|||
baseURL = "https://syllabus.pirate.care"
|
||||
baseURL = "http://machinelistening.thepublicschool.org"
|
||||
languageCode = "en-us"
|
||||
title = "Pirate Care"
|
||||
theme = "piratecare"
|
||||
title = "Machine Listening"
|
||||
theme = "machinelistening"
|
||||
relativeurls = true
|
||||
disableKinds = ["RSS", "sitemap", "taxonomy"]
|
||||
|
||||
[params]
|
||||
description = "Network of activists, researchers and practitioners against the criminalisation of solidarity & for a common care infrastructure."
|
||||
images = ["/images/piratecaqre.png"]
|
||||
title = "Pirate Care Syllabus"
|
||||
title = "Machine Listening Syllabus"
|
||||
giturl = "https://git.memoryoftheworld.org/PirateCare/Syllabus"
|
||||
|
||||
[outputFormats]
|
||||
|
|
|
@ -0,0 +1,267 @@
|
|||
import argparse
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import re
|
||||
import stat
|
||||
|
||||
from notion.client import NotionClient
|
||||
from notion.markdown import notion_to_markdown
|
||||
|
||||
|
||||
# Set the variables we'll be allowing for (as CL arg or environment variable)
|
||||
vars = {
|
||||
"syllabus_db": "https://www.notion.so/memoryspace/594e40c85f2844b5911f14e7db21850f?v=2a2e8a86e8a74d29844f5eef41d18b3f",
|
||||
"syllabus_title": "Pirate Care",
|
||||
"token_v2": "Find the value of 'token_v2' in your browser cookies when logged into Notion",
|
||||
"hugo_path": "hugo",
|
||||
"hugo_site_path": "/mnt/d/dev/websites/arche-syllabus-test", # The Hugo site
|
||||
"website_path": "/mnt/d/tmp/notion",
|
||||
"base_url": "http://127.0.0.1:8000"
|
||||
}
|
||||
|
||||
prefixes = {
|
||||
"header": "# ",
|
||||
"sub_header": "## ",
|
||||
"sub_sub_header": "### ",
|
||||
"bulleted_list": "+ ",
|
||||
"numbered_list": "1. ",
|
||||
"toggle": "[ ]",
|
||||
"quote": "> ",
|
||||
}
|
||||
|
||||
|
||||
def get_value(name, default=False):
|
||||
""" Variables can be set as environment variable or in command line """
|
||||
if hasattr(args, name.lower()) and getattr(args, name.lower()) is not None:
|
||||
if not name.lower() == "token_v2":
|
||||
print('CLI:', name, getattr(args, name.lower()))
|
||||
else:
|
||||
print('CLI:', name, "XXXX")
|
||||
return getattr(args, name.lower())
|
||||
elif name.upper() in os.environ:
|
||||
if not name.lower() == "token_v2":
|
||||
print('env:', name, os.environ[name.upper()])
|
||||
else:
|
||||
print('CLI:', name, "XXXX")
|
||||
return os.environ[name.upper()]
|
||||
else:
|
||||
print('default:', name, default)
|
||||
return default
|
||||
|
||||
|
||||
def rmrf(path, keep_root=False):
|
||||
""" Use safe-rm for recursive removal """
|
||||
""" @TODO: make it safer """
|
||||
def remove_readonly(func, path, excinfo):
|
||||
os.chmod(path, stat.S_IWRITE)
|
||||
func(path)
|
||||
# Try removal
|
||||
if os.path.exists(path) and len(os.path.realpath(path)) > 1:
|
||||
if os.path.isdir(path):
|
||||
if keep_root:
|
||||
for root, dirs, files in os.walk(path):
|
||||
for f in files:
|
||||
os.remove(os.path.join(root, f))
|
||||
else:
|
||||
shutil.rmtree(path, onerror=remove_readonly)
|
||||
elif os.path.isfile(path):
|
||||
os.remove(path)
|
||||
else:
|
||||
print("Either the path doesn't exist or you are trying to delete the root directory(?!):", path)
|
||||
|
||||
|
||||
def cmd(parts, cwd=None, env=None):
|
||||
""" Executes a shell command and returns the output """
|
||||
print(f"Command: {' '.join(parts)} ({cwd})")
|
||||
return subprocess.call(parts, cwd=cwd, env=env, universal_newlines=True)
|
||||
|
||||
|
||||
def hugo(hugo_site_path, dest, hugo_environment='gitea', base_url=None):
|
||||
""" builds the website to "dest" using "tmp" as an intermediate location """
|
||||
global HUGO_PATH
|
||||
rmrf(dest, keep_root=True)
|
||||
try:
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
except:
|
||||
print(f"Error creating the directory: {dest}")
|
||||
# overriding hugo config for development environments
|
||||
env = os.environ.copy()
|
||||
if base_url:
|
||||
env["HUGO_PARAMS_BASEURL"] = base_url
|
||||
# run the hugo command
|
||||
hugo_output = cmd([HUGO_PATH, '-e', hugo_environment, '-d', dest, '--noTimes'], cwd=hugo_site_path, env=env)
|
||||
|
||||
|
||||
def get_record_text(post):
|
||||
""" Generates the markdown text of a Notion page
|
||||
see: # https://github.com/brentbaum/brentbaum-notion-publishing/blob/master/notion/get_posts.py """
|
||||
text = ""
|
||||
|
||||
for child in post.children:
|
||||
if child.type == "page":
|
||||
text += get_record_text(child)
|
||||
elif child.type == "image":
|
||||
# @todo: Download the image and get into static directory for Hugo
|
||||
caption = child.caption if child.caption else ""
|
||||
if child.display_source:
|
||||
text += f"![{caption}]({child.display_source})\n"
|
||||
else:
|
||||
text += f"![{caption}]({child.source})\n"
|
||||
elif child.type == "divider":
|
||||
text += "---"
|
||||
else:
|
||||
prefix = prefixes.get(child.type, "")
|
||||
text += prefix + child.title.encode('utf-8').decode('utf-8') + "\n\n"
|
||||
|
||||
text = re.sub('`bib:([a-zA-Z0-9-]+)`', r'![](bib:\1)', text)
|
||||
return text
|
||||
|
||||
|
||||
def yaml_home(record):
|
||||
""" YAML template for syllabus home page """
|
||||
topics = [ f"{t.slug}.md" for t in record["related_to_syllabus_topics_syllabus"]]
|
||||
return """---
|
||||
title: %s
|
||||
has_topics: %s
|
||||
---\n\n""" % (
|
||||
record["name"],
|
||||
"[ %s ]" % ', '.join(topics),
|
||||
)
|
||||
|
||||
|
||||
def yaml_topic(record):
|
||||
""" YAML template for topic """
|
||||
sessions = [ f"{s.slug}.md" for s in record["related_to_syllabus_sessions_topic"]]
|
||||
return """---
|
||||
title: %s
|
||||
has_sessions: %s
|
||||
---\n\n""" % (
|
||||
record["name"],
|
||||
"[ %s ]" % ', '.join(sessions),
|
||||
)
|
||||
|
||||
|
||||
def yaml_default(record):
|
||||
""" YAML template default """
|
||||
return """---
|
||||
title: %s
|
||||
---\n\n""" % (
|
||||
record["name"]
|
||||
)
|
||||
|
||||
|
||||
def resolve_fields(id, yaml_func=None):
|
||||
""" Converts a page id into Markdown, metadata, and header """
|
||||
global client
|
||||
record = client.get_block(id)
|
||||
markdown = get_record_text(record)
|
||||
post = record.get_all_properties()
|
||||
header = yaml_func(post)
|
||||
|
||||
return {
|
||||
**post,
|
||||
#"publish_date": post["publish_date"].start.isoformat(),
|
||||
#"updated": post["updated"].isoformat(),
|
||||
"markdown": markdown,
|
||||
"header": header,
|
||||
}
|
||||
|
||||
|
||||
def notion_to_md(id, filepath=None, yaml_func=None):
|
||||
""" Takes an id (usually a Notion page) and writes to file """
|
||||
page_data = resolve_fields(id, yaml_func=yaml_func)
|
||||
page_content = page_data["header"] + page_data["markdown"]
|
||||
# print(page_data)
|
||||
if filepath:
|
||||
os.umask(0)
|
||||
with open(os.open(filepath, os.O_CREAT | os.O_WRONLY, 0o777), 'w', encoding="utf-8") as f:
|
||||
f.write(page_content)
|
||||
return page_data
|
||||
|
||||
|
||||
def rm_syllabus(content_dir):
|
||||
""" Removes all the files that this script writes """
|
||||
rmrf(os.path.join(content_dir, "_index.md"))
|
||||
rmrf(os.path.join(content_dir, "topic"))
|
||||
rmrf(os.path.join(content_dir, "session"))
|
||||
|
||||
|
||||
def fetch_syllabus_md(syllabi, syllabus_name, content_dir):
|
||||
""" Grabs the files from Notion """
|
||||
global client
|
||||
rm_syllabus(content_dir)
|
||||
|
||||
# Load the Syllabus collection
|
||||
cv = client.get_collection_view(syllabi)
|
||||
|
||||
for row in cv.collection.get_rows():
|
||||
# This only builds one syllabus at a time
|
||||
if row.title == syllabus_name:
|
||||
print(row)
|
||||
collection = client.get_collection(row.id)
|
||||
print(row.collection.get_schema_properties())
|
||||
# Home page
|
||||
notion_to_md(row.id,
|
||||
filepath=os.path.join(content_dir, "_index.md"),
|
||||
yaml_func=yaml_home)
|
||||
# handle topics
|
||||
topics_dir = os.path.join(content_dir, "topic")
|
||||
print("creating: ", topics_dir)
|
||||
os.makedirs(topics_dir, exist_ok=False)
|
||||
topics = row.get_property("c~x$")
|
||||
sessions = []
|
||||
for topic in topics:
|
||||
# print("properties:", topic.get_all_properties())
|
||||
# print("schema:", topic.related_to_syllabus_sessions_topic)
|
||||
print(" - ", f"{topic.slug}.md")
|
||||
notion_to_md(topic.id,
|
||||
filepath=os.path.join(topics_dir, f"{topic.slug}.md"),
|
||||
yaml_func=yaml_topic)
|
||||
sessions.extend([s for s in topic.related_to_syllabus_sessions_topic])
|
||||
# handle sessions
|
||||
sessions_dir = os.path.join(content_dir, "session")
|
||||
print("creating: ", sessions_dir)
|
||||
os.makedirs(sessions_dir, exist_ok=False)
|
||||
for session in sessions:
|
||||
# print("properties:", session.get_all_properties())
|
||||
print(" - ", f"{session.slug}.md")
|
||||
notion_to_md(session.id,
|
||||
filepath=os.path.join(sessions_dir, f"{session.slug}.md"),
|
||||
yaml_func=yaml_default)
|
||||
|
||||
|
||||
if __name__=="__main__":
|
||||
# Parsing command line arguments
|
||||
parser = argparse.ArgumentParser()
|
||||
for v in vars:
|
||||
parser.add_argument(f"--{v.lower()}")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Load all variables from command line arguments or environment variables
|
||||
for v in vars:
|
||||
globals()[v.upper()] = get_value(v.lower(), vars[v])
|
||||
|
||||
# Obtain the `token_v2` value by inspecting your browser cookies on a logged-in session on Notion.so
|
||||
try:
|
||||
client = NotionClient(token_v2=TOKEN_V2)
|
||||
except:
|
||||
print("Notion connect didn't work using token: ", TOKEN_V2)
|
||||
|
||||
pwd = os.getcwd()
|
||||
hugo_content_path = os.path.join(HUGO_SITE_PATH, 'content')
|
||||
|
||||
# Does the Hugo site exist ?
|
||||
if not os.path.exists(hugo_content_path):
|
||||
print(hugo_content_path, "doesn't exist. Make sure it is the location of a Hugo site.")
|
||||
sys.exit()
|
||||
|
||||
#
|
||||
|
||||
# Grab the files from Notion
|
||||
fetch_syllabus_md(SYLLABUS_DB, SYLLABUS_TITLE, hugo_content_path)
|
||||
|
||||
# Now build the Hugo site
|
||||
hugo(HUGO_SITE_PATH, WEBSITE_PATH, base_url=BASE_URL)
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}a{background-color:transparent}b{font-weight:bolder}img{border-style:none}input{font-family:inherit;font-size:100%;line-height:1.15;margin:0}input{overflow:visible}[type=checkbox]{box-sizing:border-box;padding:0}template{display:none}p{margin:0}ul{list-style:none;margin:0;padding:0}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji;line-height:1.5}*,::before,::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}img{border-style:solid}input::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder{color:#a0aec0}input::placeholder{color:#a0aec0}table{border-collapse:collapse}a{color:inherit;text-decoration:inherit}input{padding:0;line-height:inherit;color:inherit}img,svg{display:block;vertical-align:middle}img{max-width:100%;height:auto}.bg-CoconutCream{background-color:#f2f6d5}.bg-AuChico{background-color:#996561}.border-CoconutCream{border-color:#f2f6d5}.border-b-8{border-bottom-width:8px}.cursor-pointer{cursor:pointer}.block{display:block}.flex{display:-webkit-box;display:flex}.table{display:table}.justify-between{-webkit-box-pack:justify;justify-content:space-between}.font-vg5000{font-family:vg5000-regular,sans}.font-playfair{font-family:playfairdisplay regular,sans}.font-bold{font-weight:700}.h-full{height:100%}.leading-none{line-height:1}.mx-4{margin-left:1rem;margin-right:1rem}.mb-1{margin-bottom:.25rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mb-12{margin-bottom:3rem}.p-1{padding:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pr-4{padding-right:1rem}.pt-6{padding-top:1.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pt-16{padding-top:4rem}.pt-32{padding-top:8rem}.static{position:static}.sticky{position:-webkit-sticky;position:sticky}.top-0{top:0}.text-CoconutCream{color:#f2f6d5}.text-xs{font-size:.75rem}.text-base{font-size:1rem}.italic{font-style:italic}.z-10{z-index:10}@font-face{font-family:playfairdisplay regular;font-weight:400;src:url(../fonts/PlayfairDisplay-Regular.woff)format('woff')}@font-face{font-family:vg5000-regular;font-weight:400;src:url(../fonts/VG5000-Regular_web.woff)format('woff')}html{font-size:1.2em;background-color:#f2f6d5}img{padding-top:.5rem;padding-bottom:.5rem}h1{font-size:1.875rem;-webkit-column-break-after:avoid;-moz-column-break-after:avoid;break-after:avoid}h2{font-size:1.5rem;-webkit-column-break-after:avoid;-moz-column-break-after:avoid;break-after:avoid}h3{font-size:1.25rem;-webkit-column-break-after:avoid;-moz-column-break-after:avoid;break-after:avoid}blockquote{font-style:italic}p{padding-bottom:.5rem;line-height:1.25}footer{font-family:vg5000-regular,sans;font-size:.75rem;color:#29102f}article ul{position:relative;list-style-type:none;margin-left:0;padding-left:.75rem}article ul li:before{font-family:vg5000-regular,sans;color:#996561;font-size:.75rem;left:0;position:absolute;padding-top:.5rem;padding-bottom:.5rem;content:"•"}article li{padding-left:.5rem}a{color:#996561}a:hover{text-decoration:underline}.edit-button{border-bottom-width:4px;border-color:#f2f6d5;padding-left:.25rem;padding-right:.25rem;background-color:#996561;margin-bottom:.5rem;font-family:vg5000-regular,sans;color:#f2f6d5}.edit-button:hover{background-color:#f2f6d5;color:#996561;border-bottom-width:2px;border-color:#996561}.title-text{font-family:playfairdisplay regular,sans;font-size:2.25rem;color:#996561}.title-pretext{font-family:vg5000-regular,sans;font-size:1rem;color:#996561}.content-text{font-family:playfairdisplay regular,sans;font-size:1.25rem;color:#29102f}.sidebar-title{font-family:vg5000-regular,sans;font-size:1rem;color:#996561}.sidebar-list{font-family:vg5000-regular,sans;font-size:1.25rem;color:#996561}.logo{font-family:vg5000-regular,sans;font-size:1.25rem;color:#996561;padding-top:.5rem}.ddmenu .sidebar-title{cursor:pointer}.ddmenu input{display:none}.ddmenu .hiddendiv{padding-bottom:.25rem;display:none}.ddmenu input:not(:checked)~.hiddendiv{display:block;padding-bottom:1rem}#TableOfContents{font-family:vg5000-regular,sans;font-size:1.25rem;color:#996561;margin-left:-.5rem}#TableOfContents ul{margin-left:.5rem}#TableOfContents li:before{content:"> "}@page{size:A4}@page:first{@bottom{content: none;
|
||||
/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}a{background-color:transparent}b{font-weight:bolder}img{border-style:none}input{font-family:inherit;font-size:100%;line-height:1.15;margin:0}input{overflow:visible}[type=checkbox]{box-sizing:border-box;padding:0}template{display:none}p{margin:0}ul{list-style:none;margin:0;padding:0}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji;line-height:1.5}*,::before,::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}img{border-style:solid}input::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder{color:#a0aec0}input::placeholder{color:#a0aec0}table{border-collapse:collapse}a{color:inherit;text-decoration:inherit}input{padding:0;line-height:inherit;color:inherit}img,svg{display:block;vertical-align:middle}img{max-width:100%;height:auto}.bg-CoconutCream{background-color:#f2efea}.bg-AuChico{background-color:#820263}.border-CoconutCream{border-color:#f2efea}.border-b-8{border-bottom-width:8px}.cursor-pointer{cursor:pointer}.block{display:block}.flex{display:-webkit-box;display:flex}.table{display:table}.justify-between{-webkit-box-pack:justify;justify-content:space-between}.font-vg5000{font-family:vg5000-regular,sans}.font-playfair{font-family:playfairdisplay regular,sans}.font-bold{font-weight:700}.h-full{height:100%}.leading-none{line-height:1}.mx-4{margin-left:1rem;margin-right:1rem}.mb-1{margin-bottom:.25rem}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mt-8{margin-top:2rem}.mb-12{margin-bottom:3rem}.p-1{padding:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pr-4{padding-right:1rem}.pt-6{padding-top:1.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pt-16{padding-top:4rem}.pt-32{padding-top:8rem}.static{position:static}.sticky{position:-webkit-sticky;position:sticky}.top-0{top:0}.text-CoconutCream{color:#f2efea}.text-xs{font-size:.75rem}.text-base{font-size:1rem}.italic{font-style:italic}.z-10{z-index:10}@font-face{font-family:playfairdisplay regular;font-weight:400;src:url(../fonts/PlayfairDisplay-Regular.woff)format('woff')}@font-face{font-family:vg5000-regular;font-weight:400;src:url(../fonts/VG5000-Regular_web.woff)format('woff')}html{font-size:1.2em;background-color:#f2efea}img{padding-top:.5rem;padding-bottom:.5rem}h1{font-size:1.875rem;-webkit-column-break-after:avoid;-moz-column-break-after:avoid;break-after:avoid}h2{font-size:1.5rem;-webkit-column-break-after:avoid;-moz-column-break-after:avoid;break-after:avoid}h3{font-size:1.25rem;-webkit-column-break-after:avoid;-moz-column-break-after:avoid;break-after:avoid}blockquote{font-style:italic}p{padding-bottom:.5rem;line-height:1.25}footer{font-family:vg5000-regular,sans;font-size:.75rem;color:#23022e}article ul{position:relative;list-style-type:none;margin-left:0;padding-left:.75rem}article ul li:before{font-family:vg5000-regular,sans;color:#820263;font-size:.75rem;left:0;position:absolute;padding-top:.5rem;padding-bottom:.5rem;content:"•"}article li{padding-left:.5rem}a{color:#820263}a:hover{text-decoration:underline}.edit-button{border-bottom-width:4px;border-color:#f2efea;padding-left:.25rem;padding-right:.25rem;background-color:#820263;margin-bottom:.5rem;font-family:vg5000-regular,sans;color:#f2efea}.edit-button:hover{background-color:#f2efea;color:#820263;border-bottom-width:2px;border-color:#820263}.title-text{font-family:playfairdisplay regular,sans;font-size:2.25rem;color:#820263}.title-pretext{font-family:vg5000-regular,sans;font-size:1rem;color:#820263}.content-text{font-family:playfairdisplay regular,sans;font-size:1.25rem;color:#23022e}.sidebar-title{font-family:vg5000-regular,sans;font-size:1rem;color:#820263}.sidebar-list{font-family:vg5000-regular,sans;font-size:1.25rem;color:#820263}.logo{font-family:vg5000-regular,sans;font-size:1.25rem;color:#820263;padding-top:.5rem}.ddmenu .sidebar-title{cursor:pointer}.ddmenu input{display:none}.ddmenu .hiddendiv{padding-bottom:.25rem;display:none}.ddmenu input:not(:checked)~.hiddendiv{display:block;padding-bottom:1rem}#TableOfContents{font-family:vg5000-regular,sans;font-size:1.25rem;color:#820263;margin-left:-.5rem}#TableOfContents ul{margin-left:.5rem}#TableOfContents li:before{content:"> "}@page{size:A4}@page:first{@bottom{content: none;
|
||||
}}@page{margin-bottom:5mm;@top{color: #996561;
|
||||
|
||||
font-size: 1rem;
|
||||
|
@ -16,4 +16,4 @@
|
|||
|
||||
content: "▒▒ 🐟 ▒ ▒▒▒ 🐙 ▒▒▒🏃 ▒▒☄▒ PAGE: " counter(page) " ▒ ▒▒▒▒ ⚡ ▒🔍▒ ☠ ▒ ▒▒▒";
|
||||
}}@page topic:first{@top{content: none;
|
||||
}}@media print{body{background-color:#f2f6d5;color:#29102f;font-family:playfairdisplay regular,sans}.runningTopic{position:running(topic)}.topic{-webkit-column-break-before:page;-moz-column-break-before:page;break-before:page;page:topic}.title-text{font-family:playfairdisplay regular,sans;font-size:4rem;color:#996561;margin-bottom:5rem}.title-pretext{font-family:vg5000-regular,sans;font-size:1.5rem;color:#996561}.topic-text{font-family:playfairdisplay regular,sans;font-size:2.25rem;color:#996561;margin-bottom:5rem}.topic-pretext{font-family:vg5000-regular,sans;font-size:1.5rem;color:#996561}article ul li:before{content:""}.toc::after{text-align:right;float:right;content:target-counter(attr(href url),page,decimal-leading-zero)}}@media(max-width:767px){.md\:flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.md\:w-full{width:100%}}@media(min-width:768px){.lg\:flex{display:-webkit-box;display:flex}.lg\:static{position:static}.lg\:sticky{position:-webkit-sticky;position:sticky}.lg\:top-0{top:0}.lg\:w-2\/5{width:40%}.lg\:w-3\/5{width:60%}}
|
||||
}}@media print{body{background-color:#f2efea;color:#23022e;font-family:playfairdisplay regular,sans}.runningTopic{position:running(topic)}.topic{-webkit-column-break-before:page;-moz-column-break-before:page;break-before:page;page:topic}.title-text{font-family:playfairdisplay regular,sans;font-size:4rem;color:#820263;margin-bottom:5rem}.title-pretext{font-family:vg5000-regular,sans;font-size:1.5rem;color:#820263}.topic-text{font-family:playfairdisplay regular,sans;font-size:2.25rem;color:#820263;margin-bottom:5rem}.topic-pretext{font-family:vg5000-regular,sans;font-size:1.5rem;color:#820263}article ul li:before{content:""}.toc::after{text-align:right;float:right;content:target-counter(attr(href url),page,decimal-leading-zero)}}@media(max-width:767px){.md\:flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.md\:w-full{width:100%}}@media(min-width:768px){.lg\:flex{display:-webkit-box;display:flex}.lg\:static{position:static}.lg\:sticky{position:-webkit-sticky;position:sticky}.lg\:top-0{top:0}.lg\:w-2\/5{width:40%}.lg\:w-3\/5{width:60%}}
|
|
@ -0,0 +1,2 @@
|
|||
/node_modules
|
||||
/node_modules*
|
|
@ -0,0 +1,20 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020 YOUR_NAME_HERE
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
title: "{{ replace .Name "-" " " | title }}"
|
||||
---
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
title: "{{ replace .Name "-" " " | title }}"
|
||||
---
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: "{{ replace .Name "-" " " | title }}"
|
||||
has_sessions:
|
||||
---
|
|
@ -0,0 +1,11 @@
|
|||
const themeDir = __dirname + '/../../../';
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require('postcss-import')({
|
||||
path: [themeDir]
|
||||
}),
|
||||
require('tailwindcss')(themeDir + 'assets/css/tailwind.config.js'),
|
||||
require('autoprefixer'),
|
||||
]
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
const themeDir = __dirname + '/../../';
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require('postcss-import')({
|
||||
path: [themeDir]
|
||||
}),
|
||||
require('tailwindcss')(themeDir + 'assets/css/tailwind.config.js'),
|
||||
// Configuration of purgecss for Tailwindcss
|
||||
// see https://tailwindcss.com/docs/controlling-file-size/#setting-up-purgecss
|
||||
require('@fullhuman/postcss-purgecss')({
|
||||
// Specify the paths to all of the template files in your project
|
||||
content: [
|
||||
themeDir + 'layouts/**/*.html',
|
||||
themeDir + 'exampleSite/content/**/*.html',
|
||||
'layouts/**/*.html',
|
||||
'content/**/*.html',
|
||||
],
|
||||
// Include any special characters you're using in this regular expression
|
||||
defaultExtractor: content => content.match(/[A-Za-z0-9-_:\/]+/g) || [],
|
||||
fontFace: true
|
||||
}),
|
||||
require('autoprefixer')({
|
||||
grid: true
|
||||
}),
|
||||
require('postcss-reporter'),
|
||||
]
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
/* paged.js style */
|
||||
|
||||
@page {
|
||||
size: A4;
|
||||
}
|
||||
|
||||
@page :first {
|
||||
@bottom {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
|
||||
@page {
|
||||
margin-bottom: 5mm;
|
||||
@top {
|
||||
color: #996561;
|
||||
font-size: 1rem;
|
||||
font-family: 'VG5000-Regular';
|
||||
content: element(topic);
|
||||
}
|
||||
|
||||
@bottom {
|
||||
color: #996561;
|
||||
font-size: 0.5rem;
|
||||
font-family: 'VG5000-Regular';
|
||||
content: "▒▒ 🐟 ▒ ▒▒▒ 🐙 ▒▒▒🏃 ▒▒☄▒ PAGE: " counter(page) " ▒ ▒▒▒▒ ⚡ ▒🔍▒ ☠ ▒ ▒▒▒";
|
||||
}
|
||||
}
|
||||
|
||||
@page topic:first {
|
||||
@top {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
body {
|
||||
@apply bg-CoconutCream text-Revolver font-playfair;
|
||||
}
|
||||
|
||||
.runningTopic {
|
||||
position: running(topic);
|
||||
}
|
||||
|
||||
.topic {
|
||||
break-before: page;
|
||||
page: topic;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
@apply font-playfair text-6xl text-AuChico mb-20;
|
||||
}
|
||||
|
||||
.title-pretext {
|
||||
@apply font-vg5000 text-2xl text-AuChico;
|
||||
}
|
||||
|
||||
.topic-text {
|
||||
@apply font-playfair text-4xl text-AuChico mb-20;
|
||||
}
|
||||
|
||||
.topic-pretext {
|
||||
@apply font-vg5000 text-2xl text-AuChico;
|
||||
}
|
||||
|
||||
article ul li:before {
|
||||
content: "";
|
||||
}
|
||||
|
||||
.toc::after {
|
||||
text-align: right;
|
||||
float: right;
|
||||
content: target-counter(attr(href url), page, decimal-leading-zero);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,173 @@
|
|||
@font-face {
|
||||
font-family: 'PlayfairDisplay Black';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplay-Black.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'PlayfairDisplay Italic';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplay-Italic.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'PlayfairDisplay BlackItalic';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplay-BlackItalic.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'PlayfairDisplay Bold';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplay-Bold.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'PlayfairDisplay BoldItalic';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplay-BoldItalic.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'PlayfairDisplay Regular';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplay-Regular.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'PlayfairDisplay SC-Regular';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/PlayfairDisplaySC-Regular.woff") format('woff');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'VG5000-Regular';
|
||||
font-weight: 400;
|
||||
src: url("../fonts/VG5000-Regular_web.woff") format('woff');
|
||||
}
|
||||
|
||||
button, [type=button] {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: 1.2em;
|
||||
@apply bg-CoconutCream;
|
||||
}
|
||||
|
||||
img {
|
||||
@apply py-2;
|
||||
}
|
||||
|
||||
/* purgecss ignore */
|
||||
h1 {
|
||||
@apply text-3xl;
|
||||
break-after: avoid;
|
||||
}
|
||||
|
||||
/* purgecss ignore */
|
||||
h2 {
|
||||
@apply text-2xl;
|
||||
break-after: avoid;
|
||||
}
|
||||
|
||||
/* purgecss ignore */
|
||||
h3 {
|
||||
@apply text-xl;
|
||||
break-after: avoid;
|
||||
}
|
||||
|
||||
/* purgecss ignore */
|
||||
blockquote {
|
||||
@apply italic;
|
||||
}
|
||||
|
||||
p {
|
||||
@apply pb-2 leading-tight;
|
||||
}
|
||||
|
||||
footer {
|
||||
@apply font-vg5000 text-xs text-Revolver;
|
||||
}
|
||||
|
||||
article ul {
|
||||
@apply relative list-none ml-0 pl-3;
|
||||
}
|
||||
|
||||
article ul li:before {
|
||||
@apply font-vg5000 text-AuChico text-xs left-0 absolute pt-2 pb-2;
|
||||
content: "•";
|
||||
}
|
||||
|
||||
article li {
|
||||
@apply pl-2;
|
||||
}
|
||||
|
||||
a {
|
||||
@apply text-AuChico;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
@apply underline;
|
||||
}
|
||||
|
||||
.edit-button {
|
||||
@apply border-b-4 border-CoconutCream px-1 bg-AuChico mb-2 font-vg5000 text-CoconutCream;
|
||||
}
|
||||
|
||||
.edit-button:hover {
|
||||
@apply bg-CoconutCream text-AuChico border-b-2 border-AuChico;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
@apply font-playfair text-4xl text-AuChico;
|
||||
}
|
||||
|
||||
.title-pretext {
|
||||
@apply font-vg5000 text-base text-AuChico;
|
||||
}
|
||||
.content-text {
|
||||
@apply font-playfair text-xl text-Revolver;
|
||||
}
|
||||
|
||||
.sidebar-title {
|
||||
@apply font-vg5000 text-base text-AuChico;
|
||||
}
|
||||
|
||||
.sidebar-list {
|
||||
@apply font-vg5000 text-xl text-AuChico;
|
||||
}
|
||||
|
||||
.logo {
|
||||
@apply font-vg5000 text-xl text-AuChico pt-2;
|
||||
}
|
||||
|
||||
/* dropdown menu */
|
||||
|
||||
.ddmenu .sidebar-title {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.ddmenu input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ddmenu .hiddendiv {
|
||||
@apply pb-1 hidden;
|
||||
}
|
||||
|
||||
.ddmenu input:not(:checked) ~ .hiddendiv {
|
||||
@apply block pb-4;
|
||||
}
|
||||
|
||||
#TableOfContents {
|
||||
@apply font-vg5000 text-xl text-AuChico -ml-2;
|
||||
}
|
||||
|
||||
#TableOfContents ul {
|
||||
@apply ml-2;
|
||||
}
|
||||
|
||||
#TableOfContents li:before {
|
||||
content: "> ";
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
/* Tailwind base - put variables under: tailwind.config.js */
|
||||
@import "node_modules/tailwindcss/base";
|
||||
@import "node_modules/tailwindcss/components";
|
||||
@import "node_modules/tailwindcss/utilities";
|
||||
@import "assets/css/site.css";
|
||||
@import "assets/css/print.css";
|
|
@ -0,0 +1,20 @@
|
|||
module.exports = {
|
||||
theme: {
|
||||
screens: {
|
||||
'md': {'max': '767px'},
|
||||
'lg': {'min': '768px'}
|
||||
},
|
||||
fontFamily: {
|
||||
'vg5000': ['"VG5000-Regular"', 'sans'],
|
||||
'playfair': ['"PlayfairDisplay Regular"', 'sans']
|
||||
},
|
||||
colors: {
|
||||
CoconutCream: '#F2EFEA',
|
||||
AuChico: '#820263',
|
||||
Revolver: '#23022E'
|
||||
},
|
||||
extend: {}
|
||||
},
|
||||
variants: {},
|
||||
plugins: []
|
||||
};
|
|
@ -0,0 +1,3 @@
|
|||
{{ define "main" }}
|
||||
<p>404 - page not found</p>
|
||||
{{ end }}
|
|
@ -0,0 +1,42 @@
|
|||
{{- $text_link := .Text -}}
|
||||
{{- if strings.HasPrefix .Destination "bib:" -}}
|
||||
{{- $destination := (substr .Destination 4) -}}
|
||||
{{- if index $.Page.Site.Data.books.piratecarecollection $destination -}}
|
||||
{{- $b := index $.Page.Site.Data.books.piratecarecollection $destination -}}
|
||||
{{- if not $text_link -}}
|
||||
<span>{{- delimit $b.authors ", " " & " -}}{{- with $b.pubdate -}}, {{- substr . 0 4}}{{- end -}}.<a href="/library/BROWSE_LIBRARY.html#/book/{{- $destination -}}"{{- with $b.title}} title="{{- . -}}"{{- end -}} target="_blank"><i>‘{{- $b.title -}}’</i></a>. {{- with $b.publisher -}}{{- . -}}.{{- end -}}</span>
|
||||
{{- else -}}
|
||||
<a href="/library/BROWSE_LIBRARY.html#/book/{{- $destination -}}"{{- with $b.title}} title="{{- . -}}"{{- end -}} target="_blank">{{- $text_link -}}</a>
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
<a href="/library/BROWSE_LIBRARY.html#/book/{{- $destination -}}"{{- with .Title}} title="{{- . -}}"{{- end -}}>{{- $text_link -}}⦚<span class="text-xs font-bold p-1 bg-AuChico text-CoconutCream">bib:{{- $destination -}} not found</span></a>
|
||||
{{- end -}}
|
||||
{{- else if strings.HasPrefix .Destination "session:" -}}
|
||||
{{- $s_destination := printf "/session/%s" (substr .Destination 8) -}}
|
||||
{{- if $.Page.Site.GetPage $s_destination -}}
|
||||
{{- $session := $.Page.Site.GetPage $s_destination -}}
|
||||
{{- if not $text_link -}}
|
||||
<a href="{{- $session.RelPermalink -}}{{- if eq hugo.Environment "offline" -}}index.html{{- end -}}"{{- with $session.Title}} title="{{- $session.Title -}}"{{- end -}}>{{- $session.Title -}}</a>
|
||||
{{- else -}}
|
||||
<a href="{{- $session.RelPermalink -}}{{- if eq hugo.Environment "offline" -}}index.html{{- end -}}"{{- with .Title}} title="{{- . -}}"{{- end -}}>{{- $text_link -}}</a>
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
<a href="{{- $s_destination -}}/{{- if eq hugo.Environment "offline" -}}index.html{{- end -}}">{{- $text_link -}}⦚<span class="text-xs font-bold p-1 bg-AuChico text-CoconutCream">session:{{- $s_destination -}} not found</span></a>
|
||||
{{- end -}}
|
||||
{{- else if strings.HasPrefix .Destination "topic:" -}}
|
||||
{{- $t_destination := printf "/topic/%s" (substr .Destination 6) -}}
|
||||
{{- if $.Page.Site.GetPage $t_destination -}}
|
||||
{{- $topic := $.Page.Site.GetPage $t_destination -}}
|
||||
{{- if not $text_link -}}
|
||||
<a href="{{- $topic.RelPermalink -}}{{- if eq hugo.Environment "offline" -}}index.html{{- end -}}"{{- with $topic.Title}} title="{{- $topic.Title -}}"{{- end -}}>{{- $topic.Title -}}</a>
|
||||
{{- else -}}
|
||||
<a href="{{- $topic.RelPermalink -}}{{- if eq hugo.Environment "offline" -}}index.html{{- end -}}"{{- with .Title}} title="{{- . -}}"{{- end -}}>{{- $text_link -}}</a>
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
<a href="{{- $t_destination -}}/{{- if eq hugo.Environment "offline" -}}index.html{{- end -}}">{{- $text_link -}}⦚<span class="text-xs font-bold p-1 bg-AuChico text-CoconutCream">topic:{{- $t_destination -}} not found</span></a>
|
||||
{{- end -}}
|
||||
{{- else if findRE "^.*static" .Destination -}}
|
||||
<img src="{{- (replaceRE "^.*static" "" .Destination ) | safeURL -}}" alt="{{- .Text -}}" {{- with .Title}} title="{{- . -}}"{{- end -}} />
|
||||
{{- else -}}
|
||||
<img src="{{- .Destination | safeURL -}}" alt="{{- .Text -}}" {{- with .Title}} title="{{- . -}}"{{- end -}} />
|
||||
{{- end -}}
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
{{- $filePath := .File -}}
|
||||
{{- $gitUrl := .Site.Params.giturl -}}
|
||||
<html lang="{{ with .Site.LanguageCode }}{{ . }}{{ else }}en-us{{ end }}">
|
||||
{{- partial "head.html" . -}}
|
||||
{{ partialCached "css.html" . }}
|
||||
<body class="mx-4">
|
||||
{{ with .Site.Params.edit }}
|
||||
<div class="flex justify-between sticky top-0 static border-b-8 z-10 border-CoconutCream bg-AuChico px-1 pt-2">
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_edit/master/content/{{ $filePath }}">edit_this</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_new/master/content/topic/">add_new_topic</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_new/master/content/session/">add_new_session</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_edit/master/PUBLISH.trigger.md">publish</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}"> ? </a>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{- partial "header.html" . -}}
|
||||
<main class="lg:flex mb-4 pt-2 justify-between md:flex-row">
|
||||
<aside class="lg:w-2/5 pr-4 pt-16 lg:sticky lg:top-0 lg:static h-full mb-6 md:w-full">
|
||||
{{- block "sidebar" . }}{{- end }}
|
||||
</aside>
|
||||
<article class="lg:w-3/5 pt-32 md:w-full">
|
||||
{{- block "main" . }}{{- end }}
|
||||
</article>
|
||||
</main>
|
||||
{{- partial "footer.html" . -}}
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,36 @@
|
|||
{{ define "sidebar" }}
|
||||
{{$currentNode := . }}
|
||||
<div class="leading-none mb-12">
|
||||
<span class="title-pretext">syllabus ⦚ </span><span class="title-text pt-6">{{ .Title }}</span>
|
||||
</div>
|
||||
|
||||
{{ if ne (trim .Page.TableOfContents "\n") "<nav id=\"TableOfContents\"></nav>" }}
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-toc" type="checkbox" >
|
||||
<label for="toggly-toc" class="sidebar-title" tabindex="1">▒▒ table of contents ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<div class="mt-4">
|
||||
{{ .Page.TableOfContents }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="ddmenu">
|
||||
<input id="toggly" type="checkbox">
|
||||
<label for="toggly" class="sidebar-title mb-1" tabindex="1">▒▒ has topics ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<ul class="mt-4">
|
||||
{{ range .Params.has_topics }}
|
||||
{{ with $.GetPage (printf "%s%s" "/topic/" . ) }}
|
||||
<li><a class="sidebar-list text-base" href="{{ .RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">> {{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ define "main" }}
|
||||
<div class="content-text">{{ .Content }}</div>
|
||||
{{ end }}
|
|
@ -0,0 +1,6 @@
|
|||
{{ define "main" }}
|
||||
<article>
|
||||
<div class="font-vg5000"><a href="{{ .Permalink }}">{{ .Title }}</a></div>
|
||||
<div class="font-playfair">{{ .Content }}</div>
|
||||
</article>
|
||||
{{ end }}
|
|
@ -0,0 +1,42 @@
|
|||
{{ $text_link := .Text }}
|
||||
{{ if strings.HasPrefix .Destination "bib:" }}
|
||||
{{ $destination := (substr .Destination 4) }}
|
||||
{{ if index $.Page.Site.Data.books.piratecarecollection $destination }}
|
||||
{{ $b := index $.Page.Site.Data.books.piratecarecollection $destination }}
|
||||
{{ if not $text_link }}
|
||||
<span>{{ delimit $b.authors ", " " & " }}{{ with $b.pubdate }}, {{ substr . 0 4}}{{ end }}.<a href="/library/BROWSE_LIBRARY.html#/book/{{ $destination }}"{{ with $b.title}} title="{{ . }}"{{ end }} target="_blank"><i>‘{{ $b.title }}’</i></a>. {{ with $b.publisher }}{{ . }}.{{ end }}</span>
|
||||
{{ else }}
|
||||
<a href="/library/BROWSE_LIBRARY.html#/book/{{ $destination }}"{{ with $b.title}} title="{{ . }}"{{ end }} target="_blank">{{ $text_link }}</a>
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
<a href="/library/BROWSE_LIBRARY.html#/book/{{ $destination }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ $text_link }}⦚<span class="text-xs font-bold p-1 bg-AuChico text-CoconutCream">bib:{{ $destination }} not found</span></a>
|
||||
{{ end }}
|
||||
{{ else if strings.HasPrefix .Destination "session:" }}
|
||||
{{ $s_destination := (substr .Destination 8) }}
|
||||
{{ if $.Page.Site.GetPage $s_destination }}
|
||||
{{ $session := $.Page.Site.GetPage $s_destination }}
|
||||
{{ if not $text_link }}
|
||||
<a href="/session/{{ $s_destination }}/{{ if eq hugo.Environment "offline" }}index.html{{ end }}"{{ with $session.Title}} title="{{ $session.Title }}"{{ end }}>{{ $session.Title }}</a>
|
||||
{{ else }}
|
||||
<a href="/session/{{ $s_destination }}/{{ if eq hugo.Environment "offline" }}index.html{{ end }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ $text_link }}</a>
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
<a href="/session/{{ $s_destination }}/{{ if eq hugo.Environment "offline" }}index.html{{ end }}">{{ $text_link }}⦚<span class="text-xs font-bold p-1 bg-AuChico text-CoconutCream">session:{{ $s_destination }} not found</span></a>
|
||||
{{ end }}
|
||||
{{ else if strings.HasPrefix .Destination "topic:" }}
|
||||
{{ $t_destination := (substr .Destination 6) }}
|
||||
{{ if $.Page.Site.GetPage $t_destination }}
|
||||
{{ $topic := $.Page.Site.GetPage $t_destination }}
|
||||
{{ if not $text_link }}
|
||||
<a href="/topic/{{ $t_destination }}/{{ if eq hugo.Environment "offline" }}index.html{{ end }}"{{ with $topic.Title}} title="{{ $topic.Title }}"{{ end }}>{{ $topic.Title }}</a>
|
||||
{{ else }}
|
||||
<a href="/topic/{{ $t_destination }}/{{ if eq hugo.Environment "offline" }}index.html{{ end }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ $text_link }}</a>
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
<a href="/topic/{{ $t_destination }}/{{ if eq hugo.Environment "offline" }}index.html{{ end }}">{{ $text_link }}⦚<span class="text-xs font-bold p-1 bg-AuChico text-CoconutCream">topic:{{ $t_destination }} not found</span></a>
|
||||
{{ end }}
|
||||
{{ else if findRE "^.*static" .Destination }}
|
||||
<img src="{{ (replaceRE "^.*static" "" .Destination ) | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
|
||||
{{ else }}
|
||||
<img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
|
||||
{{ end }}
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
{{- $filePath := .File -}}
|
||||
{{- $gitUrl := .Site.Params.giturl -}}
|
||||
<html lang="{{ with .Site.LanguageCode }}{{ . }}{{ else }}en-us{{ end }}">
|
||||
{{- partial "head.html" . -}}
|
||||
{{ partialCached "css.html" . }}
|
||||
<body class="mx-4">
|
||||
{{ with .Site.Params.edit }}
|
||||
<div class="flex justify-between sticky top-0 static border-b-8 z-10 border-CoconutCream bg-AuChico px-1 pt-2">
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_edit/master/content/{{ $filePath }}">edit_this</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_new/master/content/{{ $filePath.Dir }}">{{ $filePath.Dir }}add_new</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_new/master/content">add_new</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}/_edit/master/PUBLISH.trigger.md">publish</a>
|
||||
<a class="edit-button" target="_blank" href="{{ $gitUrl }}"> ? </a>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{- partial "header.html" . -}}
|
||||
<main class="lg:flex mb-4 pt-2 justify-between md:flex-row">
|
||||
<aside class="lg:w-2/5 pr-4 pt-16 lg:sticky lg:top-0 lg:static h-full mb-6 md:w-full">
|
||||
{{- block "sidebar" . }}{{- end }}
|
||||
</aside>
|
||||
<article class="lg:w-3/5 pt-32 md:w-full">
|
||||
{{- block "main" . }}{{- end }}
|
||||
</article>
|
||||
</main>
|
||||
{{- partial "footer.html" . -}}
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,22 @@
|
|||
{{ define "sidebar" }}
|
||||
{{$currentNode := . }}
|
||||
<div class="leading-none mb-12">
|
||||
<span class="title-pretext">download ⦚ </span><span class="title-text pt-6">{{ .Title }}</span>
|
||||
</div>
|
||||
|
||||
{{ if ne (trim .Page.TableOfContents "\n") "<nav id=\"TableOfContents\"></nav>" }}
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-toc" type="checkbox" >
|
||||
<label for="toggly-toc" class="sidebar-title" tabindex="1">▒▒ table of contents ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<div class="mt-4">
|
||||
{{ .Page.TableOfContents }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ define "main" }}
|
||||
<div class="content-text">{{ .Content }}</div>
|
||||
{{ end }}
|
|
@ -0,0 +1,6 @@
|
|||
{{ define "main" }}
|
||||
<article>
|
||||
<div class="font-vg5000"><a href="{{ .Permalink }}">{{ .Title }}</a></div>
|
||||
<div class="font-playfair">{{ .Content }}</div>
|
||||
</article>
|
||||
{{ end }}
|
|
@ -0,0 +1 @@
|
|||
{{ block "main" . }}{{ end }}
|
|
@ -0,0 +1 @@
|
|||
{{ define "main" }}SECTIONS=[{{ range .Site.Sections }}{"section": "{{ trim .File.Dir "/" }}", "items": [{{ range .Pages }}"{{ .File.BaseFileName }}", {{ end }}]}, {{ end }}];{{ end }}
|
|
@ -0,0 +1,28 @@
|
|||
{{ if (or (eq hugo.Environment "gitea") (eq hugo.Environment "preview") ) }}
|
||||
<link rel="stylesheet" href="/css/styles.css">
|
||||
{{ else if .Site.IsServer }}
|
||||
{{ $style := resources.Get "css/styles.css" | postCSS (dict "config" "./assets/css/postcss.config.js") | minify | fingerprint }}
|
||||
<link rel="stylesheet" href="{{ $style.Permalink }}" integrity="{{ $style.Data.Integrity }}">
|
||||
{{ else }}
|
||||
{{ $style := resources.Get "css/styles.css" | postCSS (dict "config" "./assets/css/postcss.config.js") | minify | fingerprint }}
|
||||
{{ $flist := newScratch }}
|
||||
{{ $flist.Set "initial" "nop" }}
|
||||
{{ range (readDir "public/css") }}
|
||||
{{ $finfo := os.Stat (printf "%s%s" "public/css/" .Name) }}
|
||||
{{ $flist.SetInMap "css_files" (printf "%s" $finfo.ModTime) .Name }}
|
||||
{{ $flist.Set "initial" "yay" }}
|
||||
{{ end }}
|
||||
|
||||
{{ $css := "nop" }}
|
||||
|
||||
{{ if eq ($flist.Get "initial") "yay" }}
|
||||
{{ $css = (index (last 1 ( $flist.GetSortedMapValues "css_files" )) 0) }}
|
||||
{{ end }}
|
||||
|
||||
{{ if in $css "css" }}
|
||||
<link rel="stylesheet" href="{{ "/css/" }}{{ $css }}">
|
||||
{{ else }}
|
||||
{{ $style := resources.Get "css/styles.css" | postCSS (dict "config" "./assets/css/postcss.config.js") | minify | fingerprint }}
|
||||
<link rel="stylesheet" href="{{ $style.Permalink }}" integrity="{{ $style.Data.Integrity }}">
|
||||
{{ end }}
|
||||
{{ end }}
|
|
@ -0,0 +1,4 @@
|
|||
<footer>
|
||||
▒▒▒ ▒ <a href="https://creativecommons.org/licenses/by-sa/4.0/"> ☠</a> 2019-2020 <a href="mailto:info@pirate.care">Piratecare</a> ▒Markdown♻HTML ✈ <a href="https://gohugo.io/" rel="nofollow">Hugo</a> ▒Commits♻<a href="https://git-scm.com/">Git</a> 🐟 <a href="https://gitea.io/">Gitea</a> ▒▒ 🐟 ▒ Print ⚗ <a href="https://pagedjs.org">paged.js</a> ▒▒▒ 🐙  ▒▒▒▒▒▒🏃  ▒▒☄▒▒▒▒   ▒ ⚡  ▒▒▒  ▒▒▒▒▒▒ ▒▒▒▒🔍▒  ☠ ▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒ 🐟▒ ☄ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒ ▒ ▒ ▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒ ▲ ▒▒▒▒▒▒ ▒▒ ▒ ▒ ▒ ▒▒        ▒        ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒ ▒ ▒ ▒▒▒▒▒▒▒▒▒▒ ⚧ ▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒ ◎ ▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒                ▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒ ♻ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 🏃 ▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒ ▒ ▒ ▒ ▒▒▒▒▒▒▒ 🌑 ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒▒▒▒        ▒▒ ▒▒▒▒▒▒▒▒▒ ⚡ ▒▒▒▒▒▒▒▒Design 🖼 <a href="https://www.maddalenafragnito.com">Maddu</a> 🐈▒▒▒▒▒▒ ◎
|
||||
</footer>
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
{{ if .Description }}
|
||||
<meta name="description" content="{{ .Description }}" />
|
||||
{{ end }}
|
||||
{{ if .Keywords }}
|
||||
<meta name="keywords" content="{{ delimit .Keywords "," }}" />
|
||||
{{ end }}
|
||||
{{ if .Params.Author }}
|
||||
<meta name="author" content="{{ .Params.Author}}" />
|
||||
{{ end }}
|
||||
|
||||
{{ template "_internal/opengraph.html" . }}
|
||||
{{ template "_internal/twitter_cards.html" . }}
|
||||
|
||||
{{ hugo.Generator }}
|
||||
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#996561">
|
||||
|
||||
<title>{{ block "title" . }}{{- .Title }} - {{ .Site.Title -}}{{ end }}</title>
|
||||
</head>
|
|
@ -0,0 +1,5 @@
|
|||
<header class="flex justify-between bg-CoconutCream">
|
||||
<a href="{{ .Site.Home.RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}" class="logo pt-3 cursor-pointer">machinelistening  ▒▒▒ 🐙  </a>
|
||||
<a href="/library/BROWSE_LIBRARY.html" target="_blank" class="logo pt-3 cursor-pointer">library.</a>
|
||||
</div>
|
||||
</header>
|
|
@ -0,0 +1,2 @@
|
|||
<link href="/css/paged_interface.css" rel="stylesheet" type="text/css">
|
||||
<script src="/js/paged.polyfill.js"></script>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ with .Site.LanguageCode }}{{ . }}{{ else }}en-us{{ end }}">
|
||||
{{- partial "head.html" . -}}
|
||||
{{- partial "pagedjs.html" . -}}
|
||||
{{ partial "css.html" . }}
|
||||
<body>
|
||||
<article>
|
||||
{{- block "main" . }}{{- end }}
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,53 @@
|
|||
{{ define "main" }}
|
||||
<div class="frontpage">
|
||||
<div class="pb-6"> <span class="title-pretext">syllabus ⦚ </span><span class="title-text">{{ .Site.Home.Title }}</span></div>
|
||||
|
||||
<div class="sidebar-title mb-1 pt-16 mb-4">▒▒ has topics ▽</div>
|
||||
<ul class="mt-8">
|
||||
{{ range .Site.Home.Params.has_topics }}
|
||||
{{ with $.GetPage (printf "%s%s" "/topic/" . ) }}
|
||||
<li><a class="sidebar-list text-base toc" href="#{{ .File.LogicalName }}">> {{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
{{ range .Site.Home.Params.has_topics }}
|
||||
{{ with $.GetPage (printf "%s%s" "/topic/" . ) }}
|
||||
<div class="topic" id="{{ .File.LogicalName }}"><div class="runningTopic"><a href="#{{ .File.LogicalName }}"> topic ⦚ {{ .Title }}</a></div>
|
||||
<div><span class="topic-pretext">topic ⦚ </span><span class="topic-text pt-6">{{ .Title }}</span></div>
|
||||
<div class="sidebar-title mb-1 pt-16">▒▒ has sessions ▽</div>
|
||||
<ul class="mt-4">
|
||||
{{ range .Params.has_sessions }}
|
||||
{{ with $.GetPage (printf "%s%s" "/session/" . ) }}
|
||||
<li><a class="sidebar-list text-base toc" href="#{{ .File.LogicalName }}">> {{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
<div>{{ .Content }}</div>
|
||||
|
||||
{{ range .Params.has_sessions }}
|
||||
{{ with $.GetPage (printf "%s%s" "/session/" . ) }}
|
||||
{{ $session := . }}
|
||||
<div class="topic" id="{{ .File.LogicalName }}"><div class="runningTopic"><a href="#{{ .File.LogicalName }}">session ⦚ {{ .Title }}</a></div>
|
||||
<div><span class="topic-pretext">session ⦚ </span><span class="topic-text pt-6">{{ .Title }}</span></div>
|
||||
<div class="sidebar-title mb-1 pt-16">▒▒ is in ▽</div>
|
||||
<ul class="mt-4">
|
||||
{{ range where $.Site.RegularPages ".Section" "topic" }}
|
||||
{{ if in .Params.has_sessions $session.File.LogicalName }}
|
||||
<li><a class="sidebar-list text-base" href="#{{ .File.LogicalName }}">↖ topic ⦚ {{ .Title }}</a></li>
|
||||
{{ else if in .Params.is_in $session.File.LogicalName }}
|
||||
<li><a class="sidebar-list text-base" href="#{{ .File.LogicalName }}">↖ topic ⦚ {{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
<div class="pt-16">{{ .Content }} </div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ end }}
|
||||
|
||||
{{ end }}
|
||||
|
||||
{{ end }}
|
|
@ -0,0 +1,7 @@
|
|||
{{ define "main" }}
|
||||
<div class="sidebar-title mb-1 pb-8">▒▒ all sessions:</div>
|
||||
{{ range .Data.Pages }}
|
||||
<div><a class="sidebar-list text-base" href="{{ .RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">> {{ .Title }}</a></div>
|
||||
{{ end }}
|
||||
<div class="pb-8"></div>
|
||||
{{ end }}
|
|
@ -0,0 +1,40 @@
|
|||
{{ define "sidebar" }}
|
||||
<div class="leading-none mb-12">
|
||||
<span class="title-pretext">session ⦚ </span><span class="title-text pt-6">{{ .Title }}</span>
|
||||
</div>
|
||||
|
||||
{{ if ne (trim .Page.TableOfContents "\n") "<nav id=\"TableOfContents\"></nav>" }}
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-toc" type="checkbox" >
|
||||
<label for="toggly-toc" class="sidebar-title" tabindex="1">▒▒ table of contents ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<div class="mt-4">
|
||||
{{ .Page.TableOfContents }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-isin" type="checkbox">
|
||||
<label for="toggly-isin" class="sidebar-title mt-4 mb-1" tabindex="1">▒▒ is in ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<ul class="mt-4">
|
||||
{{ $currentSession := . }}
|
||||
{{ range where $.Site.RegularPages ".Section" "topic" }}
|
||||
{{ if in .Params.has_sessions $currentSession.File.LogicalName }}
|
||||
<li><a class="sidebar-list text-base" href="{{ .RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">↖ topic ⦚ {{ .Title }}</a></li>
|
||||
{{ else if in $currentSession.Params.is_in .File.LogicalName }}
|
||||
<li><a class="sidebar-list text-base" href="{{ .RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">↖ topic ⦚ {{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{define "main" }}
|
||||
<article>
|
||||
<div class="content-text">{{ .Content }}</div>
|
||||
</article>
|
||||
{{ end }}
|
|
@ -0,0 +1,7 @@
|
|||
{{ define "main" }}
|
||||
<div class="sidebar-title mb-1 pb-8">▒▒ all topics:</div>
|
||||
{{ range .Data.Pages }}
|
||||
<div><a class="sidebar-list text-base" href="{{ .RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">> {{ .Title }}</a></div>
|
||||
{{ end }}
|
||||
<div class="pb-8"></div>
|
||||
{{ end }}
|
|
@ -0,0 +1,55 @@
|
|||
{{ define "sidebar" }}
|
||||
{{ $currentNode := . }}
|
||||
<div class="leading-none mb-12">
|
||||
<span class="title-pretext">topic ⦚ </span><span class="title-text pt-6">{{ .Title }}</span>
|
||||
</div>
|
||||
|
||||
{{ if ne (trim .Page.TableOfContents "\n") "<nav id=\"TableOfContents\"></nav>" }}
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-toc" type="checkbox" >
|
||||
<label for="toggly-toc" class="sidebar-title" tabindex="1">▒▒ table of contents ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<div class="mt-4">
|
||||
{{ .Page.TableOfContents }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-sessions" type="checkbox">
|
||||
<label for="toggly-sessions" class="sidebar-title mb-1" tabindex="1">▒▒ has sessions ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<ul class="mt-4">
|
||||
{{ range .Params.has_sessions }}
|
||||
{{ with $.GetPage (printf "%s%s" "/session/" . ) }}
|
||||
<li><a class="sidebar-list text-base" href="{{ .RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">> {{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ddmenu">
|
||||
<input id="toggly-isin" type="checkbox">
|
||||
<label for="toggly-isin" class="sidebar-title mt-4 mb-1" tabindex="1">▒▒ is in ▽</label>
|
||||
<div class="hiddendiv">
|
||||
<ul class="mt-4">
|
||||
<li><a class="sidebar-list text-base" href="{{ .Site.Home.RelPermalink }}{{ if eq hugo.Environment "offline" }}index.html{{ end }}">↖ syllabus ⦚ {{ .Site.Home.Title }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ end }}
|
||||
|
||||
{{define "main" }}
|
||||
<article>
|
||||
{{ if eq .Params.last_modified "top" }}
|
||||
<div class="font-playfair italic text-base">Last modified: {{ dateFormat "Monday, Jan 2, 2006" .Lastmod }}</div>
|
||||
{{ end }}
|
||||
<div class="content-text">{{ .Content }}</div>
|
||||
{{ if eq .Params.last_modified "bottom" }}
|
||||
<div class="font-playfair italic text-base">Last modified: {{ dateFormat "Monday, Jan 2, 2006" .Lastmod }}</div>
|
||||
{{ end }}
|
||||
</article>
|
||||
{{ end }}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"name": "hugo-theme-tailwindcss-starter",
|
||||
"version": "0.1.1",
|
||||
"description": "Starter files for a Hugo theme with Tailwindcss",
|
||||
"main": "index.js",
|
||||
"repository": "https://github.com/dirkolbrich/hugo-theme-tailwindcss-starter",
|
||||
"author": "dirkolbrich <github@dirkolbrich.de>",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"start": "hugo --gc"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fullhuman/postcss-purgecss": "^2.0.6",
|
||||
"autoprefixer": "^9.7.4",
|
||||
"postcss": "^7.0.26",
|
||||
"postcss-cli": "^7.1.0",
|
||||
"postcss-import": "^12.0.1",
|
||||
"tailwindcss": "^1.2.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"last 1 version",
|
||||
"> 1%",
|
||||
"maintained node versions",
|
||||
"not dead"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
# theme.toml template for a Hugo theme
|
||||
# See https://github.com/gohugoio/hugoThemes#themetoml for an example
|
||||
|
||||
name = "Machinelistening"
|
||||
license = "MIT"
|
||||
licenselink = "https://www.gnu.org/licenses/gpl-3.0.en.html"
|
||||
description = "The theme developed for the Machine Listening Syllabus (forked from Pirate Care)"
|
||||
homepage = "https://pirate.care"
|
||||
tags = ["syllabus"]
|
||||
features = []
|
||||
min_version = "0.41"
|
||||
|
||||
[author]
|
||||
name = "maddalena fragnito & marcell mars"
|
||||
homepage = "https://pirate.care"
|
||||
|
||||
# If porting an existing theme
|
||||
[original]
|
||||
name = "hugo-theme-tailwindcss-starter"
|
||||
homepage = "https://github.com/dirkolbrich/hugo-theme-tailwindcss-starter"
|
||||
repo = "https://github.com/dirkolbrich/hugo-theme-tailwindcss-starter"
|
||||
|
|
@ -1 +0,0 @@
|
|||
../acorn/bin/acorn
|
|
@ -1 +0,0 @@
|
|||
../autoprefixer/bin/autoprefixer
|
|
@ -1 +0,0 @@
|
|||
../browserslist/cli.js
|
|
@ -1 +0,0 @@
|
|||
../cssesc/bin/cssesc
|
|
@ -1 +0,0 @@
|
|||
../detective/bin/detective.js
|
|
@ -1 +0,0 @@
|
|||
../esprima/bin/esparse.js
|
|
@ -1 +0,0 @@
|
|||
../esprima/bin/esvalidate.js
|
|
@ -1 +0,0 @@
|
|||
../js-yaml/bin/js-yaml.js
|
|
@ -1 +0,0 @@
|
|||
../postcss-cli/bin/postcss
|
|
@ -1 +0,0 @@
|
|||
../purgecss/bin/purgecss
|
|
@ -1 +0,0 @@
|
|||
../tailwindcss/lib/cli.js
|
|
@ -1 +0,0 @@
|
|||
../tailwindcss/lib/cli.js
|
|
@ -1,21 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2020 Full Human
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -1,89 +0,0 @@
|
|||
# PostCSS Purgecss
|
||||
![David (path)](https://img.shields.io/david/FullHuman/purgecss?path=packages%2Fpostcss-purgecss&style=for-the-badge)
|
||||
![Dependabot](https://img.shields.io/badge/dependabot-enabled-%23024ea4?style=for-the-badge)
|
||||
![npm](https://img.shields.io/npm/v/@fullhuman/postcss-purgecss?style=for-the-badge)
|
||||
![npm](https://img.shields.io/npm/dw/@fullhuman/postcss-purgecss?style=for-the-badge)
|
||||
![GitHub](https://img.shields.io/github/license/FullHuman/purgecss?style=for-the-badge)
|
||||
|
||||
[PostCSS] plugin for PurgeCSS.
|
||||
|
||||
[PostCSS]: https://github.com/postcss/postcss
|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
npm i -D @fullhuman/postcss-purgecss
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const purgecss = require('@fullhuman/postcss-purgecss')
|
||||
postcss([
|
||||
purgecss({
|
||||
content: ['./src/**/*.html']
|
||||
})
|
||||
])
|
||||
```
|
||||
|
||||
See [PostCSS] docs for examples for your environment.
|
||||
|
||||
## Options
|
||||
|
||||
All of the options of purgecss are available to use with the plugins.
|
||||
You will find below the main options available. For the complete list, go to the [purgecss documentation website](https://www.purgecss.com/configuration.html#options).
|
||||
|
||||
### `content` (**required**)
|
||||
Type: `string | Object`
|
||||
|
||||
You can specify content that should be analyzed by Purgecss with an array of filenames or globs. The files can be HTML, Pug, Blade, etc.
|
||||
|
||||
### `extractors`
|
||||
Type: `Array<Object>`
|
||||
|
||||
Purgecss can be adapted to suit your needs. If you notice a lot of unused CSS is not being removed, you might want to use a custom extractor.
|
||||
More information about extractors [here](https://www.purgecss.com/extractors.html).
|
||||
|
||||
### `whitelist`
|
||||
Type: `Array<string>`
|
||||
|
||||
You can whitelist selectors to stop Purgecss from removing them from your CSS. This can be accomplished with the options whitelist and whitelistPatterns.
|
||||
|
||||
### `whitelistPatterns`
|
||||
Type: `Array<RegExp>`
|
||||
|
||||
You can whitelist selectors based on a regular expression with whitelistPatterns.
|
||||
|
||||
### `rejected`
|
||||
Type: `boolean`
|
||||
Default value: `false`
|
||||
|
||||
If true, purged selectors will be captured and rendered as PostCSS messages.
|
||||
Use with a PostCSS reporter plugin like [`postcss-reporter`](https://github.com/postcss/postcss-reporter)
|
||||
to print the purged selectors to the console as they are processed.
|
||||
|
||||
### `keyframes`
|
||||
Type: `boolean`
|
||||
Default value: `false`
|
||||
|
||||
If you are using a CSS animation library such as animate.css, you can remove unused keyframes by setting the keyframes option to true.
|
||||
|
||||
#### `fontFace`
|
||||
Type: `boolean`
|
||||
Default value: `false`
|
||||
|
||||
If there are any unused @font-face rules in your css, you can remove them by setting the fontFace option to true.
|
||||
|
||||
## Contributing
|
||||
|
||||
Please read [CONTRIBUTING.md](./../../CONTRIBUTING.md) for details on our code of
|
||||
conduct, and the process for submitting pull requests to us.
|
||||
|
||||
## Versioning
|
||||
|
||||
postcss-purgecss use [SemVer](http://semver.org/) for versioning.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](./../../LICENSE) file
|
||||
for details.
|
31
themes/piratecare/node_modules/@fullhuman/postcss-purgecss/lib/postcss-purgecss.d.ts
generated
vendored
31
themes/piratecare/node_modules/@fullhuman/postcss-purgecss/lib/postcss-purgecss.d.ts
generated
vendored
|
@ -1,31 +0,0 @@
|
|||
import postcss from "postcss";
|
||||
interface RawContent {
|
||||
extension: string;
|
||||
raw: string;
|
||||
}
|
||||
interface RawCSS {
|
||||
raw: string;
|
||||
}
|
||||
type ExtractorFunction = (content: string) => string[];
|
||||
interface Extractors {
|
||||
extensions: string[];
|
||||
extractor: ExtractorFunction;
|
||||
}
|
||||
interface UserDefinedOptions {
|
||||
content: Array<string | RawContent>;
|
||||
css: Array<string | RawCSS>;
|
||||
defaultExtractor?: ExtractorFunction;
|
||||
extractors?: Array<Extractors>;
|
||||
fontFace?: boolean;
|
||||
keyframes?: boolean;
|
||||
output?: string;
|
||||
rejected?: boolean;
|
||||
stdin?: boolean;
|
||||
stdout?: boolean;
|
||||
variables?: boolean;
|
||||
whitelist?: string[];
|
||||
whitelistPatterns?: Array<RegExp>;
|
||||
whitelistPatternsChildren?: Array<RegExp>;
|
||||
}
|
||||
declare const purgeCSSPlugin: postcss.Plugin<Pick<UserDefinedOptions, "keyframes" | "content" | "extractors" | "defaultExtractor" | "fontFace" | "output" | "rejected" | "stdin" | "stdout" | "variables" | "whitelist" | "whitelistPatterns" | "whitelistPatternsChildren">>;
|
||||
export { purgeCSSPlugin as default };
|
31
themes/piratecare/node_modules/@fullhuman/postcss-purgecss/lib/postcss-purgecss.esm.d.ts
generated
vendored
31
themes/piratecare/node_modules/@fullhuman/postcss-purgecss/lib/postcss-purgecss.esm.d.ts
generated
vendored
|
@ -1,31 +0,0 @@
|
|||
import postcss from "postcss";
|
||||
interface RawContent {
|
||||
extension: string;
|
||||
raw: string;
|
||||
}
|
||||
interface RawCSS {
|
||||
raw: string;
|
||||
}
|
||||
type ExtractorFunction = (content: string) => string[];
|
||||
interface Extractors {
|
||||
extensions: string[];
|
||||
extractor: ExtractorFunction;
|
||||
}
|
||||
interface UserDefinedOptions {
|
||||
content: Array<string | RawContent>;
|
||||
css: Array<string | RawCSS>;
|
||||
defaultExtractor?: ExtractorFunction;
|
||||
extractors?: Array<Extractors>;
|
||||
fontFace?: boolean;
|
||||
keyframes?: boolean;
|
||||
output?: string;
|
||||
rejected?: boolean;
|
||||
stdin?: boolean;
|
||||
stdout?: boolean;
|
||||
variables?: boolean;
|
||||
whitelist?: string[];
|
||||
whitelistPatterns?: Array<RegExp>;
|
||||
whitelistPatternsChildren?: Array<RegExp>;
|
||||
}
|
||||
declare const purgeCSSPlugin: postcss.Plugin<Pick<UserDefinedOptions, "keyframes" | "content" | "extractors" | "defaultExtractor" | "fontFace" | "output" | "rejected" | "stdin" | "stdout" | "variables" | "whitelist" | "whitelistPatterns" | "whitelistPatternsChildren">>;
|
||||
export { purgeCSSPlugin as default };
|
|
@ -1 +0,0 @@
|
|||
import e from"postcss";import s,{mergeExtractorSelectors as o,defaultOptions as t}from"purgecss";const r=e.plugin("postcss-plugin-purgecss",(function(e){return async function(r,n){const c=new s,i={...t,...e};c.options=i;const{content:p,extractors:a}=i,m=p.filter(e=>"string"==typeof e),l=p.filter(e=>"object"==typeof e),u=await c.extractSelectorsFromFiles(m,a),f=c.extractSelectorsFromString(l,a),g=o(u,f);c.walkThroughCSS(r,g),c.options.fontFace&&c.removeUnusedFontFaces(),c.options.keyframes&&c.removeUnusedKeyframes(),c.options.variables&&c.removeUnusedCSSVariables(),c.options.rejected&&c.selectorsRemoved.size>0&&(n.messages.push({type:"purgecss",plugin:"postcss-purgecss",text:`purging ${c.selectorsRemoved.size} selectors:\n ${Array.from(c.selectorsRemoved).map(e=>e.trim()).join("\n ")}`}),c.selectorsRemoved.clear())}}));export default r;
|
1
themes/piratecare/node_modules/@fullhuman/postcss-purgecss/lib/postcss-purgecss.js
generated
vendored
1
themes/piratecare/node_modules/@fullhuman/postcss-purgecss/lib/postcss-purgecss.js
generated
vendored
|
@ -1 +0,0 @@
|
|||
"use strict";function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var postcss=_interopDefault(require("postcss")),PurgeCSS=require("purgecss"),PurgeCSS__default=_interopDefault(PurgeCSS);const purgeCSSPlugin=postcss.plugin("postcss-plugin-purgecss",(function(e){return async function(t,s){const r=new PurgeCSS__default,o={...PurgeCSS.defaultOptions,...e};r.options=o;const{content:n,extractors:u}=o,c=n.filter(e=>"string"==typeof e),i=n.filter(e=>"object"==typeof e),p=await r.extractSelectorsFromFiles(c,u),a=r.extractSelectorsFromString(i,u),l=PurgeCSS.mergeExtractorSelectors(p,a);r.walkThroughCSS(t,l),r.options.fontFace&&r.removeUnusedFontFaces(),r.options.keyframes&&r.removeUnusedKeyframes(),r.options.variables&&r.removeUnusedCSSVariables(),r.options.rejected&&r.selectorsRemoved.size>0&&(s.messages.push({type:"purgecss",plugin:"postcss-purgecss",text:`purging ${r.selectorsRemoved.size} selectors:\n ${Array.from(r.selectorsRemoved).map(e=>e.trim()).join("\n ")}`}),r.selectorsRemoved.clear())}}));module.exports=purgeCSSPlugin;
|
|
@ -1,66 +0,0 @@
|
|||
{
|
||||
"_args": [
|
||||
[
|
||||
"@fullhuman/postcss-purgecss@2.0.6",
|
||||
"/tmp/tailwind-hugo"
|
||||
]
|
||||
],
|
||||
"_development": true,
|
||||
"_from": "@fullhuman/postcss-purgecss@2.0.6",
|
||||
"_id": "@fullhuman/postcss-purgecss@2.0.6",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-RgD05Yd1VFudo1H1b2inb+10AS1mexp1edHfdoJvoeKaoMVoi/9DWrbWOpIrDmKq1CO82oQrb5wf4V64oaNkKQ==",
|
||||
"_location": "/@fullhuman/postcss-purgecss",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "@fullhuman/postcss-purgecss@2.0.6",
|
||||
"name": "@fullhuman/postcss-purgecss",
|
||||
"escapedName": "@fullhuman%2fpostcss-purgecss",
|
||||
"scope": "@fullhuman",
|
||||
"rawSpec": "2.0.6",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.0.6"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#DEV:/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.0.6.tgz",
|
||||
"_spec": "2.0.6",
|
||||
"_where": "/tmp/tailwind-hugo",
|
||||
"author": {
|
||||
"name": "FoundrySH",
|
||||
"email": "no-reply@foundry.sh"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/FullHuman/purgecss/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"postcss": "7.0.26",
|
||||
"purgecss": "^2.0.6"
|
||||
},
|
||||
"description": "PostCSS plugin for PurgeCSS",
|
||||
"directories": {
|
||||
"lib": "lib",
|
||||
"test": "__tests__"
|
||||
},
|
||||
"files": [
|
||||
"lib"
|
||||
],
|
||||
"gitHead": "11f76506924277ec6833e0cd7d0798676b4ac9ef",
|
||||
"homepage": "https://github.com/FullHuman/purgecss#readme",
|
||||
"license": "MIT",
|
||||
"main": "lib/postcss-purgecss.js",
|
||||
"module": "lib/postcss-purgecss.esm.js",
|
||||
"name": "@fullhuman/postcss-purgecss",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/FullHuman/purgecss.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||
},
|
||||
"types": "lib/postcss-purgecss.d.ts",
|
||||
"version": "2.0.6"
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Denis Malinochkin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -1,171 +0,0 @@
|
|||
# @nodelib/fs.scandir
|
||||
|
||||
> List files and directories inside the specified directory.
|
||||
|
||||
## :bulb: Highlights
|
||||
|
||||
The package is aimed at obtaining information about entries in the directory.
|
||||
|
||||
* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional).
|
||||
* :gear: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type. See [`old` and `modern` mode](#old-and-modern-mode).
|
||||
* :link: Can safely work with broken symbolic links.
|
||||
|
||||
## Install
|
||||
|
||||
```console
|
||||
npm install @nodelib/fs.scandir
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```ts
|
||||
import * as fsScandir from '@nodelib/fs.scandir';
|
||||
|
||||
fsScandir.scandir('path', (error, stats) => { /* … */ });
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### .scandir(path, [optionsOrSettings], callback)
|
||||
|
||||
Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path with standard callback-style.
|
||||
|
||||
```ts
|
||||
fsScandir.scandir('path', (error, entries) => { /* … */ });
|
||||
fsScandir.scandir('path', {}, (error, entries) => { /* … */ });
|
||||
fsScandir.scandir('path', new fsScandir.Settings(), (error, entries) => { /* … */ });
|
||||
```
|
||||
|
||||
### .scandirSync(path, [optionsOrSettings])
|
||||
|
||||
Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path.
|
||||
|
||||
```ts
|
||||
const entries = fsScandir.scandirSync('path');
|
||||
const entries = fsScandir.scandirSync('path', {});
|
||||
const entries = fsScandir.scandirSync(('path', new fsScandir.Settings());
|
||||
```
|
||||
|
||||
#### path
|
||||
|
||||
* Required: `true`
|
||||
* Type: `string | Buffer | URL`
|
||||
|
||||
A path to a file. If a URL is provided, it must use the `file:` protocol.
|
||||
|
||||
#### optionsOrSettings
|
||||
|
||||
* Required: `false`
|
||||
* Type: `Options | Settings`
|
||||
* Default: An instance of `Settings` class
|
||||
|
||||
An [`Options`](#options) object or an instance of [`Settings`](#settingsoptions) class.
|
||||
|
||||
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class.
|
||||
|
||||
### Settings([options])
|
||||
|
||||
A class of full settings of the package.
|
||||
|
||||
```ts
|
||||
const settings = new fsScandir.Settings({ followSymbolicLinks: false });
|
||||
|
||||
const entries = fsScandir.scandirSync('path', settings);
|
||||
```
|
||||
|
||||
## Entry
|
||||
|
||||
* `name` — The name of the entry (`unknown.txt`).
|
||||
* `path` — The path of the entry relative to call directory (`root/unknown.txt`).
|
||||
* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. On Node.js below 10.10 will be emulated by [`DirentFromStats`](./src/utils/fs.ts) class.
|
||||
* `stats` (optional) — An instance of `fs.Stats` class.
|
||||
|
||||
For example, the `scandir` call for `tools` directory with one directory inside:
|
||||
|
||||
```ts
|
||||
{
|
||||
dirent: Dirent { name: 'typedoc', /* … */ },
|
||||
name: 'typedoc',
|
||||
path: 'tools/typedoc'
|
||||
}
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
### stats
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `false`
|
||||
|
||||
Adds an instance of `fs.Stats` class to the [`Entry`](#entry).
|
||||
|
||||
> :book: Always use `fs.readdir` without the `withFileTypes` option. ??TODO??
|
||||
|
||||
### followSymbolicLinks
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `false`
|
||||
|
||||
Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`.
|
||||
|
||||
### `throwErrorOnBrokenSymbolicLink`
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `true`
|
||||
|
||||
Throw an error when symbolic link is broken if `true` or safely use `lstat` call if `false`.
|
||||
|
||||
### `pathSegmentSeparator`
|
||||
|
||||
* Type: `string`
|
||||
* Default: `path.sep`
|
||||
|
||||
By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead.
|
||||
|
||||
### `fs`
|
||||
|
||||
* Type: [`FileSystemAdapter`](./src/adapters/fs.ts)
|
||||
* Default: A default FS methods
|
||||
|
||||
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own.
|
||||
|
||||
```ts
|
||||
interface FileSystemAdapter {
|
||||
lstat?: typeof fs.lstat;
|
||||
stat?: typeof fs.stat;
|
||||
lstatSync?: typeof fs.lstatSync;
|
||||
statSync?: typeof fs.statSync;
|
||||
readdir?: typeof fs.readdir;
|
||||
readdirSync?: typeof fs.readdirSync;
|
||||
}
|
||||
|
||||
const settings = new fsScandir.Settings({
|
||||
fs: { lstat: fakeLstat }
|
||||
});
|
||||
```
|
||||
|
||||
## `old` and `modern` mode
|
||||
|
||||
This package has two modes that are used depending on the environment and parameters of use.
|
||||
|
||||
### old
|
||||
|
||||
* Node.js below `10.10` or when the `stats` option is enabled
|
||||
|
||||
When working in the old mode, the directory is read first (`fs.readdir`), then the type of entries is determined (`fs.lstat` and/or `fs.stat` for symbolic links).
|
||||
|
||||
### modern
|
||||
|
||||
* Node.js 10.10+ and the `stats` option is disabled
|
||||
|
||||
In the modern mode, reading the directory (`fs.readdir` with the `withFileTypes` option) is combined with obtaining information about its entries. An additional call for symbolic links (`fs.stat`) is still present.
|
||||
|
||||
This mode makes fewer calls to the file system. It's faster.
|
||||
|
||||
## Changelog
|
||||
|
||||
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version.
|
||||
|
||||
## License
|
||||
|
||||
This software is released under the terms of the MIT license.
|
|
@ -1,13 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import * as fs from 'fs';
|
||||
export declare type FileSystemAdapter = {
|
||||
lstat: typeof fs.lstat;
|
||||
stat: typeof fs.stat;
|
||||
lstatSync: typeof fs.lstatSync;
|
||||
statSync: typeof fs.statSync;
|
||||
readdir: typeof fs.readdir;
|
||||
readdirSync: typeof fs.readdirSync;
|
||||
};
|
||||
export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter;
|
||||
export declare function createFileSystemAdapter(fsMethods?: Partial<FileSystemAdapter>): FileSystemAdapter;
|
||||
//# sourceMappingURL=fs.d.ts.map
|
|
@ -1,18 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fs = require("fs");
|
||||
exports.FILE_SYSTEM_ADAPTER = {
|
||||
lstat: fs.lstat,
|
||||
stat: fs.stat,
|
||||
lstatSync: fs.lstatSync,
|
||||
statSync: fs.statSync,
|
||||
readdir: fs.readdir,
|
||||
readdirSync: fs.readdirSync
|
||||
};
|
||||
function createFileSystemAdapter(fsMethods) {
|
||||
if (fsMethods === undefined) {
|
||||
return exports.FILE_SYSTEM_ADAPTER;
|
||||
}
|
||||
return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);
|
||||
}
|
||||
exports.createFileSystemAdapter = createFileSystemAdapter;
|
|
@ -1,5 +0,0 @@
|
|||
/**
|
||||
* IS `true` for Node.js 10.10 and greater.
|
||||
*/
|
||||
export declare const IS_SUPPORT_READDIR_WITH_FILE_TYPES: boolean;
|
||||
//# sourceMappingURL=constants.d.ts.map
|
|
@ -1,13 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');
|
||||
const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);
|
||||
const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);
|
||||
const SUPPORTED_MAJOR_VERSION = 10;
|
||||
const SUPPORTED_MINOR_VERSION = 10;
|
||||
const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;
|
||||
const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;
|
||||
/**
|
||||
* IS `true` for Node.js 10.10 and greater.
|
||||
*/
|
||||
exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;
|
|
@ -1,13 +0,0 @@
|
|||
import { FileSystemAdapter } from './adapters/fs';
|
||||
import * as async from './providers/async';
|
||||
import Settings, { Options } from './settings';
|
||||
import { Dirent, Entry } from './types';
|
||||
declare type AsyncCallback = async.AsyncCallback;
|
||||
declare function scandir(path: string, callback: AsyncCallback): void;
|
||||
declare function scandir(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void;
|
||||
declare namespace scandir {
|
||||
function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise<Entry[]>;
|
||||
}
|
||||
declare function scandirSync(path: string, optionsOrSettings?: Options | Settings): Entry[];
|
||||
export { scandir, scandirSync, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, Options };
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -1,24 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const async = require("./providers/async");
|
||||
const sync = require("./providers/sync");
|
||||
const settings_1 = require("./settings");
|
||||
exports.Settings = settings_1.default;
|
||||
function scandir(path, optionsOrSettingsOrCallback, callback) {
|
||||
if (typeof optionsOrSettingsOrCallback === 'function') {
|
||||
return async.read(path, getSettings(), optionsOrSettingsOrCallback);
|
||||
}
|
||||
async.read(path, getSettings(optionsOrSettingsOrCallback), callback);
|
||||
}
|
||||
exports.scandir = scandir;
|
||||
function scandirSync(path, optionsOrSettings) {
|
||||
const settings = getSettings(optionsOrSettings);
|
||||
return sync.read(path, settings);
|
||||
}
|
||||
exports.scandirSync = scandirSync;
|
||||
function getSettings(settingsOrOptions = {}) {
|
||||
if (settingsOrOptions instanceof settings_1.default) {
|
||||
return settingsOrOptions;
|
||||
}
|
||||
return new settings_1.default(settingsOrOptions);
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import Settings from '../settings';
|
||||
import { Entry } from '../types';
|
||||
export declare type AsyncCallback = (err: NodeJS.ErrnoException, entries: Entry[]) => void;
|
||||
export declare function read(directory: string, settings: Settings, callback: AsyncCallback): void;
|
||||
export declare function readdirWithFileTypes(directory: string, settings: Settings, callback: AsyncCallback): void;
|
||||
export declare function readdir(directory: string, settings: Settings, callback: AsyncCallback): void;
|
||||
//# sourceMappingURL=async.d.ts.map
|
|
@ -1,90 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fsStat = require("@nodelib/fs.stat");
|
||||
const rpl = require("run-parallel");
|
||||
const constants_1 = require("../constants");
|
||||
const utils = require("../utils");
|
||||
function read(directory, settings, callback) {
|
||||
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
|
||||
return readdirWithFileTypes(directory, settings, callback);
|
||||
}
|
||||
return readdir(directory, settings, callback);
|
||||
}
|
||||
exports.read = read;
|
||||
function readdirWithFileTypes(directory, settings, callback) {
|
||||
settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {
|
||||
if (readdirError !== null) {
|
||||
return callFailureCallback(callback, readdirError);
|
||||
}
|
||||
const entries = dirents.map((dirent) => ({
|
||||
dirent,
|
||||
name: dirent.name,
|
||||
path: `${directory}${settings.pathSegmentSeparator}${dirent.name}`
|
||||
}));
|
||||
if (!settings.followSymbolicLinks) {
|
||||
return callSuccessCallback(callback, entries);
|
||||
}
|
||||
const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));
|
||||
rpl(tasks, (rplError, rplEntries) => {
|
||||
if (rplError !== null) {
|
||||
return callFailureCallback(callback, rplError);
|
||||
}
|
||||
callSuccessCallback(callback, rplEntries);
|
||||
});
|
||||
});
|
||||
}
|
||||
exports.readdirWithFileTypes = readdirWithFileTypes;
|
||||
function makeRplTaskEntry(entry, settings) {
|
||||
return (done) => {
|
||||
if (!entry.dirent.isSymbolicLink()) {
|
||||
return done(null, entry);
|
||||
}
|
||||
settings.fs.stat(entry.path, (statError, stats) => {
|
||||
if (statError !== null) {
|
||||
if (settings.throwErrorOnBrokenSymbolicLink) {
|
||||
return done(statError);
|
||||
}
|
||||
return done(null, entry);
|
||||
}
|
||||
entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);
|
||||
return done(null, entry);
|
||||
});
|
||||
};
|
||||
}
|
||||
function readdir(directory, settings, callback) {
|
||||
settings.fs.readdir(directory, (readdirError, names) => {
|
||||
if (readdirError !== null) {
|
||||
return callFailureCallback(callback, readdirError);
|
||||
}
|
||||
const filepaths = names.map((name) => `${directory}${settings.pathSegmentSeparator}${name}`);
|
||||
const tasks = filepaths.map((filepath) => {
|
||||
return (done) => fsStat.stat(filepath, settings.fsStatSettings, done);
|
||||
});
|
||||
rpl(tasks, (rplError, results) => {
|
||||
if (rplError !== null) {
|
||||
return callFailureCallback(callback, rplError);
|
||||
}
|
||||
const entries = [];
|
||||
names.forEach((name, index) => {
|
||||
const stats = results[index];
|
||||
const entry = {
|
||||
name,
|
||||
path: filepaths[index],
|
||||
dirent: utils.fs.createDirentFromStats(name, stats)
|
||||
};
|
||||
if (settings.stats) {
|
||||
entry.stats = stats;
|
||||
}
|
||||
entries.push(entry);
|
||||
});
|
||||
callSuccessCallback(callback, entries);
|
||||
});
|
||||
});
|
||||
}
|
||||
exports.readdir = readdir;
|
||||
function callFailureCallback(callback, error) {
|
||||
callback(error);
|
||||
}
|
||||
function callSuccessCallback(callback, result) {
|
||||
callback(null, result);
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
import Settings from '../settings';
|
||||
import { Entry } from '../types';
|
||||
export declare function read(directory: string, settings: Settings): Entry[];
|
||||
export declare function readdirWithFileTypes(directory: string, settings: Settings): Entry[];
|
||||
export declare function readdir(directory: string, settings: Settings): Entry[];
|
||||
//# sourceMappingURL=sync.d.ts.map
|
|
@ -1,52 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fsStat = require("@nodelib/fs.stat");
|
||||
const constants_1 = require("../constants");
|
||||
const utils = require("../utils");
|
||||
function read(directory, settings) {
|
||||
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {
|
||||
return readdirWithFileTypes(directory, settings);
|
||||
}
|
||||
return readdir(directory, settings);
|
||||
}
|
||||
exports.read = read;
|
||||
function readdirWithFileTypes(directory, settings) {
|
||||
const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });
|
||||
return dirents.map((dirent) => {
|
||||
const entry = {
|
||||
dirent,
|
||||
name: dirent.name,
|
||||
path: `${directory}${settings.pathSegmentSeparator}${dirent.name}`
|
||||
};
|
||||
if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {
|
||||
try {
|
||||
const stats = settings.fs.statSync(entry.path);
|
||||
entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);
|
||||
}
|
||||
catch (error) {
|
||||
if (settings.throwErrorOnBrokenSymbolicLink) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
return entry;
|
||||
});
|
||||
}
|
||||
exports.readdirWithFileTypes = readdirWithFileTypes;
|
||||
function readdir(directory, settings) {
|
||||
const names = settings.fs.readdirSync(directory);
|
||||
return names.map((name) => {
|
||||
const entryPath = `${directory}${settings.pathSegmentSeparator}${name}`;
|
||||
const stats = fsStat.statSync(entryPath, settings.fsStatSettings);
|
||||
const entry = {
|
||||
name,
|
||||
path: entryPath,
|
||||
dirent: utils.fs.createDirentFromStats(name, stats)
|
||||
};
|
||||
if (settings.stats) {
|
||||
entry.stats = stats;
|
||||
}
|
||||
return entry;
|
||||
});
|
||||
}
|
||||
exports.readdir = readdir;
|
|
@ -1,21 +0,0 @@
|
|||
import * as fsStat from '@nodelib/fs.stat';
|
||||
import * as fs from './adapters/fs';
|
||||
export declare type Options = {
|
||||
followSymbolicLinks?: boolean;
|
||||
fs?: Partial<fs.FileSystemAdapter>;
|
||||
pathSegmentSeparator?: string;
|
||||
stats?: boolean;
|
||||
throwErrorOnBrokenSymbolicLink?: boolean;
|
||||
};
|
||||
export default class Settings {
|
||||
private readonly _options;
|
||||
readonly followSymbolicLinks: boolean;
|
||||
readonly fs: fs.FileSystemAdapter;
|
||||
readonly pathSegmentSeparator: string;
|
||||
readonly stats: boolean;
|
||||
readonly throwErrorOnBrokenSymbolicLink: boolean;
|
||||
readonly fsStatSettings: fsStat.Settings;
|
||||
constructor(_options?: Options);
|
||||
private _getValue;
|
||||
}
|
||||
//# sourceMappingURL=settings.d.ts.map
|
|
@ -1,24 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const path = require("path");
|
||||
const fsStat = require("@nodelib/fs.stat");
|
||||
const fs = require("./adapters/fs");
|
||||
class Settings {
|
||||
constructor(_options = {}) {
|
||||
this._options = _options;
|
||||
this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);
|
||||
this.fs = fs.createFileSystemAdapter(this._options.fs);
|
||||
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);
|
||||
this.stats = this._getValue(this._options.stats, false);
|
||||
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
|
||||
this.fsStatSettings = new fsStat.Settings({
|
||||
followSymbolicLink: this.followSymbolicLinks,
|
||||
fs: this.fs,
|
||||
throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink
|
||||
});
|
||||
}
|
||||
_getValue(option, value) {
|
||||
return option === undefined ? value : option;
|
||||
}
|
||||
}
|
||||
exports.default = Settings;
|
|
@ -1,20 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import * as fs from 'fs';
|
||||
export declare type Entry = {
|
||||
dirent: Dirent;
|
||||
name: string;
|
||||
path: string;
|
||||
stats?: Stats;
|
||||
};
|
||||
export declare type Stats = fs.Stats;
|
||||
export declare type Dirent = {
|
||||
isBlockDevice(): boolean;
|
||||
isCharacterDevice(): boolean;
|
||||
isDirectory(): boolean;
|
||||
isFIFO(): boolean;
|
||||
isFile(): boolean;
|
||||
isSocket(): boolean;
|
||||
isSymbolicLink(): boolean;
|
||||
name: string;
|
||||
};
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -1,2 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@ -1,3 +0,0 @@
|
|||
import { Dirent, Stats } from '../types';
|
||||
export declare function createDirentFromStats(name: string, stats: Stats): Dirent;
|
||||
//# sourceMappingURL=fs.d.ts.map
|
|
@ -1,18 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
class DirentFromStats {
|
||||
constructor(name, stats) {
|
||||
this.name = name;
|
||||
this.isBlockDevice = stats.isBlockDevice.bind(stats);
|
||||
this.isCharacterDevice = stats.isCharacterDevice.bind(stats);
|
||||
this.isDirectory = stats.isDirectory.bind(stats);
|
||||
this.isFIFO = stats.isFIFO.bind(stats);
|
||||
this.isFile = stats.isFile.bind(stats);
|
||||
this.isSocket = stats.isSocket.bind(stats);
|
||||
this.isSymbolicLink = stats.isSymbolicLink.bind(stats);
|
||||
}
|
||||
}
|
||||
function createDirentFromStats(name, stats) {
|
||||
return new DirentFromStats(name, stats);
|
||||
}
|
||||
exports.createDirentFromStats = createDirentFromStats;
|
|
@ -1,3 +0,0 @@
|
|||
import * as fs from './fs';
|
||||
export { fs };
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -1,4 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fs = require("./fs");
|
||||
exports.fs = fs;
|
|
@ -1,68 +0,0 @@
|
|||
{
|
||||
"_args": [
|
||||
[
|
||||
"@nodelib/fs.scandir@2.1.3",
|
||||
"/tmp/tailwind-hugo"
|
||||
]
|
||||
],
|
||||
"_development": true,
|
||||
"_from": "@nodelib/fs.scandir@2.1.3",
|
||||
"_id": "@nodelib/fs.scandir@2.1.3",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
|
||||
"_location": "/@nodelib/fs.scandir",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "@nodelib/fs.scandir@2.1.3",
|
||||
"name": "@nodelib/fs.scandir",
|
||||
"escapedName": "@nodelib%2ffs.scandir",
|
||||
"scope": "@nodelib",
|
||||
"rawSpec": "2.1.3",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.1.3"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/@nodelib/fs.walk"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
|
||||
"_spec": "2.1.3",
|
||||
"_where": "/tmp/tailwind-hugo",
|
||||
"dependencies": {
|
||||
"@nodelib/fs.stat": "2.0.3",
|
||||
"run-parallel": "^1.1.9"
|
||||
},
|
||||
"description": "List files and directories inside the specified directory",
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
},
|
||||
"gitHead": "3b1ef7554ad7c061b3580858101d483fba847abf",
|
||||
"keywords": [
|
||||
"NodeLib",
|
||||
"fs",
|
||||
"FileSystem",
|
||||
"file system",
|
||||
"scandir",
|
||||
"readdir",
|
||||
"dirent"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "out/index.js",
|
||||
"name": "@nodelib/fs.scandir",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "npm run clean && npm run compile && npm run lint && npm test",
|
||||
"clean": "rimraf {tsconfig.tsbuildinfo,out}",
|
||||
"compile": "tsc -b .",
|
||||
"compile:watch": "tsc -p . --watch --sourceMap",
|
||||
"lint": "eslint \"src/**/*.ts\" --cache",
|
||||
"test": "mocha \"out/**/*.spec.js\" -s 0",
|
||||
"watch": "npm run clean && npm run compile:watch"
|
||||
},
|
||||
"typings": "out/index.d.ts",
|
||||
"version": "2.1.3"
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Denis Malinochkin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -1,126 +0,0 @@
|
|||
# @nodelib/fs.stat
|
||||
|
||||
> Get the status of a file with some features.
|
||||
|
||||
## :bulb: Highlights
|
||||
|
||||
Wrapper around standard method `fs.lstat` and `fs.stat` with some features.
|
||||
|
||||
* :beginner: Normally follows symbolic link.
|
||||
* :gear: Can safely work with broken symbolic link.
|
||||
|
||||
## Install
|
||||
|
||||
```console
|
||||
npm install @nodelib/fs.stat
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```ts
|
||||
import * as fsStat from '@nodelib/fs.stat';
|
||||
|
||||
fsStat.stat('path', (error, stats) => { /* … */ });
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### .stat(path, [optionsOrSettings], callback)
|
||||
|
||||
Returns an instance of `fs.Stats` class for provided path with standard callback-style.
|
||||
|
||||
```ts
|
||||
fsStat.stat('path', (error, stats) => { /* … */ });
|
||||
fsStat.stat('path', {}, (error, stats) => { /* … */ });
|
||||
fsStat.stat('path', new fsStat.Settings(), (error, stats) => { /* … */ });
|
||||
```
|
||||
|
||||
### .statSync(path, [optionsOrSettings])
|
||||
|
||||
Returns an instance of `fs.Stats` class for provided path.
|
||||
|
||||
```ts
|
||||
const stats = fsStat.stat('path');
|
||||
const stats = fsStat.stat('path', {});
|
||||
const stats = fsStat.stat('path', new fsStat.Settings());
|
||||
```
|
||||
|
||||
#### path
|
||||
|
||||
* Required: `true`
|
||||
* Type: `string | Buffer | URL`
|
||||
|
||||
A path to a file. If a URL is provided, it must use the `file:` protocol.
|
||||
|
||||
#### optionsOrSettings
|
||||
|
||||
* Required: `false`
|
||||
* Type: `Options | Settings`
|
||||
* Default: An instance of `Settings` class
|
||||
|
||||
An [`Options`](#options) object or an instance of [`Settings`](#settings) class.
|
||||
|
||||
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class.
|
||||
|
||||
### Settings([options])
|
||||
|
||||
A class of full settings of the package.
|
||||
|
||||
```ts
|
||||
const settings = new fsStat.Settings({ followSymbolicLink: false });
|
||||
|
||||
const stats = fsStat.stat('path', settings);
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
### `followSymbolicLink`
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `true`
|
||||
|
||||
Follow symbolic link or not. Call `fs.stat` on symbolic link if `true`.
|
||||
|
||||
### `markSymbolicLink`
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `false`
|
||||
|
||||
Mark symbolic link by setting the return value of `isSymbolicLink` function to always `true` (even after `fs.stat`).
|
||||
|
||||
> :book: Can be used if you want to know what is hidden behind a symbolic link, but still continue to know that it is a symbolic link.
|
||||
|
||||
### `throwErrorOnBrokenSymbolicLink`
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `true`
|
||||
|
||||
Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`.
|
||||
|
||||
### `fs`
|
||||
|
||||
* Type: [`FileSystemAdapter`](./src/adapters/fs.ts)
|
||||
* Default: A default FS methods
|
||||
|
||||
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own.
|
||||
|
||||
```ts
|
||||
interface FileSystemAdapter {
|
||||
lstat?: typeof fs.lstat;
|
||||
stat?: typeof fs.stat;
|
||||
lstatSync?: typeof fs.lstatSync;
|
||||
statSync?: typeof fs.statSync;
|
||||
}
|
||||
|
||||
const settings = new fsStat.Settings({
|
||||
fs: { lstat: fakeLstat }
|
||||
});
|
||||
```
|
||||
|
||||
## Changelog
|
||||
|
||||
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version.
|
||||
|
||||
## License
|
||||
|
||||
This software is released under the terms of the MIT license.
|
|
@ -1,11 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import * as fs from 'fs';
|
||||
export declare type FileSystemAdapter = {
|
||||
lstat: typeof fs.lstat;
|
||||
stat: typeof fs.stat;
|
||||
lstatSync: typeof fs.lstatSync;
|
||||
statSync: typeof fs.statSync;
|
||||
};
|
||||
export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter;
|
||||
export declare function createFileSystemAdapter(fsMethods?: Partial<FileSystemAdapter>): FileSystemAdapter;
|
||||
//# sourceMappingURL=fs.d.ts.map
|
|
@ -1,16 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fs = require("fs");
|
||||
exports.FILE_SYSTEM_ADAPTER = {
|
||||
lstat: fs.lstat,
|
||||
stat: fs.stat,
|
||||
lstatSync: fs.lstatSync,
|
||||
statSync: fs.statSync
|
||||
};
|
||||
function createFileSystemAdapter(fsMethods) {
|
||||
if (fsMethods === undefined) {
|
||||
return exports.FILE_SYSTEM_ADAPTER;
|
||||
}
|
||||
return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);
|
||||
}
|
||||
exports.createFileSystemAdapter = createFileSystemAdapter;
|
|
@ -1,13 +0,0 @@
|
|||
import { FileSystemAdapter } from './adapters/fs';
|
||||
import * as async from './providers/async';
|
||||
import Settings, { Options } from './settings';
|
||||
import { Stats } from './types';
|
||||
declare type AsyncCallback = async.AsyncCallback;
|
||||
declare function stat(path: string, callback: AsyncCallback): void;
|
||||
declare function stat(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void;
|
||||
declare namespace stat {
|
||||
function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise<Stats>;
|
||||
}
|
||||
declare function statSync(path: string, optionsOrSettings?: Options | Settings): Stats;
|
||||
export { Settings, stat, statSync, AsyncCallback, FileSystemAdapter, Options, Stats };
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -1,24 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const async = require("./providers/async");
|
||||
const sync = require("./providers/sync");
|
||||
const settings_1 = require("./settings");
|
||||
exports.Settings = settings_1.default;
|
||||
function stat(path, optionsOrSettingsOrCallback, callback) {
|
||||
if (typeof optionsOrSettingsOrCallback === 'function') {
|
||||
return async.read(path, getSettings(), optionsOrSettingsOrCallback);
|
||||
}
|
||||
async.read(path, getSettings(optionsOrSettingsOrCallback), callback);
|
||||
}
|
||||
exports.stat = stat;
|
||||
function statSync(path, optionsOrSettings) {
|
||||
const settings = getSettings(optionsOrSettings);
|
||||
return sync.read(path, settings);
|
||||
}
|
||||
exports.statSync = statSync;
|
||||
function getSettings(settingsOrOptions = {}) {
|
||||
if (settingsOrOptions instanceof settings_1.default) {
|
||||
return settingsOrOptions;
|
||||
}
|
||||
return new settings_1.default(settingsOrOptions);
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import Settings from '../settings';
|
||||
import { ErrnoException, Stats } from '../types';
|
||||
export declare type AsyncCallback = (err: ErrnoException, stats: Stats) => void;
|
||||
export declare function read(path: string, settings: Settings, callback: AsyncCallback): void;
|
||||
//# sourceMappingURL=async.d.ts.map
|
|
@ -1,31 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
function read(path, settings, callback) {
|
||||
settings.fs.lstat(path, (lstatError, lstat) => {
|
||||
if (lstatError !== null) {
|
||||
return callFailureCallback(callback, lstatError);
|
||||
}
|
||||
if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
|
||||
return callSuccessCallback(callback, lstat);
|
||||
}
|
||||
settings.fs.stat(path, (statError, stat) => {
|
||||
if (statError !== null) {
|
||||
if (settings.throwErrorOnBrokenSymbolicLink) {
|
||||
return callFailureCallback(callback, statError);
|
||||
}
|
||||
return callSuccessCallback(callback, lstat);
|
||||
}
|
||||
if (settings.markSymbolicLink) {
|
||||
stat.isSymbolicLink = () => true;
|
||||
}
|
||||
callSuccessCallback(callback, stat);
|
||||
});
|
||||
});
|
||||
}
|
||||
exports.read = read;
|
||||
function callFailureCallback(callback, error) {
|
||||
callback(error);
|
||||
}
|
||||
function callSuccessCallback(callback, result) {
|
||||
callback(null, result);
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
import Settings from '../settings';
|
||||
import { Stats } from '../types';
|
||||
export declare function read(path: string, settings: Settings): Stats;
|
||||
//# sourceMappingURL=sync.d.ts.map
|
|
@ -1,22 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
function read(path, settings) {
|
||||
const lstat = settings.fs.lstatSync(path);
|
||||
if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
|
||||
return lstat;
|
||||
}
|
||||
try {
|
||||
const stat = settings.fs.statSync(path);
|
||||
if (settings.markSymbolicLink) {
|
||||
stat.isSymbolicLink = () => true;
|
||||
}
|
||||
return stat;
|
||||
}
|
||||
catch (error) {
|
||||
if (!settings.throwErrorOnBrokenSymbolicLink) {
|
||||
return lstat;
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
exports.read = read;
|
|
@ -1,17 +0,0 @@
|
|||
import * as fs from './adapters/fs';
|
||||
export declare type Options = {
|
||||
followSymbolicLink?: boolean;
|
||||
fs?: Partial<fs.FileSystemAdapter>;
|
||||
markSymbolicLink?: boolean;
|
||||
throwErrorOnBrokenSymbolicLink?: boolean;
|
||||
};
|
||||
export default class Settings {
|
||||
private readonly _options;
|
||||
readonly followSymbolicLink: boolean;
|
||||
readonly fs: fs.FileSystemAdapter;
|
||||
readonly markSymbolicLink: boolean;
|
||||
readonly throwErrorOnBrokenSymbolicLink: boolean;
|
||||
constructor(_options?: Options);
|
||||
private _getValue;
|
||||
}
|
||||
//# sourceMappingURL=settings.d.ts.map
|
|
@ -1,16 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fs = require("./adapters/fs");
|
||||
class Settings {
|
||||
constructor(_options = {}) {
|
||||
this._options = _options;
|
||||
this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);
|
||||
this.fs = fs.createFileSystemAdapter(this._options.fs);
|
||||
this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);
|
||||
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
|
||||
}
|
||||
_getValue(option, value) {
|
||||
return option === undefined ? value : option;
|
||||
}
|
||||
}
|
||||
exports.default = Settings;
|
|
@ -1,5 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import * as fs from 'fs';
|
||||
export declare type Stats = fs.Stats;
|
||||
export declare type ErrnoException = NodeJS.ErrnoException;
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -1,2 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@ -1,63 +0,0 @@
|
|||
{
|
||||
"_args": [
|
||||
[
|
||||
"@nodelib/fs.stat@2.0.3",
|
||||
"/tmp/tailwind-hugo"
|
||||
]
|
||||
],
|
||||
"_development": true,
|
||||
"_from": "@nodelib/fs.stat@2.0.3",
|
||||
"_id": "@nodelib/fs.stat@2.0.3",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
|
||||
"_location": "/@nodelib/fs.stat",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "@nodelib/fs.stat@2.0.3",
|
||||
"name": "@nodelib/fs.stat",
|
||||
"escapedName": "@nodelib%2ffs.stat",
|
||||
"scope": "@nodelib",
|
||||
"rawSpec": "2.0.3",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.0.3"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/@nodelib/fs.scandir",
|
||||
"/fast-glob"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
|
||||
"_spec": "2.0.3",
|
||||
"_where": "/tmp/tailwind-hugo",
|
||||
"description": "Get the status of a file with some features",
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
},
|
||||
"gitHead": "3b1ef7554ad7c061b3580858101d483fba847abf",
|
||||
"keywords": [
|
||||
"NodeLib",
|
||||
"fs",
|
||||
"FileSystem",
|
||||
"file system",
|
||||
"stat"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "out/index.js",
|
||||
"name": "@nodelib/fs.stat",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "npm run clean && npm run compile && npm run lint && npm test",
|
||||
"clean": "rimraf {tsconfig.tsbuildinfo,out}",
|
||||
"compile": "tsc -b .",
|
||||
"compile:watch": "tsc -p . --watch --sourceMap",
|
||||
"lint": "eslint \"src/**/*.ts\" --cache",
|
||||
"test": "mocha \"out/**/*.spec.js\" -s 0",
|
||||
"watch": "npm run clean && npm run compile:watch"
|
||||
},
|
||||
"typings": "out/index.d.ts",
|
||||
"version": "2.0.3"
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Denis Malinochkin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -1,215 +0,0 @@
|
|||
# @nodelib/fs.walk
|
||||
|
||||
> A library for efficiently walking a directory recursively.
|
||||
|
||||
## :bulb: Highlights
|
||||
|
||||
* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional).
|
||||
* :rocket: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type for performance reasons. See [`old` and `modern` mode](https://github.com/nodelib/nodelib/blob/master/packages/fs/fs.scandir/README.md#old-and-modern-mode).
|
||||
* :gear: Built-in directories/files and error filtering system.
|
||||
* :link: Can safely work with broken symbolic links.
|
||||
|
||||
## Install
|
||||
|
||||
```console
|
||||
npm install @nodelib/fs.walk
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```ts
|
||||
import * as fsWalk from '@nodelib/fs.walk';
|
||||
|
||||
fsWalk.walk('path', (error, entries) => { /* … */ });
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### .walk(path, [optionsOrSettings], callback)
|
||||
|
||||
Reads the directory recursively and asynchronously. Requires a callback function.
|
||||
|
||||
> :book: If you want to use the Promise API, use `util.promisify`.
|
||||
|
||||
```ts
|
||||
fsWalk.walk('path', (error, entries) => { /* … */ });
|
||||
fsWalk.walk('path', {}, (error, entries) => { /* … */ });
|
||||
fsWalk.walk('path', new fsWalk.Settings(), (error, entries) => { /* … */ });
|
||||
```
|
||||
|
||||
### .walkStream(path, [optionsOrSettings])
|
||||
|
||||
Reads the directory recursively and asynchronously. [Readable Stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#stream_readable_streams) is used as a provider.
|
||||
|
||||
```ts
|
||||
const stream = fsWalk.walkStream('path');
|
||||
const stream = fsWalk.walkStream('path', {});
|
||||
const stream = fsWalk.walkStream('path', new fsWalk.Settings());
|
||||
```
|
||||
|
||||
### .walkSync(path, [optionsOrSettings])
|
||||
|
||||
Reads the directory recursively and synchronously. Returns an array of entries.
|
||||
|
||||
```ts
|
||||
const entries = fsWalk.walkSync('path');
|
||||
const entries = fsWalk.walkSync('path', {});
|
||||
const entries = fsWalk.walkSync('path', new fsWalk.Settings());
|
||||
```
|
||||
|
||||
#### path
|
||||
|
||||
* Required: `true`
|
||||
* Type: `string | Buffer | URL`
|
||||
|
||||
A path to a file. If a URL is provided, it must use the `file:` protocol.
|
||||
|
||||
#### optionsOrSettings
|
||||
|
||||
* Required: `false`
|
||||
* Type: `Options | Settings`
|
||||
* Default: An instance of `Settings` class
|
||||
|
||||
An [`Options`](#options) object or an instance of [`Settings`](#settings) class.
|
||||
|
||||
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class.
|
||||
|
||||
### Settings([options])
|
||||
|
||||
A class of full settings of the package.
|
||||
|
||||
```ts
|
||||
const settings = new fsWalk.Settings({ followSymbolicLinks: true });
|
||||
|
||||
const entries = fsWalk.walkSync('path', settings);
|
||||
```
|
||||
|
||||
## Entry
|
||||
|
||||
* `name` — The name of the entry (`unknown.txt`).
|
||||
* `path` — The path of the entry relative to call directory (`root/unknown.txt`).
|
||||
* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class.
|
||||
* [`stats`] — An instance of `fs.Stats` class.
|
||||
|
||||
## Options
|
||||
|
||||
### basePath
|
||||
|
||||
* Type: `string`
|
||||
* Default: `undefined`
|
||||
|
||||
By default, all paths are built relative to the root path. You can use this option to set custom root path.
|
||||
|
||||
In the example below we read the files from the `root` directory, but in the results the root path will be `custom`.
|
||||
|
||||
```ts
|
||||
fsWalk.walkSync('root'); // → ['root/file.txt']
|
||||
fsWalk.walkSync('root', { basePath: 'custom' }); // → ['custom/file.txt']
|
||||
```
|
||||
|
||||
### concurrency
|
||||
|
||||
* Type: `number`
|
||||
* Default: `Infinity`
|
||||
|
||||
The maximum number of concurrent calls to `fs.readdir`.
|
||||
|
||||
> :book: The higher the number, the higher performance and the load on the File System. If you want to read in quiet mode, set the value to `4 * os.cpus().length` (4 is default size of [thread pool work scheduling](http://docs.libuv.org/en/v1.x/threadpool.html#thread-pool-work-scheduling)).
|
||||
|
||||
### deepFilter
|
||||
|
||||
* Type: [`DeepFilterFunction`](./src/settings.ts)
|
||||
* Default: `undefined`
|
||||
|
||||
A function that indicates whether the directory will be read deep or not.
|
||||
|
||||
```ts
|
||||
// Skip all directories that starts with `node_modules`
|
||||
const filter: DeepFilterFunction = (entry) => !entry.path.startsWith('node_modules');
|
||||
```
|
||||
|
||||
### entryFilter
|
||||
|
||||
* Type: [`EntryFilterFunction`](./src/settings.ts)
|
||||
* Default: `undefined`
|
||||
|
||||
A function that indicates whether the entry will be included to results or not.
|
||||
|
||||
```ts
|
||||
// Exclude all `.js` files from results
|
||||
const filter: EntryFilterFunction = (entry) => !entry.name.endsWith('.js');
|
||||
```
|
||||
|
||||
### errorFilter
|
||||
|
||||
* Type: [`ErrorFilterFunction`](./src/settings.ts)
|
||||
* Default: `undefined`
|
||||
|
||||
A function that allows you to skip errors that occur when reading directories.
|
||||
|
||||
For example, you can skip `ENOENT` errors if required:
|
||||
|
||||
```ts
|
||||
// Skip all ENOENT errors
|
||||
const filter: ErrorFilterFunction = (error) => error.code == 'ENOENT';
|
||||
```
|
||||
|
||||
### stats
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `false`
|
||||
|
||||
Adds an instance of `fs.Stats` class to the [`Entry`](#entry).
|
||||
|
||||
> :book: Always use `fs.readdir` with additional `fs.lstat/fs.stat` calls to determine the entry type.
|
||||
|
||||
### followSymbolicLinks
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `false`
|
||||
|
||||
Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`.
|
||||
|
||||
### `throwErrorOnBrokenSymbolicLink`
|
||||
|
||||
* Type: `boolean`
|
||||
* Default: `true`
|
||||
|
||||
Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`.
|
||||
|
||||
### `pathSegmentSeparator`
|
||||
|
||||
* Type: `string`
|
||||
* Default: `path.sep`
|
||||
|
||||
By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead.
|
||||
|
||||
### `fs`
|
||||
|
||||
* Type: `FileSystemAdapter`
|
||||
* Default: A default FS methods
|
||||
|
||||
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own.
|
||||
|
||||
```ts
|
||||
interface FileSystemAdapter {
|
||||
lstat: typeof fs.lstat;
|
||||
stat: typeof fs.stat;
|
||||
lstatSync: typeof fs.lstatSync;
|
||||
statSync: typeof fs.statSync;
|
||||
readdir: typeof fs.readdir;
|
||||
readdirSync: typeof fs.readdirSync;
|
||||
}
|
||||
|
||||
const settings = new fsWalk.Settings({
|
||||
fs: { lstat: fakeLstat }
|
||||
});
|
||||
```
|
||||
|
||||
## Changelog
|
||||
|
||||
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version.
|
||||
|
||||
## License
|
||||
|
||||
This software is released under the terms of the MIT license.
|
|
@ -1,15 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import { Readable } from 'stream';
|
||||
import { Dirent, FileSystemAdapter } from '@nodelib/fs.scandir';
|
||||
import { AsyncCallback } from './providers/async';
|
||||
import Settings, { DeepFilterFunction, EntryFilterFunction, ErrorFilterFunction, Options } from './settings';
|
||||
import { Entry } from './types';
|
||||
declare function walk(directory: string, callback: AsyncCallback): void;
|
||||
declare function walk(directory: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void;
|
||||
declare namespace walk {
|
||||
function __promisify__(directory: string, optionsOrSettings?: Options | Settings): Promise<Entry[]>;
|
||||
}
|
||||
declare function walkSync(directory: string, optionsOrSettings?: Options | Settings): Entry[];
|
||||
declare function walkStream(directory: string, optionsOrSettings?: Options | Settings): Readable;
|
||||
export { walk, walkSync, walkStream, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, Options, DeepFilterFunction, EntryFilterFunction, ErrorFilterFunction };
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -1,32 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const async_1 = require("./providers/async");
|
||||
const stream_1 = require("./providers/stream");
|
||||
const sync_1 = require("./providers/sync");
|
||||
const settings_1 = require("./settings");
|
||||
exports.Settings = settings_1.default;
|
||||
function walk(directory, optionsOrSettingsOrCallback, callback) {
|
||||
if (typeof optionsOrSettingsOrCallback === 'function') {
|
||||
return new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);
|
||||
}
|
||||
new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);
|
||||
}
|
||||
exports.walk = walk;
|
||||
function walkSync(directory, optionsOrSettings) {
|
||||
const settings = getSettings(optionsOrSettings);
|
||||
const provider = new sync_1.default(directory, settings);
|
||||
return provider.read();
|
||||
}
|
||||
exports.walkSync = walkSync;
|
||||
function walkStream(directory, optionsOrSettings) {
|
||||
const settings = getSettings(optionsOrSettings);
|
||||
const provider = new stream_1.default(directory, settings);
|
||||
return provider.read();
|
||||
}
|
||||
exports.walkStream = walkStream;
|
||||
function getSettings(settingsOrOptions = {}) {
|
||||
if (settingsOrOptions instanceof settings_1.default) {
|
||||
return settingsOrOptions;
|
||||
}
|
||||
return new settings_1.default(settingsOrOptions);
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
import AsyncReader from '../readers/async';
|
||||
import Settings from '../settings';
|
||||
import { Entry, Errno } from '../types';
|
||||
export declare type AsyncCallback = (err: Errno, entries: Entry[]) => void;
|
||||
export default class AsyncProvider {
|
||||
private readonly _root;
|
||||
private readonly _settings;
|
||||
protected readonly _reader: AsyncReader;
|
||||
private readonly _storage;
|
||||
constructor(_root: string, _settings: Settings);
|
||||
read(callback: AsyncCallback): void;
|
||||
}
|
||||
//# sourceMappingURL=async.d.ts.map
|
|
@ -1,30 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const async_1 = require("../readers/async");
|
||||
class AsyncProvider {
|
||||
constructor(_root, _settings) {
|
||||
this._root = _root;
|
||||
this._settings = _settings;
|
||||
this._reader = new async_1.default(this._root, this._settings);
|
||||
this._storage = new Set();
|
||||
}
|
||||
read(callback) {
|
||||
this._reader.onError((error) => {
|
||||
callFailureCallback(callback, error);
|
||||
});
|
||||
this._reader.onEntry((entry) => {
|
||||
this._storage.add(entry);
|
||||
});
|
||||
this._reader.onEnd(() => {
|
||||
callSuccessCallback(callback, [...this._storage]);
|
||||
});
|
||||
this._reader.read();
|
||||
}
|
||||
}
|
||||
exports.default = AsyncProvider;
|
||||
function callFailureCallback(callback, error) {
|
||||
callback(error);
|
||||
}
|
||||
function callSuccessCallback(callback, entries) {
|
||||
callback(null, entries);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue