mirror of
https://github.com/Paillat-dev/presentator.git
synced 2026-01-02 01:06:20 +00:00
Added zip file, pptx file, new theme
This commit is contained in:
73
main.py
73
main.py
@@ -11,6 +11,8 @@ import logging
|
||||
import datetime
|
||||
import base64
|
||||
import requests
|
||||
import zipfile
|
||||
from zipfile import ZipFile
|
||||
from dotenv import load_dotenv
|
||||
load_dotenv()
|
||||
use_images = os.getenv("USE_IMAGES")
|
||||
@@ -28,24 +30,25 @@ intstructions = f'''Here is a presentation with marp. It's not possible to make
|
||||
then go at the line. The presentatio should be for everybody, all technical words and concepts, explained. {imageint} The presentation is minimum 20 slides long. You can use bulletpoints. Use markdown formatting (titles, etc...). The presentation has also a conclusion.'''
|
||||
bot = discord.Bot()
|
||||
|
||||
styles = ["default", "gaia", "uncover", "default-dark", "gaia-dark", "uncover-dark"]
|
||||
styles = ["default", "gaia", "uncover", "default-dark", "gaia-dark", "uncover-dark", "olive"]
|
||||
languages = ["english", "french", "spanish", "german", "italian", "portuguese", "russian", "chinese", "japanese", "korean", "arabic"]
|
||||
darkstyles = ["default-dark", "gaia-dark", "uncover-dark"]
|
||||
customstyles = ["olive"]
|
||||
async def get_style(ctx: discord.AutocompleteContext):
|
||||
"""Returns a list of colors that begin with the characters entered so far."""
|
||||
return [color for color in styles if color.startswith(ctx.value.lower())]
|
||||
return [style for style in styles if style.startswith(ctx.value.lower())]
|
||||
async def get_ln(ctx: discord.AutocompleteContext):
|
||||
"""Returns a list of colors that begin with the characters entered so far."""
|
||||
return [color for color in languages if color.startswith(ctx.value.lower())]
|
||||
return [language for language in languages if language.startswith(ctx.value.lower())]
|
||||
|
||||
@bot.slash_command(name="private_present", description="Generate a presentation with marp, private command for user 707196665668436019")
|
||||
@option(name="subject", description="The subject of the presentation", required=True)
|
||||
@option(name="style", description="The style of the presentation", required=False, autocomplete=get_style)
|
||||
@option(name="center", description="Center the text", required=False)
|
||||
@option(name="language", description="The language of the presentation", required=False, autocomplete=get_ln)
|
||||
@option(name="indications", description="The indications for the presentation", required=False)
|
||||
#command wprks only in dm and only for user 707196665668436019
|
||||
@commands.is_owner()
|
||||
async def private_present(ctx: discord.ApplicationContext, subject: str, style: str = "default", language: str = "english", indications: str = ""):
|
||||
async def private_present(ctx: discord.ApplicationContext, subject: str, style: str = "default", center: bool = True, language: str = "english", indications: str = ""):
|
||||
await present(ctx, subject, style, language, indications)
|
||||
|
||||
|
||||
@@ -55,47 +58,49 @@ async def private_present(ctx: discord.ApplicationContext, subject: str, style:
|
||||
#we create a function that takes the subject of the presentation and the style of the presentation as arguments, and that
|
||||
@option(name="subject", description="The subject of the presentation", required=True)
|
||||
@option(name="style", description="The style of the presentation", required=False, autocomplete=get_style)
|
||||
@option(name="center", description="Center the text", required=False)
|
||||
@option(name="language", description="The language of the presentation", required=False, autocomplete=get_ln)
|
||||
@option(name="indications", description="The indications for the presentation", required=False)
|
||||
# a cooldown of duration cooldown seconds, except if the user is 707196665668436019
|
||||
|
||||
#@commands.cooldown(1, int(cooldown), commands.BucketType.user)
|
||||
@commands.cooldown(1, int(cooldown), commands.BucketType.guild)
|
||||
async def normal_present(ctx: discord.ApplicationContext, subject: str, style: str = "default", language: str = "english", indications: str = ""):
|
||||
async def normal_present(ctx: discord.ApplicationContext, subject: str, style: str = "default", center: bool = True, language: str = "english", indications: str = ""):
|
||||
await present(ctx, subject, style, language, indications)
|
||||
|
||||
|
||||
async def present(ctx: discord.ApplicationContext, subject: str, style: str = "default", language: str = "english", indications: str = ""):
|
||||
async def present(ctx: discord.ApplicationContext, subject: str, style: str = "default", center: bool = True, language: str = "english", indications: str = ""):
|
||||
await ctx.defer()
|
||||
date = datetime.datetime.now()
|
||||
date = date.strftime("%Y-%m-%d-%H-%M-%S")
|
||||
#if the style is dark
|
||||
dark = False
|
||||
if style in darkstyles:
|
||||
sty = style.replace("-dark", "")
|
||||
style = style.replace("-dark", "")
|
||||
dark = True
|
||||
marp = f'''---
|
||||
marp: true
|
||||
theme: {styles[styles.index(style)]}
|
||||
class:
|
||||
- lead
|
||||
'''
|
||||
if dark: marp = marp + f" - invert\n---"
|
||||
if center: marp = marp + " - lead\n---"
|
||||
else: marp = marp + "\n---"
|
||||
# if style in customstyles:
|
||||
# marp = f"/* @theme {style} */\n" + marp
|
||||
# print(marp)
|
||||
prompt = f"{intstructions} {indications} The subject of the presentation is: {subject} The Language is: {language} <|endofprompt|> \n {marp}"
|
||||
subject2 = subject
|
||||
forbidden = ["\\", "/", "?", "!", ":", ";", "(", ")", "[", "]", "{", "}", "'", '"', "=", "+", "*", "&", "^", "%", "$", "#", "@", "`", "~", "|", "<", ">", ",", ".", "?", " "]
|
||||
for i in forbidden:
|
||||
if i in subject: subject = subject.replace(i, "-")
|
||||
#we save teh subject in base64 in a variable
|
||||
b64 = base64.urlsafe_b64encode(subject.encode("utf-8"))
|
||||
#if dosen't exist, create a directory called "userid" where the userid is the id of the user who called the command
|
||||
uid = str(ctx.author.id)
|
||||
if not os.path.exists("./data/"+uid):
|
||||
os.mkdir("./data/"+uid)
|
||||
datenow = datetime.datetime.now()
|
||||
datenow = datenow.strftime("%Y-%m-%d-%H-%M-%S")
|
||||
os.mkdir(f"./data/{uid}/{b64}{datenow}")
|
||||
response = await openai.Completion.acreate(
|
||||
engine="text-davinci-003",
|
||||
prompt=prompt,
|
||||
@@ -115,46 +120,69 @@ class:
|
||||
for match in matches:
|
||||
image_filenames.append(match.group(1))
|
||||
#we create a text file with the image names and a md file for the presentation with utf8 encoding
|
||||
with open(f"./data/{uid}/{b64}{datenow}/{subject}-images.txt", "w", encoding="utf8") as f:
|
||||
if len(subject) > 15: subject = subject[:15]
|
||||
b64 = base64.urlsafe_b64encode(subject.encode("utf-8"))
|
||||
os.mkdir(f"./data/{uid}/{b64}{datenow}")
|
||||
path = f"./data/{uid}/{b64}{datenow}"
|
||||
with open(f"{path}/{subject}-images.txt", "w", encoding="utf8") as f:
|
||||
for image in image_filenames:
|
||||
f.write(image + "\n")
|
||||
#now we generate the images, if there are any
|
||||
with open(f"{path}/{subject}.md", "w", encoding="utf8") as f: f.write(present)
|
||||
if len(image_filenames) > 0 and use_images!="no":
|
||||
#now we first remove the extension from the image filenames by removing the last 4 characters
|
||||
image_filenames = [image[:-4] for image in image_filenames]
|
||||
print(image_filenames)
|
||||
for images in image_filenames:
|
||||
#we download the image
|
||||
print ("generating image " + images + "with " + str(use_images))
|
||||
r = await imagesGeneration.generate(images, f"{os.getcwd()}\\data\\{uid}\\{b64}{datenow}\\", str(use_images), apikey)
|
||||
if str(use_images) == "sd": os.rename(f"{os.getcwd()}\\.\\data\\{uid}\\{b64}{datenow}\\{images}_0.png", f"{os.getcwd()}\\data\\{uid}\\{b64}{datenow}\\{images}.png")
|
||||
if str(use_images) == "dalle":
|
||||
image_url = r['data'][0]['url']
|
||||
img_data = requests.get(image_url).content
|
||||
with open(f'./data/{uid}/{b64}{datenow}/{images}.png', 'wb') as handler:
|
||||
with open(f'{path}/{images}.png', 'wb') as handler:
|
||||
handler.write(img_data)
|
||||
asyncio.sleep(15) #wait 15 seconds to avoid rate limiting
|
||||
with open(f"./data/{uid}/{b64}{datenow}/{subject}.md", "w", encoding="utf8") as f: f.write(present)
|
||||
cmd = f"--pdf --allow-local-files ./data/{uid}/{b64}{datenow}/{subject}.md"
|
||||
await asyncio.sleep(15) #wait 15 seconds to avoid rate limiting
|
||||
cmd = f"--pdf --allow-local-files {path}/{subject}.md"
|
||||
if style in customstyles: cmd = cmd + f" --theme ./themes/{style}.css"
|
||||
if os.path.exists("./marp.exe"):
|
||||
os.system(f"marp.exe {cmd}")
|
||||
else:
|
||||
cmd = cmd.replace("'", "\\'")
|
||||
os.system(f"./marp {cmd}")
|
||||
cmd = f" --image png -o ./data/{uid}/{b64}{datenow}/{subject}.png --allow-local-files ./data/{uid}/{b64}{datenow}/{subject}.md"
|
||||
cmd = f" --image png -o {path}/{subject}.png --allow-local-files {path}/{subject}.md"
|
||||
if style in customstyles: cmd = cmd + f" --theme ./themes/{style}.css"
|
||||
if os.path.exists("./marp.exe"):
|
||||
os.system(f"marp.exe {cmd}")
|
||||
else:
|
||||
cmd = cmd.replace("'", "\\'")
|
||||
os.system(f"./marp {cmd}")
|
||||
cmd = f" --html --allow-local-files ./data/{uid}/{b64}{datenow}/{subject}.md"
|
||||
cmd = f" --html --allow-local-files {path}/{subject}.md"
|
||||
if style in customstyles: cmd = cmd + f" --theme ./themes/{style}.css"
|
||||
if os.path.exists("./marp.exe"):
|
||||
os.system(f"marp.exe {cmd}")
|
||||
else:
|
||||
cmd = cmd.replace("'", "\\'")
|
||||
os.system(f"./marp {cmd}")
|
||||
embed = discord.Embed(title=subject2, description="Thanks for using presentator bot. You can download the presentation in different formats (pdf, markdown, html). The images are generated by an ai. If you want to modify your presentation you can use the markdown file. More information about how to modify the file [HERE](https://marp.app).", color=0xaaaaaa)
|
||||
files = [discord.File(f"./data/{uid}/{b64}{datenow}/{subject}.pdf"), discord.File(f"./data/{uid}/{b64}{datenow}/{subject}.md"), discord.File(f"./data/{uid}/{b64}{datenow}/{subject}.html"), discord.File(f"./data/{uid}/{b64}{datenow}/{subject}.png")]
|
||||
cmd = f" --pptx --allow-local-files {path}/{subject}.md"
|
||||
if style in customstyles: cmd = cmd + f" --theme ./themes/{style}.css"
|
||||
if os.path.exists("./marp.exe"):
|
||||
os.system(f"marp.exe {cmd}")
|
||||
else:
|
||||
cmd = cmd.replace("'", "\\'")
|
||||
os.system(f"./marp {cmd}")
|
||||
#now, we create a zip file with all the files
|
||||
zipObj = ZipFile(f"{path}/{subject}.zip", 'w')
|
||||
zipObj.write(f"{path}/{subject}.md", f"{subject}.md")
|
||||
zipObj.write(f"{path}/{subject}.html", f"{subject}.html")
|
||||
zipObj.write(f"{path}/{subject}.pdf", f"{subject}.pdf")
|
||||
zipObj.write(f"{path}/{subject}.png", f"{subject}.png")
|
||||
zipObj.write(f"{path}/{subject}.pptx", f"{subject}.pptx")
|
||||
with open(f"{path}/{subject}-images.txt", "r", encoding="utf8") as f:
|
||||
for image in f.readlines():
|
||||
zipObj.write(f"{path}/{image.strip()}", f"{image.strip()}")
|
||||
zipObj.close()
|
||||
embed = discord.Embed(title=subject2, description="Thanks for using presentator bot. You will find your presentation in the attached zip file in the following formats: markdown, html, pdf, pptx, and the presentation' images. If you want to modify your presentation you can use the markdown file. More information about how to modify the file [HERE](https://marp.app).", color=discord.Color.brand_red())
|
||||
files = [discord.File(f"{path}/{subject}.zip"), discord.File(f"{path}/{subject}.png")]
|
||||
embed.set_image(url=f"attachment://{subject}.png")
|
||||
await ctx.respond(embed=embed, files=files)
|
||||
|
||||
@@ -192,6 +220,7 @@ async def on_ready():
|
||||
async def on_application_command_error(ctx, error):
|
||||
#if there is an error we send a message to the user
|
||||
await ctx.respond(f"An error occured: {error}", ephemeral=True)
|
||||
|
||||
#get the openai key drom he key.env file
|
||||
token = os.getenv("TOKEN")
|
||||
apikey = os.getenv("OPENAI")
|
||||
|
||||
465
themes/olive.css
Normal file
465
themes/olive.css
Normal file
@@ -0,0 +1,465 @@
|
||||
@charset "UTF-8";
|
||||
/*!
|
||||
* Marp / Marpit Olive theme.
|
||||
*
|
||||
* @theme olive
|
||||
* @author MATSUBARA Nobutada
|
||||
* @size 4:3 960px 720px
|
||||
* @size 16:9 1280px 720px
|
||||
*/
|
||||
@import url("https://fonts.googleapis.com/css?family=Lato:400,900|Roboto+Mono:400,700");
|
||||
@import url("https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.8/styles/github.min.css");
|
||||
svg[data-marp-fitting='svg'] {
|
||||
max-height: 580px; }
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
margin: 0.5em 0 0 0; }
|
||||
h1 strong,
|
||||
h2 strong,
|
||||
h3 strong,
|
||||
h4 strong,
|
||||
h5 strong,
|
||||
h6 strong {
|
||||
font-weight: inherit; }
|
||||
|
||||
h1 {
|
||||
font-size: 1.8em; }
|
||||
|
||||
h2 {
|
||||
font-size: 1.5em; }
|
||||
|
||||
h3 {
|
||||
font-size: 1.3em; }
|
||||
|
||||
h4 {
|
||||
font-size: 1.1em; }
|
||||
|
||||
h5 {
|
||||
font-size: 1em; }
|
||||
|
||||
h6 {
|
||||
font-size: 0.9em; }
|
||||
|
||||
p,
|
||||
blockquote {
|
||||
margin: 1em 0 0 0; }
|
||||
|
||||
ul > li,
|
||||
ol > li {
|
||||
margin: 0.3em 0 0 0; }
|
||||
ul > li > p,
|
||||
ol > li > p {
|
||||
margin: 0.6em 0 0 0; }
|
||||
|
||||
code {
|
||||
display: inline-block;
|
||||
font-family: 'NasuM', 'Roboto Mono', monospace;
|
||||
font-size: 0.8em;
|
||||
letter-spacing: 0;
|
||||
margin: -0.1em 0.15em;
|
||||
padding: 0.1em 0.2em;
|
||||
vertical-align: baseline; }
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin: 1em 0 0 0;
|
||||
min-height: 1em;
|
||||
overflow: visible; }
|
||||
pre code {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
min-width: 100%;
|
||||
padding: 0.5em;
|
||||
font-size: 0.7em; }
|
||||
pre code svg[data-marp-fitting='svg'] {
|
||||
max-height: calc(580px - 1em); }
|
||||
|
||||
blockquote {
|
||||
margin: 1em 0 0 0;
|
||||
padding: 0 1em;
|
||||
position: relative; }
|
||||
blockquote::after, blockquote::before {
|
||||
content: '“';
|
||||
display: block;
|
||||
font-family: 'Times New Roman', serif;
|
||||
font-weight: bold;
|
||||
position: absolute; }
|
||||
blockquote::before {
|
||||
top: 0;
|
||||
left: 0; }
|
||||
blockquote::after {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
transform: rotate(180deg); }
|
||||
blockquote > *:first-child {
|
||||
margin-top: 0; }
|
||||
|
||||
mark {
|
||||
background: transparent; }
|
||||
|
||||
table {
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
margin: 1em 0 0 0; }
|
||||
table th,
|
||||
table td {
|
||||
padding: 0.2em 0.4em;
|
||||
border-width: 1px;
|
||||
border-style: solid; }
|
||||
|
||||
section {
|
||||
background-image: linear-gradient(135deg, rgba(136, 136, 136, 0), rgba(136, 136, 136, 0.02) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.05));
|
||||
font-size: 28px;
|
||||
font-family: '源真ゴシック', 'ヒラギノ角ゴ Pro W3', 'Lato', 'Avenir Next', 'Avenir', 'Trebuchet MS', 'Segoe UI', sans-serif;
|
||||
line-height: 1.35;
|
||||
letter-spacing: 1.25px;
|
||||
padding: 70px;
|
||||
color: #FFF2DD;
|
||||
background-color: #4e4f53; }
|
||||
section > *:first-child,
|
||||
section > header:first-child + * {
|
||||
margin-top: 0; }
|
||||
section a,
|
||||
section mark {
|
||||
color: #CCA551; }
|
||||
section code {
|
||||
background: #dcd1c1;
|
||||
color: #4e4f53; }
|
||||
section h1 strong,
|
||||
section h2 strong,
|
||||
section h3 strong,
|
||||
section h4 strong,
|
||||
section h5 strong,
|
||||
section h6 strong {
|
||||
color: #CCA551; }
|
||||
section h1 img,
|
||||
section h2 img,
|
||||
section h3 img,
|
||||
section h4 img,
|
||||
section h5 img,
|
||||
section h6 img {
|
||||
display: block;
|
||||
margin: auto; }
|
||||
section pre > code {
|
||||
background: #FFF2DD; }
|
||||
section header,
|
||||
section footer,
|
||||
section section::after,
|
||||
section blockquote::before,
|
||||
section blockquote::after {
|
||||
color: #dcd1c1; }
|
||||
section table th,
|
||||
section table td {
|
||||
border-color: #FFF2DD; }
|
||||
section table thead th {
|
||||
background: #FFF2DD;
|
||||
color: #4e4f53; }
|
||||
section table tbody > tr:nth-child(odd) td,
|
||||
section table tbody > tr:nth-child(odd) th {
|
||||
background: rgba(255, 242, 221, 0.1); }
|
||||
section.invert {
|
||||
color: #4e4f53;
|
||||
background-color: #FFF2DD; }
|
||||
section.invert a,
|
||||
section.invert mark {
|
||||
color: #CCA551; }
|
||||
section.invert code {
|
||||
background: #71706f;
|
||||
color: #FFF2DD; }
|
||||
section.invert h1 strong,
|
||||
section.invert h2 strong,
|
||||
section.invert h3 strong,
|
||||
section.invert h4 strong,
|
||||
section.invert h5 strong,
|
||||
section.invert h6 strong {
|
||||
color: #CCA551; }
|
||||
section.invert h1 img,
|
||||
section.invert h2 img,
|
||||
section.invert h3 img,
|
||||
section.invert h4 img,
|
||||
section.invert h5 img,
|
||||
section.invert h6 img {
|
||||
display: block;
|
||||
margin: auto; }
|
||||
section.invert pre > code {
|
||||
background: #4e4f53; }
|
||||
section.invert header,
|
||||
section.invert footer,
|
||||
section.invert section::after,
|
||||
section.invert blockquote::before,
|
||||
section.invert blockquote::after {
|
||||
color: #71706f; }
|
||||
section.invert table th,
|
||||
section.invert table td {
|
||||
border-color: #4e4f53; }
|
||||
section.invert table thead th {
|
||||
background: #4e4f53;
|
||||
color: #FFF2DD; }
|
||||
section.invert table tbody > tr:nth-child(odd) td,
|
||||
section.invert table tbody > tr:nth-child(odd) th {
|
||||
background: rgba(78, 79, 83, 0.1); }
|
||||
section.olive {
|
||||
color: #4e4f53;
|
||||
background-color: #CCA551; }
|
||||
section.olive a,
|
||||
section.olive mark {
|
||||
color: #FFF2DD; }
|
||||
section.olive code {
|
||||
background: #676053;
|
||||
color: #CCA551; }
|
||||
section.olive h1 strong,
|
||||
section.olive h2 strong,
|
||||
section.olive h3 strong,
|
||||
section.olive h4 strong,
|
||||
section.olive h5 strong,
|
||||
section.olive h6 strong {
|
||||
color: #FFF2DD; }
|
||||
section.olive h1 img,
|
||||
section.olive h2 img,
|
||||
section.olive h3 img,
|
||||
section.olive h4 img,
|
||||
section.olive h5 img,
|
||||
section.olive h6 img {
|
||||
display: block;
|
||||
margin: auto; }
|
||||
section.olive pre > code {
|
||||
background: #4e4f53; }
|
||||
section.olive header,
|
||||
section.olive footer,
|
||||
section.olive section::after,
|
||||
section.olive blockquote::before,
|
||||
section.olive blockquote::after {
|
||||
color: #676053; }
|
||||
section.olive table th,
|
||||
section.olive table td {
|
||||
border-color: #4e4f53; }
|
||||
section.olive table thead th {
|
||||
background: #4e4f53;
|
||||
color: #CCA551; }
|
||||
section.olive table tbody > tr:nth-child(odd) td,
|
||||
section.olive table tbody > tr:nth-child(odd) th {
|
||||
background: rgba(78, 79, 83, 0.1); }
|
||||
section.lead {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center; }
|
||||
section.lead h1,
|
||||
section.lead h2,
|
||||
section.lead h3,
|
||||
section.lead h4,
|
||||
section.lead h5,
|
||||
section.lead h6 {
|
||||
text-align: center; }
|
||||
section.lead h1 svg[data-marp-fitting='svg'],
|
||||
section.lead h2 svg[data-marp-fitting='svg'],
|
||||
section.lead h3 svg[data-marp-fitting='svg'],
|
||||
section.lead h4 svg[data-marp-fitting='svg'],
|
||||
section.lead h5 svg[data-marp-fitting='svg'],
|
||||
section.lead h6 svg[data-marp-fitting='svg'] {
|
||||
--preserve-aspect-ratio: xMidYMid meet; }
|
||||
section.lead p {
|
||||
text-align: center; }
|
||||
section.lead blockquote > h1,
|
||||
section.lead blockquote > h2,
|
||||
section.lead blockquote > h3,
|
||||
section.lead blockquote > h4,
|
||||
section.lead blockquote > h5,
|
||||
section.lead blockquote > h6,
|
||||
section.lead blockquote > p {
|
||||
text-align: left; }
|
||||
section.lead blockquote svg[data-marp-fitting='svg']:not([data-marp-fitting-math]) {
|
||||
--preserve-aspect-ratio: xMinYMin meet; }
|
||||
section.lead ul > li > p,
|
||||
section.lead ol > li > p {
|
||||
text-align: left; }
|
||||
section.lead table {
|
||||
margin-left: auto;
|
||||
margin-right: auto; }
|
||||
section.lead-invert {
|
||||
color: #4e4f53;
|
||||
background-color: #FFF2DD;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center; }
|
||||
section.lead-invert a,
|
||||
section.lead-invert mark {
|
||||
color: #CCA551; }
|
||||
section.lead-invert code {
|
||||
background: #71706f;
|
||||
color: #FFF2DD; }
|
||||
section.lead-invert h1 strong,
|
||||
section.lead-invert h2 strong,
|
||||
section.lead-invert h3 strong,
|
||||
section.lead-invert h4 strong,
|
||||
section.lead-invert h5 strong,
|
||||
section.lead-invert h6 strong {
|
||||
color: #CCA551; }
|
||||
section.lead-invert h1 img,
|
||||
section.lead-invert h2 img,
|
||||
section.lead-invert h3 img,
|
||||
section.lead-invert h4 img,
|
||||
section.lead-invert h5 img,
|
||||
section.lead-invert h6 img {
|
||||
display: block;
|
||||
margin: auto; }
|
||||
section.lead-invert pre > code {
|
||||
background: #4e4f53; }
|
||||
section.lead-invert header,
|
||||
section.lead-invert footer,
|
||||
section.lead-invert section::after,
|
||||
section.lead-invert blockquote::before,
|
||||
section.lead-invert blockquote::after {
|
||||
color: #71706f; }
|
||||
section.lead-invert table th,
|
||||
section.lead-invert table td {
|
||||
border-color: #4e4f53; }
|
||||
section.lead-invert table thead th {
|
||||
background: #4e4f53;
|
||||
color: #FFF2DD; }
|
||||
section.lead-invert table tbody > tr:nth-child(odd) td,
|
||||
section.lead-invert table tbody > tr:nth-child(odd) th {
|
||||
background: rgba(78, 79, 83, 0.1); }
|
||||
section.lead-invert h1,
|
||||
section.lead-invert h2,
|
||||
section.lead-invert h3,
|
||||
section.lead-invert h4,
|
||||
section.lead-invert h5,
|
||||
section.lead-invert h6 {
|
||||
text-align: center; }
|
||||
section.lead-invert h1 svg[data-marp-fitting='svg'],
|
||||
section.lead-invert h2 svg[data-marp-fitting='svg'],
|
||||
section.lead-invert h3 svg[data-marp-fitting='svg'],
|
||||
section.lead-invert h4 svg[data-marp-fitting='svg'],
|
||||
section.lead-invert h5 svg[data-marp-fitting='svg'],
|
||||
section.lead-invert h6 svg[data-marp-fitting='svg'] {
|
||||
--preserve-aspect-ratio: xMidYMid meet; }
|
||||
section.lead-invert p {
|
||||
text-align: center; }
|
||||
section.lead-invert blockquote > h1,
|
||||
section.lead-invert blockquote > h2,
|
||||
section.lead-invert blockquote > h3,
|
||||
section.lead-invert blockquote > h4,
|
||||
section.lead-invert blockquote > h5,
|
||||
section.lead-invert blockquote > h6,
|
||||
section.lead-invert blockquote > p {
|
||||
text-align: left; }
|
||||
section.lead-invert blockquote svg[data-marp-fitting='svg']:not([data-marp-fitting-math]) {
|
||||
--preserve-aspect-ratio: xMinYMin meet; }
|
||||
section.lead-invert ul > li > p,
|
||||
section.lead-invert ol > li > p {
|
||||
text-align: left; }
|
||||
section.lead-invert table {
|
||||
margin-left: auto;
|
||||
margin-right: auto; }
|
||||
section.lead-olive {
|
||||
color: #4e4f53;
|
||||
background-color: #CCA551;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center; }
|
||||
section.lead-olive a,
|
||||
section.lead-olive mark {
|
||||
color: #FFF2DD; }
|
||||
section.lead-olive code {
|
||||
background: #676053;
|
||||
color: #CCA551; }
|
||||
section.lead-olive h1 strong,
|
||||
section.lead-olive h2 strong,
|
||||
section.lead-olive h3 strong,
|
||||
section.lead-olive h4 strong,
|
||||
section.lead-olive h5 strong,
|
||||
section.lead-olive h6 strong {
|
||||
color: #FFF2DD; }
|
||||
section.lead-olive h1 img,
|
||||
section.lead-olive h2 img,
|
||||
section.lead-olive h3 img,
|
||||
section.lead-olive h4 img,
|
||||
section.lead-olive h5 img,
|
||||
section.lead-olive h6 img {
|
||||
display: block;
|
||||
margin: auto; }
|
||||
section.lead-olive pre > code {
|
||||
background: #4e4f53; }
|
||||
section.lead-olive header,
|
||||
section.lead-olive footer,
|
||||
section.lead-olive section::after,
|
||||
section.lead-olive blockquote::before,
|
||||
section.lead-olive blockquote::after {
|
||||
color: #676053; }
|
||||
section.lead-olive table th,
|
||||
section.lead-olive table td {
|
||||
border-color: #4e4f53; }
|
||||
section.lead-olive table thead th {
|
||||
background: #4e4f53;
|
||||
color: #CCA551; }
|
||||
section.lead-olive table tbody > tr:nth-child(odd) td,
|
||||
section.lead-olive table tbody > tr:nth-child(odd) th {
|
||||
background: rgba(78, 79, 83, 0.1); }
|
||||
section.lead-olive h1,
|
||||
section.lead-olive h2,
|
||||
section.lead-olive h3,
|
||||
section.lead-olive h4,
|
||||
section.lead-olive h5,
|
||||
section.lead-olive h6 {
|
||||
text-align: center; }
|
||||
section.lead-olive h1 svg[data-marp-fitting='svg'],
|
||||
section.lead-olive h2 svg[data-marp-fitting='svg'],
|
||||
section.lead-olive h3 svg[data-marp-fitting='svg'],
|
||||
section.lead-olive h4 svg[data-marp-fitting='svg'],
|
||||
section.lead-olive h5 svg[data-marp-fitting='svg'],
|
||||
section.lead-olive h6 svg[data-marp-fitting='svg'] {
|
||||
--preserve-aspect-ratio: xMidYMid meet; }
|
||||
section.lead-olive p {
|
||||
text-align: center; }
|
||||
section.lead-olive blockquote > h1,
|
||||
section.lead-olive blockquote > h2,
|
||||
section.lead-olive blockquote > h3,
|
||||
section.lead-olive blockquote > h4,
|
||||
section.lead-olive blockquote > h5,
|
||||
section.lead-olive blockquote > h6,
|
||||
section.lead-olive blockquote > p {
|
||||
text-align: left; }
|
||||
section.lead-olive blockquote svg[data-marp-fitting='svg']:not([data-marp-fitting-math]) {
|
||||
--preserve-aspect-ratio: xMinYMin meet; }
|
||||
section.lead-olive ul > li > p,
|
||||
section.lead-olive ol > li > p {
|
||||
text-align: left; }
|
||||
section.lead-olive table {
|
||||
margin-left: auto;
|
||||
margin-right: auto; }
|
||||
|
||||
header,
|
||||
footer,
|
||||
section::after {
|
||||
box-sizing: border-box;
|
||||
font-size: 66%;
|
||||
height: 70px;
|
||||
line-height: 50px;
|
||||
overflow: hidden;
|
||||
padding: 10px 25px;
|
||||
position: absolute; }
|
||||
|
||||
header {
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0; }
|
||||
|
||||
footer {
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0; }
|
||||
|
||||
section::after {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
font-size: 80%; }
|
||||
|
||||
/*# sourceMappingURL=olive.css.map */
|
||||
Reference in New Issue
Block a user