mirror of
https://github.com/ivanch/blog.ivanch.me.git
synced 2026-02-14 10:18:27 +00:00
re-init
This commit is contained in:
37
.github/workflows/master.yml
vendored
Executable file
37
.github/workflows/master.yml
vendored
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
name: CI & Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: true # Fetch Hugo themes (true OR recursive)
|
||||||
|
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||||
|
|
||||||
|
- name: Setup Hugo
|
||||||
|
uses: peaceiris/actions-hugo@v2
|
||||||
|
with:
|
||||||
|
hugo-version: 'latest'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: hugo --minify
|
||||||
|
|
||||||
|
- name: RSync Deploy
|
||||||
|
uses: burnett01/rsync-deployments@5.2
|
||||||
|
with:
|
||||||
|
switches: -avzr --delete
|
||||||
|
path: ./public
|
||||||
|
remote_path: ${{ secrets.DEPLOY_PATH }}
|
||||||
|
remote_host: ${{ secrets.DEPLOY_HOST }}
|
||||||
|
remote_port: ${{ secrets.DEPLOY_PORT }}
|
||||||
|
remote_user: ${{ secrets.DEPLOY_USER }}
|
||||||
|
remote_key: ${{ secrets.DEPLOY_KEY }}
|
||||||
2
.gitignore
vendored
Executable file
2
.gitignore
vendored
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
public
|
||||||
|
.*.lock
|
||||||
16
README.md
Executable file
16
README.md
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
# [Personal blogging](https://blog.ivanch.me)
|
||||||
|
|
||||||
|
This will be eventually migrated to an embedded page on my website.
|
||||||
|
|
||||||
|
|
||||||
|
# Local dev (notes for myself really)
|
||||||
|
|
||||||
|
## Running
|
||||||
|
1. `git submodule update --init --recursive`
|
||||||
|
1. `hugo server`
|
||||||
|
|
||||||
|
## Build
|
||||||
|
1. `hugo`
|
||||||
|
|
||||||
|
## Add new post
|
||||||
|
1. `hugo new posts/post-name.md`
|
||||||
6
archetypes/default.md
Executable file
6
archetypes/default.md
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: "{{ replace .Name "-" " " | title }}"
|
||||||
|
date: {{ .Date }}
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
28
config.yml
Executable file
28
config.yml
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
params:
|
||||||
|
#ShowBreadCrumbs: true
|
||||||
|
ShowCodeCopyButtons: true
|
||||||
|
homeInfoParams:
|
||||||
|
Title: Hello there!
|
||||||
|
Content: |
|
||||||
|
Nothing good around here, maybe you misclicked.
|
||||||
|
But if you're here, you can check my [resumé](https://drive.google.com/file/d/1oYf68qKXUnBz7d4qjHX-hTw_-f5EKgeF/view)
|
||||||
|
or my [home page](https://ivanch.me/).
|
||||||
|
|
||||||
|
I also self-host some pretty cool stuff.
|
||||||
|
|
||||||
|
socialIcons:
|
||||||
|
# - name: "Instagram"
|
||||||
|
# url: "https://www.instagram.com/ivanczn/"
|
||||||
|
- name: "Github"
|
||||||
|
url: "https://github.com/ivanch"
|
||||||
|
# - name: "Lastfm"
|
||||||
|
# url: "https://www.last.fm/user/dotivanch"
|
||||||
|
# - name: "Steam"
|
||||||
|
# url: "https://steamcommunity.com/id/dotivanch"
|
||||||
|
- name: "Linkedin"
|
||||||
|
url: "https://www.linkedin.com/in/joseivanch"
|
||||||
|
|
||||||
|
baseURL: 'https://blog.ivanch.me/'
|
||||||
|
languageCode: 'en-us'
|
||||||
|
title: "ivanczn"
|
||||||
|
theme: 'PaperMod'
|
||||||
6
content/archives.md
Executable file
6
content/archives.md
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: "Posts"
|
||||||
|
layout: "posts"
|
||||||
|
url: "/posts/"
|
||||||
|
summary: posts
|
||||||
|
---
|
||||||
238
content/posts/api-gateway-terraform.md
Executable file
238
content/posts/api-gateway-terraform.md
Executable file
@@ -0,0 +1,238 @@
|
|||||||
|
---
|
||||||
|
title: "AWS API Gateway with Terraform"
|
||||||
|
date: 2022-12-01T15:30:00-03:00
|
||||||
|
draft: false
|
||||||
|
summary: "Creating API Gateway endpoints with Terraform."
|
||||||
|
---
|
||||||
|
|
||||||
|
Right when we first started to use the AWS API Gateway, one of the things that did bother us was the fact that we had to manage lot of resources spread into 1,000s of lines of a couple of Terraform files, and it was a lot of work that required attention and time, things that are critical in software development as we all know.
|
||||||
|
|
||||||
|
So we decided to create a module to help us with this. Big thanks to [Stephano](https://www.linkedin.com/in/stephano-macedo/) who helped me a lot!
|
||||||
|
|
||||||
|
## Before
|
||||||
|
Basically, when we are developing a new API, we need to create a 3 resources in the API Gateway. We need to create a new gateway_resource, a new gateway_method and a new gateway_integration, and then connect all of them using their respectives IDs.
|
||||||
|
|
||||||
|
Let's suppose a endpoint called `/users/all`. This is a snippet of the code we had before:
|
||||||
|
|
||||||
|
#### Resource
|
||||||
|
```terraform
|
||||||
|
resource "aws_api_gateway_resource" "api_users_all" {
|
||||||
|
rest_api_id = aws_api_gateway_rest_api.api.id
|
||||||
|
parent_id = aws_api_gateway_resource.api_users.id
|
||||||
|
path_part = "all"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Method
|
||||||
|
```terraform
|
||||||
|
resource "aws_api_gateway_method" "api_users_all" {
|
||||||
|
rest_api_id = aws_api_gateway_rest_api.api.id
|
||||||
|
resource_id = aws_api_gateway_resource.users_all.id
|
||||||
|
http_method = "GET"
|
||||||
|
|
||||||
|
request_parameters = {
|
||||||
|
"method.request.header.Authorization" = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Integration
|
||||||
|
```terraform
|
||||||
|
resource "aws_api_gateway_integration" "api_users_all" {
|
||||||
|
rest_api_id = aws_api_gateway_rest_api.api.id
|
||||||
|
resource_id = aws_api_gateway_resource.api_users_all.id
|
||||||
|
http_method = aws_api_gateway_method.api_users_all.http_method
|
||||||
|
type = "HTTP_PROXY"
|
||||||
|
integration_http_method = "GET"
|
||||||
|
uri = "https://api.example.com/users/all"
|
||||||
|
|
||||||
|
request_parameters = {
|
||||||
|
"integration.request.header.Authorization" = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Obviously there is more code to that, but this is the main part of it and we will be focusing on that.
|
||||||
|
|
||||||
|
## Creating a module
|
||||||
|
Now we can create a module to help us. We can start by creating a separate folder which will be our module, let's call it `terraform/modules/api`, inside of it there will be a couple of files:
|
||||||
|
|
||||||
|
### variables.tf
|
||||||
|
Here we will define the variables that we will use in the module, what will come from the outside. Note that here it's just the essencial, you will add more things as you need.
|
||||||
|
```terraform
|
||||||
|
# This is the parent resource ID in case we have something like /users/all/prune
|
||||||
|
variable "parent_id" {
|
||||||
|
description = "Resource Parent ID"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
# This is the last part of the path, we can infer it from the endpoint URI
|
||||||
|
variable "path_part" {
|
||||||
|
description = "Path Part"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
# Here we will put all the HTTP methods that the endpoint will accept
|
||||||
|
variable "http_methods" {
|
||||||
|
description = "HTTP Methods"
|
||||||
|
type = list(string)
|
||||||
|
default = []
|
||||||
|
}
|
||||||
|
|
||||||
|
# The complete endpoint URI
|
||||||
|
variable "uri" {
|
||||||
|
description = "URI"
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# The API Gateway ID
|
||||||
|
variable "gateway_id" {
|
||||||
|
description = "API Gateway ID"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
# If we have a URI that won't accept any HTTP method, we set this to true
|
||||||
|
variable "only_resource" {
|
||||||
|
description = "Only create the resource"
|
||||||
|
type = bool
|
||||||
|
default = false
|
||||||
|
}
|
||||||
|
|
||||||
|
# Authorization as an example so that we can pass the headers
|
||||||
|
variable "authorization" {
|
||||||
|
description = "Required authorization"
|
||||||
|
type = bool
|
||||||
|
default = false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### outputs.tf
|
||||||
|
This file is needed for at least one important variable, which is the `resource_id`. That's needed if we have some endpoint like `/users/all/prune` which needs a `parent_id`.
|
||||||
|
```terraform
|
||||||
|
output "resource_id" {
|
||||||
|
value = local.resource_id
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### locals.tf
|
||||||
|
As we referenced the `resource_id` in the `outputs.tf`, we need to define it in the `locals.tf`.
|
||||||
|
```terraform
|
||||||
|
locals {
|
||||||
|
// this join is because we simply can't do aws_api_gateway_resource.api_resource.id
|
||||||
|
resource_id = join("", aws_api_gateway_resource.api_resource[*].id)
|
||||||
|
|
||||||
|
// if starts with '{' and ends with '}' then it's a path variable
|
||||||
|
// take all the middle characters
|
||||||
|
// if it's empty then it's a normal path
|
||||||
|
path_variable = length(regexall("{.*}", var.path_part)) > 0 ? substr(var.path_part, 1, length(var.path_part) - 2) : ""
|
||||||
|
|
||||||
|
// in case we need Authorization
|
||||||
|
integration_request_parameters = var.authorization ? {
|
||||||
|
"integration.request.header.Authorization" = "method.request.header.Authorization"
|
||||||
|
} : {}
|
||||||
|
|
||||||
|
method_request_parameters = {
|
||||||
|
"method.request.header.Authorization" = var.authorization
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### gateway.resources.tf
|
||||||
|
Here is where the fun begins, thank God it's pretty straightforward. All of the variables are coming from the `variables.tf` file.
|
||||||
|
```terraform
|
||||||
|
resource "aws_api_gateway_resource" "api_resource" {
|
||||||
|
rest_api_id = var.gateway_id
|
||||||
|
parent_id = var.parent_id
|
||||||
|
path_part = var.path_part
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### gateway.methods.tf
|
||||||
|
Since we need one `aws_api_gateway_method` for each HTTP Method, we use the `count` to iterate over the list of HTTP Methods and create one api_gateway_method for each http method we defined in the `var.http_methods` list.
|
||||||
|
```terraform
|
||||||
|
resource "aws_api_gateway_method" "api_method" {
|
||||||
|
count = var.only_resource ? 0 : length(var.http_methods)
|
||||||
|
rest_api_id = var.gateway_id
|
||||||
|
resource_id = local.resource_id
|
||||||
|
|
||||||
|
http_method = var.http_methods[count.index]
|
||||||
|
authorization = var.authorization ? "CUSTOM" : "NONE"
|
||||||
|
|
||||||
|
// Got a path variable? No problem! We deal with that too right here
|
||||||
|
request_parameters = merge(local.method_request_parameters, local.path_variable != "" ? {
|
||||||
|
"method.request.path.${local.path_variable}" = local.path_variable != ""
|
||||||
|
} : {})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### gateway.integrations.tf
|
||||||
|
The same idea goes for api_gateway_integration.
|
||||||
|
```terraform
|
||||||
|
resource "aws_api_gateway_integration" "api_integration" {
|
||||||
|
count = var.only_resource ? 0 : length(var.http_methods)
|
||||||
|
rest_api_id = var.gateway_id
|
||||||
|
resource_id = local.resource_id
|
||||||
|
http_method = aws_api_gateway_method.api_method[count.index].http_method
|
||||||
|
|
||||||
|
integration_http_method = var.http_methods[count.index]
|
||||||
|
uri = var.uri
|
||||||
|
|
||||||
|
// Aahh I see your path variable, let's do some magic here
|
||||||
|
request_parameters = merge(local.integration_request_parameters, local.path_variable != "" ? {
|
||||||
|
"integration.request.path.${local.path_variable}" = "method.request.path.${local.path_variable}"
|
||||||
|
} : {})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using the module
|
||||||
|
|
||||||
|
Now that we have the module, we can use it in our `main.tf` file. We will use the same example as before, but now we will use the module and we will create some other endpoints as example as well.
|
||||||
|
```terraform
|
||||||
|
# this is our main API endpoint, we don't want to receive any request here, so we will only create the resource
|
||||||
|
# /users (only resource)
|
||||||
|
module "api_users" {
|
||||||
|
source = "./api"
|
||||||
|
|
||||||
|
gateway_id = gateway.outputs.gateway.gateway_config.gateway_id
|
||||||
|
parent_id = gateway.outputs.gateway.gateway_config.root_endpoints.api_root
|
||||||
|
path_part = "users"
|
||||||
|
only_resource = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# /users/all (get)
|
||||||
|
module "api_users_all" {
|
||||||
|
source = "./api"
|
||||||
|
|
||||||
|
gateway_id = gateway.outputs.gateway.gateway_config.gateway_id
|
||||||
|
parent_id = module.api_users.resource_id
|
||||||
|
path_part = "all"
|
||||||
|
http_methods = ["GET"]
|
||||||
|
uri = "http://api.example.com/users/all"
|
||||||
|
}
|
||||||
|
|
||||||
|
# /users/all/{userid} (get, post, put, delete)
|
||||||
|
module "api_users_all" {
|
||||||
|
source = "./api"
|
||||||
|
|
||||||
|
gateway_id = gateway.outputs.gateway.gateway_config.gateway_id
|
||||||
|
parent_id = module.api_users_all.resource_id
|
||||||
|
path_part = "{userid}"
|
||||||
|
http_methods = ["GET", "POST", "PUT", "DELETE"]
|
||||||
|
uri = "http://api.example.com/users/all/{userid}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# and so on...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
For one endpoint, we went from having to manage 15 lines splitted in 3 files to just 5 lines inside of one file. If you have to manage hundreds of endpoints, that will be a great help.
|
||||||
|
|
||||||
|
## WWW-Authenticate header
|
||||||
|
We can also add the `WWW-Authenticate` header to the request for example. We tried to do that by adding it to the files properly, but it didn't work. The reason was that the API Gateway was not passing the `WWW-Authenticate` to our API, and that's because of the name of the header. You can call it `WWW-Authenticate-Header` for example and it will work.
|
||||||
|
|
||||||
|
## Note
|
||||||
|
This code has not been tested "as is", but it has been tested as part of a bigger project. There is always room for improvements and more possibilities depending on the context, but it's a good start.
|
||||||
|
|
||||||
|
There has been a lot of pieces of Terraform code that was omitted, like when we use the declare the `terraform_remote_state` or the `authorizer_id` which you will need if using authorization "CUSTOM".
|
||||||
178
content/posts/automated-changelogs-gitlab.md
Executable file
178
content/posts/automated-changelogs-gitlab.md
Executable file
@@ -0,0 +1,178 @@
|
|||||||
|
---
|
||||||
|
title: "Automated Changelogs on GitLab"
|
||||||
|
date: 2023-05-15T22:38:55-03:00
|
||||||
|
draft: false
|
||||||
|
summary: "Changelog automation on GitLab CI"
|
||||||
|
---
|
||||||
|
|
||||||
|
Changelogs are good, mainly if you need to keep track of what was changed on a release. But they can be a pain to write, especially if you have a lot of commits, people working on the same project, lots of tasks, and so on. A good spot to put some **automation**.
|
||||||
|
|
||||||
|
There are a couple of ways we could make an automated changelog system, we will focus on making one that uses GitLab CI and the commit messages from the project. We will also take into consideration that *releases are made through git tags*.
|
||||||
|
|
||||||
|
For this, we will start with a few requirements:
|
||||||
|
* Plan on a commit message pattern, for example: "[TASK-200] Fixing something for a task on Jira";
|
||||||
|
* Have the release notes/changelogs on a specific part of pipeline (for example production release);
|
||||||
|
* The release notes generation will take part when creating a tag.
|
||||||
|
|
||||||
|
We will take advantage of these two commands:
|
||||||
|
1. `git log --pretty=format:"%s" --no-merges <tag>..HEAD` - This will give us the commit messages from the last tag to the HEAD;
|
||||||
|
2. `git describe --abbrev=0 --tags` - This will give us the latest tag.
|
||||||
|
|
||||||
|
## Creating a basic pipeline
|
||||||
|
|
||||||
|
Let's start by creating a basic pipeline that will run on the production release.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
run:
|
||||||
|
script:
|
||||||
|
- echo "Running the pipeline"
|
||||||
|
|
||||||
|
.generateChangelog:
|
||||||
|
image: python:latest
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- echo "Generating changelog..."
|
||||||
|
# Generate changelog here
|
||||||
|
artifacts:
|
||||||
|
name: changelog.txt
|
||||||
|
paths:
|
||||||
|
- changelog.txt
|
||||||
|
when: always
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
extends:
|
||||||
|
- .generateChangelog
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
when: manual
|
||||||
|
environment: production
|
||||||
|
```
|
||||||
|
|
||||||
|
We will output the changelog into a file named `changelog.txt` and then we will use the `artifacts` keyword to save it.
|
||||||
|
|
||||||
|
## Generating the changelog
|
||||||
|
|
||||||
|
Note that we set the image to be `python:latest` on the `.generateChangelog` job, this is because we will use a Python script to generate the changelog. Inside the code we will set two functions: one that will return the latest tag, and another that will get the commits between the latest tag and the HEAD.
|
||||||
|
|
||||||
|
To call commands on the OS we will use the `subprocess` module, and to get the output from the command we will use the `communicate()` function. In case of an error, we can further add some error handling (more on this later).
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_last_tag():
|
||||||
|
pipe = sp.Popen('git describe --abbrev=0 --tags', shell=True, stdout=sp.PIPE, stderr=sp.PIPE)
|
||||||
|
prev_tag, err = pipe.communicate()
|
||||||
|
|
||||||
|
# If it returns 0, it means it was successful
|
||||||
|
if (pipe.returncode == 0):
|
||||||
|
return prev_tag.strip()
|
||||||
|
|
||||||
|
def get_commits():
|
||||||
|
prev_tag = get_last_tag().decode('utf-8')
|
||||||
|
|
||||||
|
print('Previous tag: ' + prev_tag)
|
||||||
|
|
||||||
|
pipe = sp.Popen('git rev-list ' + prev_tag + '..HEAD --format=%s', shell=True, stdout=sp.PIPE, stderr=sp.PIPE)
|
||||||
|
|
||||||
|
commits, err = pipe.communicate()
|
||||||
|
|
||||||
|
# Only dealing with 0 for now
|
||||||
|
if (pipe.returncode == 0):
|
||||||
|
commits = commits.strip().decode('utf-8').split('\n')
|
||||||
|
|
||||||
|
return commits
|
||||||
|
```
|
||||||
|
|
||||||
|
Now we should get a list of the commits that we want. Calling the function `get_commits()` will return a string list with all the commits, but there could be some commits that we don't want to show on the changelog, for example: `Merge branch 'master' into 'develop'`. **This is where having a pattern will help.**
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_formatted_commits():
|
||||||
|
commits = get_commits()
|
||||||
|
|
||||||
|
formatted_commits = []
|
||||||
|
|
||||||
|
for commit in commits:
|
||||||
|
if commit.startswith('[TASK-') or commit.startswith('[BUG-'):
|
||||||
|
formatted_commits.append(commit)
|
||||||
|
|
||||||
|
return formatted_commits
|
||||||
|
```
|
||||||
|
|
||||||
|
This will give us only the important commit messages with the pattern that we want. We can further improve this by adding a regex, transforming `formatted_commits` into a `set` of Task Numbers, do some parsing, API calls, whatever we want. For now, we will keep simple and do the basic.
|
||||||
|
|
||||||
|
## Writing the changelog
|
||||||
|
|
||||||
|
Now that we have the commits that we want, we can write them to a file. We will use the `open` function to open the file and write the commits to it.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def write_changelog():
|
||||||
|
commits = get_formatted_commits()
|
||||||
|
|
||||||
|
with open('changelog.txt', 'w') as f:
|
||||||
|
for commit in commits:
|
||||||
|
f.write(commit + '\n')
|
||||||
|
```
|
||||||
|
|
||||||
|
## Putting it all together on the pipeline yaml file
|
||||||
|
|
||||||
|
Now that we have the everything we want, we can put them all together on the pipeline yaml file.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
run:
|
||||||
|
script:
|
||||||
|
- echo "Running the pipeline"
|
||||||
|
|
||||||
|
.generateChangelog:
|
||||||
|
image: python:latest
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- echo "Generating changelog..."
|
||||||
|
- git tag -d $(git describe --abbrev=0 --tags) || true
|
||||||
|
- python changelog.py
|
||||||
|
artifacts:
|
||||||
|
name: changelog.txt
|
||||||
|
paths:
|
||||||
|
- changelog.txt
|
||||||
|
when: always
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
extends:
|
||||||
|
- .generateChangelog
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
when: manual
|
||||||
|
environment: production
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that we had to add `git tag -d $(git describe --abbrev=0 --tags)` command there to delete the latest tag. This is because we are using the `git describe` command to get the latest tag, and if we don't delete it, the changelog will be empty. The `|| true` is there to make sure that the pipeline doesn't fail if a tag doesn't exist.
|
||||||
|
|
||||||
|
## Error handling
|
||||||
|
|
||||||
|
We can further improve this by adding some error handling. For example, if we don't have any tags, we can set a default hash (which would be the start of git history).
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_last_tag():
|
||||||
|
pipe = sp.Popen('git describe --abbrev=0 --tags', shell=True, stdout=sp.PIPE, stderr=sp.PIPE)
|
||||||
|
prev_tag, err = pipe.communicate()
|
||||||
|
|
||||||
|
# If it's successful, we return the tag name
|
||||||
|
if (pipe.returncode == 0):
|
||||||
|
return prev_tag.strip()
|
||||||
|
else:
|
||||||
|
# If it's not successful, we return the first commit hash
|
||||||
|
pipe = sp.Popen('git rev-list --max-parents=0 HEAD', shell=True, stdout=sp.PIPE, stderr=sp.PIPE)
|
||||||
|
first_commit, err = pipe.communicate()
|
||||||
|
|
||||||
|
# If it's successful, we return the first commit hash
|
||||||
|
if (pipe.returncode == 0):
|
||||||
|
return first_commit.strip()
|
||||||
|
else:
|
||||||
|
# If it's not successful, we print the error and exit, there's something else wrong
|
||||||
|
print('Error: Could not get the last commit hash')
|
||||||
|
print(err.strip())
|
||||||
|
sys.exit(1)
|
||||||
|
```
|
||||||
|
|
||||||
|
Further error handling or improvements can be done, this is just a proof of concept. On another note, the code hasn't been tested *as is*, so there might be some errors.
|
||||||
104
content/posts/error-handling-dotnet.md
Normal file
104
content/posts/error-handling-dotnet.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
title: ".NET - Proper API error handling"
|
||||||
|
date: 2024-06-20T20:00:06-03:00
|
||||||
|
draft: false
|
||||||
|
summary: "Because returning stack traces isn't secure."
|
||||||
|
---
|
||||||
|
|
||||||
|
The main idea behind having centralized error handling is that we can process any unhandled exception to:
|
||||||
|
* Return formatted responses without revealing any internal functionality
|
||||||
|
* Process issues so that they are properly logged on logs or other monitoring systems (like Sentry)
|
||||||
|
* Make sure all errors have the same external behavior
|
||||||
|
|
||||||
|
For that, we will use a new middleware class:
|
||||||
|
```csharp
|
||||||
|
public class ErrorResponse
|
||||||
|
{
|
||||||
|
public string Message { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class ErrorHandlerMiddleware {
|
||||||
|
private readonly RequestDelegate _next;
|
||||||
|
private readonly ILogger<ErrorHandlerMiddleware> _logger;
|
||||||
|
private readonly IHostEnvironment _env;
|
||||||
|
|
||||||
|
public ErrorHandlerMiddleware(RequestDelegate next, ILogger<ErrorHandlerMiddleware> logger, IHostEnvironment env){
|
||||||
|
_next = next;
|
||||||
|
_logger = logger;
|
||||||
|
_env = env;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Invoke(HttpContext httpContext)
|
||||||
|
{
|
||||||
|
// Attempts to execute the next action on the http chain
|
||||||
|
// If it fails, we log the exception and trigger the HandleErrorAsync method
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _next(httpContext);
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "An unhandled exception has occurred: {Message}", ex.Message);
|
||||||
|
await HandleErrorAsync(httpContext, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task HandleErrorAsync(HttpContext context, Exception exception)
|
||||||
|
{
|
||||||
|
context.Response.ContentType = "application/json";
|
||||||
|
context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
|
||||||
|
|
||||||
|
ErrorResponse errorResponse;
|
||||||
|
|
||||||
|
if (_env.IsDevelopment())
|
||||||
|
{
|
||||||
|
// In development, we want to see the full details for easier debugging.
|
||||||
|
errorResponse = new ErrorResponse
|
||||||
|
{
|
||||||
|
Message = exception.ToString()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// In production, we return a generic message to avoid leaking details.
|
||||||
|
errorResponse = new ErrorResponse
|
||||||
|
{
|
||||||
|
Message = "An internal server error occurred. Please try again later."
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// We use the modern System.Text.Json for serialization via WriteAsJsonAsync
|
||||||
|
await context.Response.WriteAsJsonAsync(errorResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
We will also define a new Extension class to register this middleware:
|
||||||
|
```csharp
|
||||||
|
public static class ErrorHandlerExtensions
|
||||||
|
{
|
||||||
|
public static IApplicationBuilder UseErrorHandler(this IApplicationBuilder appBuilder)
|
||||||
|
{
|
||||||
|
return appBuilder.UseMiddleware<ErrorHandler>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
And then we just configure it on the `Configure()` method at the startup:
|
||||||
|
```csharp
|
||||||
|
public void Configure(IApplicationBuilder app)
|
||||||
|
{
|
||||||
|
app.UseErrorHandler();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, when there's an issue on the API execution, the API will return something like this:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Message": "Internal Server Error"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Sources:
|
||||||
|
* [https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-8.0](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-8.0)
|
||||||
56
content/posts/home-k8s.md
Executable file
56
content/posts/home-k8s.md
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
---
|
||||||
|
title: "Homemade Kubernetes"
|
||||||
|
date: 2025-08-18T10:30:00-03:00
|
||||||
|
draft: false
|
||||||
|
summary: Why I went with k3s for local homelab.
|
||||||
|
---
|
||||||
|
|
||||||
|
tl;dr: wanted to learn k8s properly and wanted some high availability for some services. Also solves loneliness ;)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
I started to have some issues in regards to high availability for some services. I wanted to make sure that my self-hosted applications would remain accessible even if one of my servers went down (like Jellyfin). This led me to explore Kubernetes as a solution.
|
||||||
|
|
||||||
|
As you may or may not know, k8s is a container orchestration platform that automates the deployment, scaling, and management of containerized applications. However it comes with a lot of complexity and operational overhead. I tried to set up a k8s cluster using [k3s](https://k3s.io/), which is a lightweight version of Kubernetes. It seems to be a good starting point, I'm using it since then and has been working wonders so far.
|
||||||
|
|
||||||
|
Currently I'm running them while all config files are on a NFS server, this makes managing configurations easier and backup-ready. For this, I'm using `nfs-subdir-external-provisioner` to manage PVCs through NFS. I have also setup 2 backup cronjobs: one for local servers and another for a remote server.
|
||||||
|
|
||||||
|
## Pros and cons
|
||||||
|
|
||||||
|
Pros that I have noticed:
|
||||||
|
* **Easy to set up and manage**: k3s is designed to be lightweight and easy to install
|
||||||
|
* **High availability**: if a server goes down, I can still access the services in there
|
||||||
|
* I haven't been able to properly set a HA k3s cluster yet as I need more hardware
|
||||||
|
* Currently, I'm using a single master-node setup
|
||||||
|
* **Backups** are easy to manage if you have all configurations under one place.
|
||||||
|
* **Cronjobs** are a breeze to set up and manage, mainly if you need to perform backup rituals.
|
||||||
|
* **"Enterprise-grade"** cluster in your home!
|
||||||
|
* **Have fun :)**
|
||||||
|
|
||||||
|
Cons:
|
||||||
|
* **Complexity**: While k3s simplifies many aspects of Kubernetes, it still requires a certain level of understanding of container orchestration concepts.
|
||||||
|
* **Single-point of failure**: In my current setup, the single master node is a potential point of failure. If it goes down, the entire cluster becomes unavailable.
|
||||||
|
* This can be solved with a multi-master setup, but it requires additional hardware.
|
||||||
|
* **Learning curve**: Kubernetes has a steep learning curve -- which is good for people like me.
|
||||||
|
|
||||||
|
## Current setup
|
||||||
|
|
||||||
|
This is my current (might be outdated) setup:
|
||||||
|
* 2 Orange Pi running k3s
|
||||||
|
- Each with 4 GB RAM, 4C/4T, 256GB SD card on each.
|
||||||
|
* 1 Mini PC
|
||||||
|
- 6 GB RAM, 2C/4T, 64GB internal memory + 512GB SD Card
|
||||||
|
* Proxmox
|
||||||
|
- 32 GB RAM, 6C/12T, 1 TB SSD
|
||||||
|
- Currently I run these VMs with k3s:
|
||||||
|
- 1 prod-like VM
|
||||||
|
- 1 dev-like VM
|
||||||
|
- 1 work sandbox VM
|
||||||
|
|
||||||
|
At a tech level, I haven't made my setup / scripts / configurations public yet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
I believe that everyone should try this at home, be in a dedicated hardware/server or in a VM. It's a great way to learn and experiment with Kubernetes in a controlled environment.
|
||||||
|
|
||||||
|
I'm still running some services on Docker itself, but I'm slowly migrating them to k8s. Some services like DNS and Traefik Reverse Proxy are a bit more complex to set up.
|
||||||
7
content/posts/projetos.md
Executable file
7
content/posts/projetos.md
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "Projetos"
|
||||||
|
date: 2022-04-05T13:39:09-03:00
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Nada aqui ainda, mas era pra ter.
|
||||||
48
content/posts/selfhost.md
Executable file
48
content/posts/selfhost.md
Executable file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
title: "Self Hosting"
|
||||||
|
date: 2025-01-19T14:00:00-03:00
|
||||||
|
draft: false
|
||||||
|
summary: "Everyone should have Netflix at home"
|
||||||
|
---
|
||||||
|
|
||||||
|
[Why I'm slowly changing to Kubernetes.](https://blog.ivanch.me/posts/home-k8s/)
|
||||||
|
|
||||||
|
# Honorable Mentions:
|
||||||
|
* [Proxmox VE](https://www.proxmox.com/) - Got put those VMs somewhere.
|
||||||
|
* [Proxmox VE Helper Scripts](https://community-scripts.github.io/ProxmoxVE/) - easy deploys.
|
||||||
|
* [OpenMediaVault](https://www.openmediavault.org/) - NAS made simple.
|
||||||
|
|
||||||
|
## Necessary ones
|
||||||
|
* [AdGuard](https://hub.docker.com/r/adguard/adguardhome) - DNS-based Adblocker service (also useful to block malware and other unwanted things).
|
||||||
|
* Easy setup alternative: [PiHole](https://hub.docker.com/r/pihole/pihole) - Same thing, but easier to setup.
|
||||||
|
* [Dockge](https://dockge.kuma.pet/) - Container and Compose management.
|
||||||
|
* Alternative: [Portainer](https://www.portainer.io/) - Container management.
|
||||||
|
* [Traefik](https://hub.docker.com/_/traefik) - Reverse proxy manager.
|
||||||
|
* Alternative: [Nginx Proxy Manager](https://nginxproxymanager.com/)
|
||||||
|
* [WatchTower](https://containrrr.dev/watchtower/) - Automatic container updates.
|
||||||
|
* My lightweight alternative to this is my own `.sh` script that runs every 4 days that updates all containers on a specific server.
|
||||||
|
* [Paperless](https://docs.paperless-ngx.com/) - Keep those important documents and papers organized with easy searching.
|
||||||
|
|
||||||
|
## Misc
|
||||||
|
* [Homarr](https://homarr.dev/) - A stylish dashboard with all services and sometimes some nice widgets.
|
||||||
|
* [Beszel](https://beszel.dev/) - Server monitor with some useful alarms.
|
||||||
|
* [Uptime Kuma](https://uptime.kuma.pet/) - Status monitoring for applications.
|
||||||
|
* [Gitea](https://gitea.com/) - Homemade GitHub (with Actions!)
|
||||||
|
* [Notepad](https://github.com/pereorga/minimalist-web-notepad) - Homemade dontpad.
|
||||||
|
* [Code Server](https://hub.docker.com/r/linuxserver/code-server/) - VSCode inside of a Docker.
|
||||||
|
* [FileBrowser](https://filebrowser.org/installation#docker/) - Hosting files made easier.
|
||||||
|
* [nginx](https://hub.docker.com/_/nginx/) - Let's all love nginx.
|
||||||
|
* [WireGuard](https://hub.docker.com/r/linuxserver/wireguard) - Personal VPN tunnel.
|
||||||
|
* [it-tools](https://hub.docker.com/r/corentinth/it-tools) - Some useful tools that we use every now and then.
|
||||||
|
|
||||||
|
## Media (*arr stack)
|
||||||
|
* [Jellyfin](https://hub.docker.com/r/linuxserver/jellyfin/) - Homemade Netflix (I hate Plex).
|
||||||
|
* [Transmission](https://hub.docker.com/r/linuxserver/transmission/) - Torrent client with a simple web interface.
|
||||||
|
* Alternative [qBitTorrent](https://hub.docker.com/r/linuxserver/qbittorrent) - A more advanced web interface.
|
||||||
|
* [Prowlarr](https://hub.docker.com/r/linuxserver/prowlarr/) - Torrent tracker aggregator.
|
||||||
|
* [Sonarr](https://hub.docker.com/r/linuxserver/sonarr/) - TV shows management (Torrent integration).
|
||||||
|
* [Radarr](https://hub.docker.com/r/linuxserver/radarr/) - Movies management (Torrent integration).
|
||||||
|
* [Lidarr](https://hub.docker.com/r/linuxserver/lidarr/) - Music management (Torrent integration), though I don't use this one.
|
||||||
|
|
||||||
|
## Game server
|
||||||
|
* [Minecraft Server](https://hub.docker.com/r/itzg/minecraft-server/) - For that 2 week period every 3 years.
|
||||||
7
content/posts/unhealthy-workers.md
Normal file
7
content/posts/unhealthy-workers.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "Unhealthy Workers"
|
||||||
|
date: 2025-06-20T23:11:44-03:00
|
||||||
|
draft: true
|
||||||
|
summary: "Put those workers to work!"
|
||||||
|
---
|
||||||
|
|
||||||
22
themes/PaperMod/LICENSE
Normal file
22
themes/PaperMod/LICENSE
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 nanxiaobei and adityatelange
|
||||||
|
Copyright (c) 2021-2025 adityatelange
|
||||||
|
|
||||||
|
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.
|
||||||
106
themes/PaperMod/README.md
Normal file
106
themes/PaperMod/README.md
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<h1 align=center>Hugo PaperMod | <a href="https://adityatelange.github.io/hugo-PaperMod/" rel="nofollow">Demo</a></h1>
|
||||||
|
|
||||||
|
<h4 align=center>☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive</h4>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper/tree/4330c8b12aa48bfdecbcad6ad66145f679a430b3).<br>
|
||||||
|
> The goal of this project is to add more features and customization to the og theme.
|
||||||
|
|
||||||
|
**Documentation** can be found here: [**📚 Wiki**](https://github.com/adityatelange/hugo-PaperMod/wiki)
|
||||||
|
|
||||||
|
**ExampleSite** can be found here: [**exampleSite**](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source.
|
||||||
|
|
||||||
|
[](https://themes.gohugo.io/themes/hugo-papermod/)
|
||||||
|
[](https://github.com/gohugoio/hugo/releases/tag/v0.146.0)
|
||||||
|
[](https://discord.gg/ahpmTvhVmp)
|
||||||
|
[](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
|
||||||
|

|
||||||
|
[](https://x.com/intent/tweet/?text=Checkout%20Hugo%20PaperMod%20%E2%9C%A8%0AA%20fast,%20clean,%20responsive%20Hugo%20theme.&url=https://github.com/adityatelange/hugo-PaperMod&hashtags=Hugo,PaperMod)
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<kbd><img src="https://user-images.githubusercontent.com/21258296/114303440-bfc0ae80-9aeb-11eb-8cfa-48a4bb385a6d.png" alt="Mockup image" title="Mockup"/></kbd>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features/Mods 💥
|
||||||
|
|
||||||
|
- Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default.
|
||||||
|
- 3 Modes:
|
||||||
|
- [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode)
|
||||||
|
- [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode)
|
||||||
|
- [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode)
|
||||||
|
- Table of Content Generation (newer implementation).
|
||||||
|
- Archive of posts.
|
||||||
|
- Social Icons (home-info and profile-mode).
|
||||||
|
- Social-Media Share buttons on posts.
|
||||||
|
- Menu location indicator.
|
||||||
|
- Multilingual support. (with language selector).
|
||||||
|
- Taxonomies.
|
||||||
|
- Cover image for each post (with Responsive image support).
|
||||||
|
- Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button).
|
||||||
|
- SEO Friendly.
|
||||||
|
- Multiple Author support.
|
||||||
|
- Search Page with Fuse.js
|
||||||
|
- Other Posts suggestion below a post
|
||||||
|
- Breadcrumb Navigation.
|
||||||
|
- Code Block Copy buttons.
|
||||||
|
- Hugo's Chroma syntax highlighter.
|
||||||
|
- No webpack, nodejs and other dependencies are required to edit the theme.
|
||||||
|
|
||||||
|
Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Install/Update 📥
|
||||||
|
|
||||||
|
Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## FAQs / How To's Guide 🙋
|
||||||
|
|
||||||
|
Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Social-Icons/Share-Icons 🖼️
|
||||||
|
|
||||||
|
Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Release Changelog 📃
|
||||||
|
|
||||||
|
Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Support 🫶
|
||||||
|
|
||||||
|
- Star 🌟 this repository.
|
||||||
|
- Help spread the word about PaperMod by sharing it on social media and recommending it to your friends. 🗣️
|
||||||
|
- You can also sponsor 🏅 on [Github Sponsors](https://github.com/sponsors/adityatelange) / [Ko-Fi](https://ko-fi.com/adityatelange).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Special Thanks 🌟
|
||||||
|
|
||||||
|
- [**Highlight.js**](https://github.com/highlightjs/highlight.js)
|
||||||
|
- [**Fuse.js**](https://github.com/krisk/fuse)
|
||||||
|
- [**Feather Icons**](https://github.com/feathericons/feather)
|
||||||
|
- [**Simple Icons**](https://github.com/simple-icons/simple-icons)
|
||||||
|
- **All Contributors and Supporters**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stargazers over time 📈
|
||||||
|
|
||||||
|
[](https://starchart.cc/adityatelange/hugo-PaperMod)
|
||||||
11
themes/PaperMod/assets/css/common/404.css
Normal file
11
themes/PaperMod/assets/css/common/404.css
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
.not-found {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 80%;
|
||||||
|
font-size: 160px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
44
themes/PaperMod/assets/css/common/archive.css
Normal file
44
themes/PaperMod/assets/css/common/archive.css
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
.archive-posts {
|
||||||
|
width: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-year {
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-year:not(:last-of-type) {
|
||||||
|
border-bottom: 2px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-month {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-month-header {
|
||||||
|
margin: 25px 0;
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-month:not(:last-of-type) {
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-entry {
|
||||||
|
position: relative;
|
||||||
|
padding: 5px;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-entry-title {
|
||||||
|
margin: 5px 0;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-count,
|
||||||
|
.archive-meta {
|
||||||
|
color: var(--secondary);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
60
themes/PaperMod/assets/css/common/footer.css
Normal file
60
themes/PaperMod/assets/css/common/footer.css
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
.footer,
|
||||||
|
.top-link {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
max-width: calc(var(--main-width) + var(--gap) * 2);
|
||||||
|
margin: auto;
|
||||||
|
padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap);
|
||||||
|
text-align: center;
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer span {
|
||||||
|
margin-inline-start: 1px;
|
||||||
|
margin-inline-end: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer span:last-child {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a {
|
||||||
|
color: inherit;
|
||||||
|
border-bottom: 1px solid var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a:hover {
|
||||||
|
border-bottom: 1px solid var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-link {
|
||||||
|
visibility: hidden;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 60px;
|
||||||
|
right: 30px;
|
||||||
|
z-index: 99;
|
||||||
|
background: var(--tertiary);
|
||||||
|
width: 42px;
|
||||||
|
height: 42px;
|
||||||
|
padding: 12px;
|
||||||
|
border-radius: 64px;
|
||||||
|
transition: visibility 0.5s, opacity 0.8s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-link,
|
||||||
|
.top-link svg {
|
||||||
|
filter: drop-shadow(0px 0px 0px var(--theme));
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a:hover,
|
||||||
|
.top-link:hover {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-link:focus,
|
||||||
|
#theme-toggle:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
93
themes/PaperMod/assets/css/common/header.css
Normal file
93
themes/PaperMod/assets/css/common/header.css
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
.nav {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
max-width: calc(var(--nav-width) + var(--gap) * 2);
|
||||||
|
margin-inline-start: auto;
|
||||||
|
margin-inline-end: auto;
|
||||||
|
line-height: var(--header-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav a {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo,
|
||||||
|
#menu {
|
||||||
|
display: flex;
|
||||||
|
margin: auto var(--gap);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
flex-wrap: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo a {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo a img, .logo a svg {
|
||||||
|
display: inline;
|
||||||
|
vertical-align: middle;
|
||||||
|
pointer-events: none;
|
||||||
|
transform: translate(0, -10%);
|
||||||
|
border-radius: 6px;
|
||||||
|
margin-inline-end: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button#theme-toggle {
|
||||||
|
font-size: 26px;
|
||||||
|
margin: auto 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.dark #moon {
|
||||||
|
vertical-align: middle;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
body:not(.dark) #sun {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu {
|
||||||
|
list-style: none;
|
||||||
|
word-break: keep-all;
|
||||||
|
overflow-x: auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu li + li {
|
||||||
|
margin-inline-start: var(--gap);
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu a {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu .active {
|
||||||
|
font-weight: 500;
|
||||||
|
border-bottom: 2px solid currentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-switch li,
|
||||||
|
.lang-switch ul,
|
||||||
|
.logo-switches {
|
||||||
|
display: inline-flex;
|
||||||
|
margin: auto 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-switch {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lang-switch a {
|
||||||
|
margin: auto 3px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-switches {
|
||||||
|
flex-wrap: inherit;
|
||||||
|
}
|
||||||
66
themes/PaperMod/assets/css/common/main.css
Normal file
66
themes/PaperMod/assets/css/common/main.css
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
.main {
|
||||||
|
position: relative;
|
||||||
|
min-height: calc(100vh - var(--header-height) - var(--footer-height));
|
||||||
|
max-width: calc(var(--main-width) + var(--gap) * 2);
|
||||||
|
margin: auto;
|
||||||
|
padding: var(--gap);
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header h1 {
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination a {
|
||||||
|
color: var(--theme);
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 36px;
|
||||||
|
background: var(--primary);
|
||||||
|
border-radius: calc(36px / 2);
|
||||||
|
padding: 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination .next {
|
||||||
|
margin-inline-start: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.social-icons a {
|
||||||
|
display: inline-flex;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.social-icons a svg {
|
||||||
|
height: 26px;
|
||||||
|
width: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.highlight,
|
||||||
|
pre {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-code {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 4px;
|
||||||
|
right: 4px;
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
background: rgba(78, 78, 78, 0.8);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: 0 5px;
|
||||||
|
font-size: 14px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.highlight:hover .copy-code,
|
||||||
|
pre:hover .copy-code {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
107
themes/PaperMod/assets/css/common/post-entry.css
Normal file
107
themes/PaperMod/assets/css/common/post-entry.css
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
.first-entry {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 320px;
|
||||||
|
margin: var(--gap) 0 calc(var(--gap) * 2) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.first-entry .entry-header {
|
||||||
|
overflow: hidden;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.first-entry .entry-header h1 {
|
||||||
|
font-size: 34px;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.first-entry .entry-content {
|
||||||
|
margin: 14px 0;
|
||||||
|
font-size: 16px;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.first-entry .entry-footer {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home-info .entry-content {
|
||||||
|
-webkit-line-clamp: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-entry {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: var(--gap);
|
||||||
|
padding: var(--gap);
|
||||||
|
background: var(--entry);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
transition: transform 0.1s;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-entry:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-entry .entry-cover {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-header h2 {
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-content {
|
||||||
|
margin: 8px 0;
|
||||||
|
color: var(--secondary);
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.6;
|
||||||
|
overflow: hidden;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-footer {
|
||||||
|
color: var(--secondary);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-link {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-hint {
|
||||||
|
color: var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-hint-parent {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-cover {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: var(--gap);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-cover img {
|
||||||
|
border-radius: var(--radius);
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-cover a {
|
||||||
|
color: var(--secondary);
|
||||||
|
box-shadow: 0 1px 0 var(--primary);
|
||||||
|
}
|
||||||
410
themes/PaperMod/assets/css/common/post-single.css
Normal file
410
themes/PaperMod/assets/css/common/post-single.css
Normal file
@@ -0,0 +1,410 @@
|
|||||||
|
.page-header,
|
||||||
|
.post-header {
|
||||||
|
margin: 24px auto var(--content-gap) auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-title {
|
||||||
|
margin-bottom: 2px;
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-description {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-meta,
|
||||||
|
.breadcrumbs {
|
||||||
|
color: var(--secondary);
|
||||||
|
font-size: 14px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-meta .i18n_list li {
|
||||||
|
display: inline-flex;
|
||||||
|
list-style: none;
|
||||||
|
margin: auto 3px;
|
||||||
|
box-shadow: 0 1px 0 var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumbs a {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content {
|
||||||
|
color: var(--content);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h3,
|
||||||
|
.post-content h4,
|
||||||
|
.post-content h5,
|
||||||
|
.post-content h6 {
|
||||||
|
margin: 24px 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h1 {
|
||||||
|
margin: 40px auto 32px;
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h2 {
|
||||||
|
margin: 32px auto 24px;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h3 {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h5 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content h6 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content a,
|
||||||
|
.toc a:hover {
|
||||||
|
box-shadow: 0 1px 0;
|
||||||
|
box-decoration-break: clone;
|
||||||
|
-webkit-box-decoration-break: clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content a code {
|
||||||
|
margin: auto 0;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: 0 -1px 0 var(--primary) inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content del {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content dl,
|
||||||
|
.post-content ol,
|
||||||
|
.post-content p,
|
||||||
|
.post-content figure,
|
||||||
|
.post-content ul {
|
||||||
|
margin-bottom: var(--content-gap);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content ol,
|
||||||
|
.post-content ul {
|
||||||
|
padding-inline-start: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content li {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content li p {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content dl {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content dt {
|
||||||
|
width: 25%;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content dd {
|
||||||
|
width: 75%;
|
||||||
|
margin-inline-start: 0;
|
||||||
|
padding-inline-start: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content dd~dd,
|
||||||
|
.post-content dt~dt {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content table {
|
||||||
|
margin-bottom: var(--content-gap);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content table th,
|
||||||
|
.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td {
|
||||||
|
min-width: 80px;
|
||||||
|
padding: 8px 5px;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content table th {
|
||||||
|
text-align: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content table:not(.highlighttable) td code:only-child {
|
||||||
|
margin: auto 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlight table {
|
||||||
|
border-radius: var(--radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlight:not(table) {
|
||||||
|
margin: 10px auto;
|
||||||
|
background: var(--code-block-bg) !important;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content li>.highlight {
|
||||||
|
margin-inline-end: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content ul pre {
|
||||||
|
margin-inline-start: calc(var(--gap) * -2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlight pre {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlighttable {
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlighttable td:first-child {
|
||||||
|
width: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlighttable td .linenodiv {
|
||||||
|
padding-inline-end: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content .highlighttable td .highlight,
|
||||||
|
.post-content .highlighttable td .linenodiv pre {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content code {
|
||||||
|
margin: auto 4px;
|
||||||
|
padding: 4px 6px;
|
||||||
|
font-size: 0.78em;
|
||||||
|
line-height: 1.5;
|
||||||
|
background: var(--code-bg);
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content pre code {
|
||||||
|
display: grid;
|
||||||
|
margin: auto 0;
|
||||||
|
padding: 10px;
|
||||||
|
color: rgb(213, 213, 214);
|
||||||
|
background: var(--code-block-bg) !important;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
overflow-x: auto;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content blockquote {
|
||||||
|
margin: 20px 0;
|
||||||
|
padding: 0 14px;
|
||||||
|
border-inline-start: 3px solid var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content hr {
|
||||||
|
margin: 30px 0;
|
||||||
|
height: 2px;
|
||||||
|
background: var(--tertiary);
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content iframe {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content img {
|
||||||
|
border-radius: 4px;
|
||||||
|
margin: 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content img[src*="#center"] {
|
||||||
|
margin: 1rem auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content figure.align-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content figure>figcaption {
|
||||||
|
color: var(--primary);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 8px 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content figure>figcaption>p {
|
||||||
|
color: var(--secondary);
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc {
|
||||||
|
margin: 0 2px 40px 2px;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
background: var(--code-bg);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .toc {
|
||||||
|
background: var(--entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc details summary {
|
||||||
|
cursor: zoom-in;
|
||||||
|
margin-inline-start: 10px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc details[open] summary {
|
||||||
|
cursor: zoom-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc .details {
|
||||||
|
display: inline;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc .inner {
|
||||||
|
margin: 5px 20px 0;
|
||||||
|
padding: 0 10px;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc li ul {
|
||||||
|
margin-inline-start: var(--gap);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc summary:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-footer {
|
||||||
|
margin-top: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-footer>* {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-tags {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-tags li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-tags a,
|
||||||
|
.share-buttons,
|
||||||
|
.paginav {
|
||||||
|
border-radius: var(--radius);
|
||||||
|
background: var(--code-bg);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-tags a {
|
||||||
|
display: block;
|
||||||
|
padding: 0 14px;
|
||||||
|
color: var(--secondary);
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 34px;
|
||||||
|
background: var(--code-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-tags a:hover,
|
||||||
|
.paginav a:hover {
|
||||||
|
background: var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-buttons {
|
||||||
|
padding: 10px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
overflow-x: auto;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-buttons li,
|
||||||
|
.share-buttons a {
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-buttons a:not(:last-of-type) {
|
||||||
|
margin-inline-end: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1:hover .anchor,
|
||||||
|
h2:hover .anchor,
|
||||||
|
h3:hover .anchor,
|
||||||
|
h4:hover .anchor,
|
||||||
|
h5:hover .anchor,
|
||||||
|
h6:hover .anchor {
|
||||||
|
display: inline-flex;
|
||||||
|
color: var(--secondary);
|
||||||
|
margin-inline-start: 8px;
|
||||||
|
font-weight: 500;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paginav {
|
||||||
|
display: flex;
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paginav a {
|
||||||
|
padding-inline-start: 14px;
|
||||||
|
padding-inline-end: 14px;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.paginav .title {
|
||||||
|
letter-spacing: 1px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: small;
|
||||||
|
color: var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.paginav .prev,
|
||||||
|
.paginav .next {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paginav span:hover:not(.title) {
|
||||||
|
box-shadow: 0 1px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paginav .next {
|
||||||
|
margin-inline-start: auto;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
[dir="rtl"] .paginav .next {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1>a>svg {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.in-text {
|
||||||
|
display: inline;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
43
themes/PaperMod/assets/css/common/profile-mode.css
Normal file
43
themes/PaperMod/assets/css/common/profile-mode.css
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
.buttons,
|
||||||
|
.main .profile {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .profile {
|
||||||
|
align-items: center;
|
||||||
|
min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile .profile_inner {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile img {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
background: var(--tertiary);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
margin: 8px;
|
||||||
|
padding: 6px;
|
||||||
|
transition: transform 0.1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-inner {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
45
themes/PaperMod/assets/css/common/search.css
Normal file
45
themes/PaperMod/assets/css/common/search.css
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#searchbox input {
|
||||||
|
padding: 4px 10px;
|
||||||
|
width: 100%;
|
||||||
|
color: var(--primary);
|
||||||
|
font-weight: bold;
|
||||||
|
border: 2px solid var(--tertiary);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchbox input:focus {
|
||||||
|
border-color: var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResults li {
|
||||||
|
list-style: none;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: 10px;
|
||||||
|
margin: 10px 0;
|
||||||
|
position: relative;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResults {
|
||||||
|
margin: 10px 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResults li:active {
|
||||||
|
transition: transform 0.1s;
|
||||||
|
transform: scale(0.98);
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResults a {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResults .focus {
|
||||||
|
transform: scale(0.98);
|
||||||
|
border: 2px solid var(--tertiary);
|
||||||
|
}
|
||||||
18
themes/PaperMod/assets/css/common/terms.css
Normal file
18
themes/PaperMod/assets/css/common/terms.css
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
.terms-tags li {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.terms-tags a {
|
||||||
|
display: block;
|
||||||
|
padding: 3px 10px;
|
||||||
|
background: var(--tertiary);
|
||||||
|
border-radius: 6px;
|
||||||
|
transition: transform 0.1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.terms-tags a:active {
|
||||||
|
background: var(--tertiary);
|
||||||
|
transform: scale(0.96);
|
||||||
|
}
|
||||||
6
themes/PaperMod/assets/css/core/license.css
Normal file
6
themes/PaperMod/assets/css/core/license.css
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*
|
||||||
|
PaperMod v8+
|
||||||
|
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
||||||
|
Copyright (c) 2020 nanxiaobei and adityatelange
|
||||||
|
Copyright (c) 2021-2025 adityatelange
|
||||||
|
*/
|
||||||
118
themes/PaperMod/assets/css/core/reset.css
Normal file
118
themes/PaperMod/assets/css/core/reset.css
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
*,
|
||||||
|
::after,
|
||||||
|
::before {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
overflow-y: scroll;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
text-size-adjust: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
button,
|
||||||
|
body,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.6;
|
||||||
|
word-break: break-word;
|
||||||
|
background: var(--theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
figcaption,
|
||||||
|
figure,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
hgroup,
|
||||||
|
main,
|
||||||
|
nav,
|
||||||
|
section,
|
||||||
|
table {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6,
|
||||||
|
p {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
body,
|
||||||
|
figure,
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
overflow-x: auto;
|
||||||
|
word-break: keep-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
textarea {
|
||||||
|
padding: 0;
|
||||||
|
font: inherit;
|
||||||
|
background: 0 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
textarea {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
input[type=button],
|
||||||
|
input[type=submit] {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:-webkit-autofill,
|
||||||
|
textarea:-webkit-autofill {
|
||||||
|
box-shadow: 0 0 0 50px var(--theme) inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
38
themes/PaperMod/assets/css/core/theme-vars.css
Normal file
38
themes/PaperMod/assets/css/core/theme-vars.css
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
:root {
|
||||||
|
--gap: 24px;
|
||||||
|
--content-gap: 20px;
|
||||||
|
--nav-width: 1024px;
|
||||||
|
--main-width: 720px;
|
||||||
|
--header-height: 60px;
|
||||||
|
--footer-height: 60px;
|
||||||
|
--radius: 8px;
|
||||||
|
--theme: rgb(255, 255, 255);
|
||||||
|
--entry: rgb(255, 255, 255);
|
||||||
|
--primary: rgb(30, 30, 30);
|
||||||
|
--secondary: rgb(108, 108, 108);
|
||||||
|
--tertiary: rgb(214, 214, 214);
|
||||||
|
--content: rgb(31, 31, 31);
|
||||||
|
--code-block-bg: rgb(28, 29, 33);
|
||||||
|
--code-bg: rgb(245, 245, 245);
|
||||||
|
--border: rgb(238, 238, 238);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--theme: rgb(29, 30, 32);
|
||||||
|
--entry: rgb(46, 46, 51);
|
||||||
|
--primary: rgb(218, 218, 219);
|
||||||
|
--secondary: rgb(155, 156, 157);
|
||||||
|
--tertiary: rgb(65, 66, 68);
|
||||||
|
--content: rgb(196, 196, 197);
|
||||||
|
--code-block-bg: rgb(46, 46, 51);
|
||||||
|
--code-bg: rgb(55, 56, 62);
|
||||||
|
--border: rgb(51, 51, 51);
|
||||||
|
}
|
||||||
|
|
||||||
|
.list {
|
||||||
|
background: var(--code-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark.list {
|
||||||
|
background: var(--theme);
|
||||||
|
}
|
||||||
55
themes/PaperMod/assets/css/core/zmedia.css
Normal file
55
themes/PaperMod/assets/css/core/zmedia.css
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
/* theme-vars */
|
||||||
|
:root {
|
||||||
|
--gap: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* profile-mode */
|
||||||
|
.profile img {
|
||||||
|
transform: scale(0.85);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* post-entry */
|
||||||
|
.first-entry {
|
||||||
|
min-height: 260px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* archive */
|
||||||
|
.archive-month {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive-year {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* footer */
|
||||||
|
.footer {
|
||||||
|
padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* footer */
|
||||||
|
@media screen and (max-width: 900px) {
|
||||||
|
.list .top-link {
|
||||||
|
transform: translateY(-5rem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 340px) {
|
||||||
|
.share-buttons {
|
||||||
|
justify-content: unset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion) {
|
||||||
|
/* terms; profile-mode; post-single; post-entry; post-entry; search; search */
|
||||||
|
.terms-tags a:active,
|
||||||
|
.button:active,
|
||||||
|
.post-entry:active,
|
||||||
|
.top-link,
|
||||||
|
#searchResults .focus,
|
||||||
|
#searchResults li:active {
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
5
themes/PaperMod/assets/css/extended/blank.css
Normal file
5
themes/PaperMod/assets/css/extended/blank.css
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
/*
|
||||||
|
This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles
|
||||||
|
|
||||||
|
Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info
|
||||||
|
*/
|
||||||
24
themes/PaperMod/assets/css/includes/chroma-mod.css
Normal file
24
themes/PaperMod/assets/css/includes/chroma-mod.css
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
.chroma {
|
||||||
|
background-color: unset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chroma .hl {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chroma .lnt {
|
||||||
|
padding: 0 0 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight pre.chroma code {
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight pre.chroma .line .cl,
|
||||||
|
.chroma .ln {
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chroma .lntd:last-of-type {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
86
themes/PaperMod/assets/css/includes/chroma-styles.css
Normal file
86
themes/PaperMod/assets/css/includes/chroma-styles.css
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/* Background */ .bg { color: #cad3f5; background-color: #24273a; }
|
||||||
|
/* PreWrapper */ .chroma { color: #cad3f5; background-color: #24273a; }
|
||||||
|
/* Other */ .chroma .x { }
|
||||||
|
/* Error */ .chroma .err { color: #ed8796 }
|
||||||
|
/* CodeLine */ .chroma .cl { }
|
||||||
|
/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit }
|
||||||
|
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
||||||
|
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
||||||
|
/* LineHighlight */ .chroma .hl { background-color: #474733 }
|
||||||
|
/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 }
|
||||||
|
/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 }
|
||||||
|
/* Line */ .chroma .line { display: flex; }
|
||||||
|
/* Keyword */ .chroma .k { color: #c6a0f6 }
|
||||||
|
/* KeywordConstant */ .chroma .kc { color: #f5a97f }
|
||||||
|
/* KeywordDeclaration */ .chroma .kd { color: #ed8796 }
|
||||||
|
/* KeywordNamespace */ .chroma .kn { color: #8bd5ca }
|
||||||
|
/* KeywordPseudo */ .chroma .kp { color: #c6a0f6 }
|
||||||
|
/* KeywordReserved */ .chroma .kr { color: #c6a0f6 }
|
||||||
|
/* KeywordType */ .chroma .kt { color: #ed8796 }
|
||||||
|
/* Name */ .chroma .n { }
|
||||||
|
/* NameAttribute */ .chroma .na { color: #8aadf4 }
|
||||||
|
/* NameBuiltin */ .chroma .nb { color: #91d7e3 }
|
||||||
|
/* NameBuiltinPseudo */ .chroma .bp { color: #91d7e3 }
|
||||||
|
/* NameClass */ .chroma .nc { color: #eed49f }
|
||||||
|
/* NameConstant */ .chroma .no { color: #eed49f }
|
||||||
|
/* NameDecorator */ .chroma .nd { color: #8aadf4; font-weight: bold }
|
||||||
|
/* NameEntity */ .chroma .ni { color: #8bd5ca }
|
||||||
|
/* NameException */ .chroma .ne { color: #f5a97f }
|
||||||
|
/* NameFunction */ .chroma .nf { color: #8aadf4 }
|
||||||
|
/* NameFunctionMagic */ .chroma .fm { color: #8aadf4 }
|
||||||
|
/* NameLabel */ .chroma .nl { color: #91d7e3 }
|
||||||
|
/* NameNamespace */ .chroma .nn { color: #f5a97f }
|
||||||
|
/* NameOther */ .chroma .nx { }
|
||||||
|
/* NameProperty */ .chroma .py { color: #f5a97f }
|
||||||
|
/* NameTag */ .chroma .nt { color: #c6a0f6 }
|
||||||
|
/* NameVariable */ .chroma .nv { color: #f4dbd6 }
|
||||||
|
/* NameVariableClass */ .chroma .vc { color: #f4dbd6 }
|
||||||
|
/* NameVariableGlobal */ .chroma .vg { color: #f4dbd6 }
|
||||||
|
/* NameVariableInstance */ .chroma .vi { color: #f4dbd6 }
|
||||||
|
/* NameVariableMagic */ .chroma .vm { color: #f4dbd6 }
|
||||||
|
/* Literal */ .chroma .l { }
|
||||||
|
/* LiteralDate */ .chroma .ld { }
|
||||||
|
/* LiteralString */ .chroma .s { color: #a6da95 }
|
||||||
|
/* LiteralStringAffix */ .chroma .sa { color: #ed8796 }
|
||||||
|
/* LiteralStringBacktick */ .chroma .sb { color: #a6da95 }
|
||||||
|
/* LiteralStringChar */ .chroma .sc { color: #a6da95 }
|
||||||
|
/* LiteralStringDelimiter */ .chroma .dl { color: #8aadf4 }
|
||||||
|
/* LiteralStringDoc */ .chroma .sd { color: #6e738d }
|
||||||
|
/* LiteralStringDouble */ .chroma .s2 { color: #a6da95 }
|
||||||
|
/* LiteralStringEscape */ .chroma .se { color: #8aadf4 }
|
||||||
|
/* LiteralStringHeredoc */ .chroma .sh { color: #6e738d }
|
||||||
|
/* LiteralStringInterpol */ .chroma .si { color: #a6da95 }
|
||||||
|
/* LiteralStringOther */ .chroma .sx { color: #a6da95 }
|
||||||
|
/* LiteralStringRegex */ .chroma .sr { color: #8bd5ca }
|
||||||
|
/* LiteralStringSingle */ .chroma .s1 { color: #a6da95 }
|
||||||
|
/* LiteralStringSymbol */ .chroma .ss { color: #a6da95 }
|
||||||
|
/* LiteralNumber */ .chroma .m { color: #f5a97f }
|
||||||
|
/* LiteralNumberBin */ .chroma .mb { color: #f5a97f }
|
||||||
|
/* LiteralNumberFloat */ .chroma .mf { color: #f5a97f }
|
||||||
|
/* LiteralNumberHex */ .chroma .mh { color: #f5a97f }
|
||||||
|
/* LiteralNumberInteger */ .chroma .mi { color: #f5a97f }
|
||||||
|
/* LiteralNumberIntegerLong */ .chroma .il { color: #f5a97f }
|
||||||
|
/* LiteralNumberOct */ .chroma .mo { color: #f5a97f }
|
||||||
|
/* Operator */ .chroma .o { color: #91d7e3; font-weight: bold }
|
||||||
|
/* OperatorWord */ .chroma .ow { color: #91d7e3; font-weight: bold }
|
||||||
|
/* Punctuation */ .chroma .p { }
|
||||||
|
/* Comment */ .chroma .c { color: #6e738d; font-style: italic }
|
||||||
|
/* CommentHashbang */ .chroma .ch { color: #6e738d; font-style: italic }
|
||||||
|
/* CommentMultiline */ .chroma .cm { color: #6e738d; font-style: italic }
|
||||||
|
/* CommentSingle */ .chroma .c1 { color: #6e738d; font-style: italic }
|
||||||
|
/* CommentSpecial */ .chroma .cs { color: #6e738d; font-style: italic }
|
||||||
|
/* CommentPreproc */ .chroma .cp { color: #6e738d; font-style: italic }
|
||||||
|
/* CommentPreprocFile */ .chroma .cpf { color: #6e738d; font-weight: bold; font-style: italic }
|
||||||
|
/* Generic */ .chroma .g { }
|
||||||
|
/* GenericDeleted */ .chroma .gd { color: #ed8796; background-color: #363a4f }
|
||||||
|
/* GenericEmph */ .chroma .ge { font-style: italic }
|
||||||
|
/* GenericError */ .chroma .gr { color: #ed8796 }
|
||||||
|
/* GenericHeading */ .chroma .gh { color: #f5a97f; font-weight: bold }
|
||||||
|
/* GenericInserted */ .chroma .gi { color: #a6da95; background-color: #363a4f }
|
||||||
|
/* GenericOutput */ .chroma .go { }
|
||||||
|
/* GenericPrompt */ .chroma .gp { }
|
||||||
|
/* GenericStrong */ .chroma .gs { font-weight: bold }
|
||||||
|
/* GenericSubheading */ .chroma .gu { color: #f5a97f; font-weight: bold }
|
||||||
|
/* GenericTraceback */ .chroma .gt { color: #ed8796 }
|
||||||
|
/* GenericUnderline */ .chroma .gl { text-decoration: underline }
|
||||||
|
/* TextWhitespace */ .chroma .w { }
|
||||||
63
themes/PaperMod/assets/css/includes/scroll-bar.css
Normal file
63
themes/PaperMod/assets/css/includes/scroll-bar.css
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/* from reset */
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list:not(.dark)::-webkit-scrollbar-track {
|
||||||
|
background: var(--code-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: var(--tertiary);
|
||||||
|
border: 5px solid var(--theme);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||||
|
border: 5px solid var(--code-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
|
||||||
|
background: var(--theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* from post-single */
|
||||||
|
.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content :not(table) ::-webkit-scrollbar-thumb {
|
||||||
|
border: 2px solid var(--code-block-bg);
|
||||||
|
background: rgb(113, 113, 117);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content :not(table) ::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: rgb(163, 163, 165);
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist table::-webkit-scrollbar-thumb {
|
||||||
|
border: 2px solid rgb(255, 255, 255);
|
||||||
|
background: rgb(173, 173, 173);
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist table::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: rgb(112, 112, 112);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-content table::-webkit-scrollbar-thumb {
|
||||||
|
border-width: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* from zmedia */
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
|
||||||
|
/* reset */
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 19px;
|
||||||
|
height: 11px;
|
||||||
|
}
|
||||||
|
}
|
||||||
152
themes/PaperMod/assets/js/fastsearch.js
Normal file
152
themes/PaperMod/assets/js/fastsearch.js
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
import * as params from '@params';
|
||||||
|
|
||||||
|
let fuse; // holds our search engine
|
||||||
|
let resList = document.getElementById('searchResults');
|
||||||
|
let sInput = document.getElementById('searchInput');
|
||||||
|
let first, last, current_elem = null
|
||||||
|
let resultsAvailable = false;
|
||||||
|
|
||||||
|
// load our search index
|
||||||
|
window.onload = function () {
|
||||||
|
let xhr = new XMLHttpRequest();
|
||||||
|
xhr.onreadystatechange = function () {
|
||||||
|
if (xhr.readyState === 4) {
|
||||||
|
if (xhr.status === 200) {
|
||||||
|
let data = JSON.parse(xhr.responseText);
|
||||||
|
if (data) {
|
||||||
|
// fuse.js options; check fuse.js website for details
|
||||||
|
let options = {
|
||||||
|
distance: 100,
|
||||||
|
threshold: 0.4,
|
||||||
|
ignoreLocation: true,
|
||||||
|
keys: [
|
||||||
|
'title',
|
||||||
|
'permalink',
|
||||||
|
'summary',
|
||||||
|
'content'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
if (params.fuseOpts) {
|
||||||
|
options = {
|
||||||
|
isCaseSensitive: params.fuseOpts.iscasesensitive ?? false,
|
||||||
|
includeScore: params.fuseOpts.includescore ?? false,
|
||||||
|
includeMatches: params.fuseOpts.includematches ?? false,
|
||||||
|
minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1,
|
||||||
|
shouldSort: params.fuseOpts.shouldsort ?? true,
|
||||||
|
findAllMatches: params.fuseOpts.findallmatches ?? false,
|
||||||
|
keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'],
|
||||||
|
location: params.fuseOpts.location ?? 0,
|
||||||
|
threshold: params.fuseOpts.threshold ?? 0.4,
|
||||||
|
distance: params.fuseOpts.distance ?? 100,
|
||||||
|
ignoreLocation: params.fuseOpts.ignorelocation ?? true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fuse = new Fuse(data, options); // build the index from the json file
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log(xhr.responseText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.open('GET', "../index.json");
|
||||||
|
xhr.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
function activeToggle(ae) {
|
||||||
|
document.querySelectorAll('.focus').forEach(function (element) {
|
||||||
|
// rm focus class
|
||||||
|
element.classList.remove("focus")
|
||||||
|
});
|
||||||
|
if (ae) {
|
||||||
|
ae.focus()
|
||||||
|
document.activeElement = current_elem = ae;
|
||||||
|
ae.parentElement.classList.add("focus")
|
||||||
|
} else {
|
||||||
|
document.activeElement.parentElement.classList.add("focus")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reset() {
|
||||||
|
resultsAvailable = false;
|
||||||
|
resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults
|
||||||
|
sInput.focus(); // shift focus to input box
|
||||||
|
}
|
||||||
|
|
||||||
|
// execute search as each character is typed
|
||||||
|
sInput.onkeyup = function (e) {
|
||||||
|
// run a search query (for "term") every time a letter is typed
|
||||||
|
// in the search box
|
||||||
|
if (fuse) {
|
||||||
|
let results;
|
||||||
|
if (params.fuseOpts) {
|
||||||
|
results = fuse.search(this.value.trim(), {limit: params.fuseOpts.limit}); // the actual query being run using fuse.js along with options
|
||||||
|
} else {
|
||||||
|
results = fuse.search(this.value.trim()); // the actual query being run using fuse.js
|
||||||
|
}
|
||||||
|
if (results.length !== 0) {
|
||||||
|
// build our html if result exists
|
||||||
|
let resultSet = ''; // our results bucket
|
||||||
|
|
||||||
|
for (let item in results) {
|
||||||
|
resultSet += `<li class="post-entry"><header class="entry-header">${results[item].item.title} »</header>` +
|
||||||
|
`<a href="${results[item].item.permalink}" aria-label="${results[item].item.title}"></a></li>`
|
||||||
|
}
|
||||||
|
|
||||||
|
resList.innerHTML = resultSet;
|
||||||
|
resultsAvailable = true;
|
||||||
|
first = resList.firstChild;
|
||||||
|
last = resList.lastChild;
|
||||||
|
} else {
|
||||||
|
resultsAvailable = false;
|
||||||
|
resList.innerHTML = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sInput.addEventListener('search', function (e) {
|
||||||
|
// clicked on x
|
||||||
|
if (!this.value) reset()
|
||||||
|
})
|
||||||
|
|
||||||
|
// kb bindings
|
||||||
|
document.onkeydown = function (e) {
|
||||||
|
let key = e.key;
|
||||||
|
let ae = document.activeElement;
|
||||||
|
|
||||||
|
let inbox = document.getElementById("searchbox").contains(ae)
|
||||||
|
|
||||||
|
if (ae === sInput) {
|
||||||
|
let elements = document.getElementsByClassName('focus');
|
||||||
|
while (elements.length > 0) {
|
||||||
|
elements[0].classList.remove('focus');
|
||||||
|
}
|
||||||
|
} else if (current_elem) ae = current_elem;
|
||||||
|
|
||||||
|
if (key === "Escape") {
|
||||||
|
reset()
|
||||||
|
} else if (!resultsAvailable || !inbox) {
|
||||||
|
return
|
||||||
|
} else if (key === "ArrowDown") {
|
||||||
|
e.preventDefault();
|
||||||
|
if (ae == sInput) {
|
||||||
|
// if the currently focused element is the search input, focus the <a> of first <li>
|
||||||
|
activeToggle(resList.firstChild.lastChild);
|
||||||
|
} else if (ae.parentElement != last) {
|
||||||
|
// if the currently focused element's parent is last, do nothing
|
||||||
|
// otherwise select the next search result
|
||||||
|
activeToggle(ae.parentElement.nextSibling.lastChild);
|
||||||
|
}
|
||||||
|
} else if (key === "ArrowUp") {
|
||||||
|
e.preventDefault();
|
||||||
|
if (ae.parentElement == first) {
|
||||||
|
// if the currently focused element is first item, go to input box
|
||||||
|
activeToggle(sInput);
|
||||||
|
} else if (ae != sInput) {
|
||||||
|
// if the currently focused element is input box, do nothing
|
||||||
|
// otherwise select the previous search result
|
||||||
|
activeToggle(ae.parentElement.previousSibling.lastChild);
|
||||||
|
}
|
||||||
|
} else if (key === "ArrowRight") {
|
||||||
|
ae.click(); // click on active link
|
||||||
|
}
|
||||||
|
}
|
||||||
9
themes/PaperMod/assets/js/fuse.basic.min.js
vendored
Normal file
9
themes/PaperMod/assets/js/fuse.basic.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
themes/PaperMod/assets/js/license.js
Normal file
6
themes/PaperMod/assets/js/license.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*
|
||||||
|
PaperMod v8+
|
||||||
|
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
||||||
|
Copyright (c) 2020 nanxiaobei and adityatelange
|
||||||
|
Copyright (c) 2021-2025 adityatelange
|
||||||
|
*/
|
||||||
3
themes/PaperMod/go.mod
Normal file
3
themes/PaperMod/go.mod
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module github.com/adityatelange/hugo-PaperMod
|
||||||
|
|
||||||
|
go 1.12
|
||||||
28
themes/PaperMod/i18n/ar.yaml
Normal file
28
themes/PaperMod/i18n/ar.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "السابق"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "التالي"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "دقيقة واحدة"
|
||||||
|
two: "دقيقتان"
|
||||||
|
few: "بضع ثوان"
|
||||||
|
zero: "الآن"
|
||||||
|
other: "دقائق {{ .Count }}"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "فهرس المحتوى"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "ترجمات أخرى"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "الصفحة الرئيسية"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "تم النسخ!"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "نسخ الكود"
|
||||||
39
themes/PaperMod/i18n/be.yaml
Normal file
39
themes/PaperMod/i18n/be.yaml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Папярэдняя"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Наступная"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
zero: "0 хвілін"
|
||||||
|
one: "1 хвіліна"
|
||||||
|
few: "{{ .Count }} хвіліны"
|
||||||
|
many: "{{ .Count }} хвілін"
|
||||||
|
other: "{{ .Count }} хвілін"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
zero: "няма слоў"
|
||||||
|
one: "1 слова"
|
||||||
|
few: "{{ .Count }} слова"
|
||||||
|
many: "{{ .Count }} слоў"
|
||||||
|
other: "{{ .Count }} слова"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Змест"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Пераклады"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Галоўная"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Рэдагаваць"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "капіяваць"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "скапіявана!"
|
||||||
16
themes/PaperMod/i18n/bg.yaml
Normal file
16
themes/PaperMod/i18n/bg.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Предишна страница"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Следваща страница"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 мин"
|
||||||
|
other: "{{ .Count }} мин"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Съдържание"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Преводи"
|
||||||
33
themes/PaperMod/i18n/bn.yaml
Normal file
33
themes/PaperMod/i18n/bn.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "পূর্ববর্তী"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "পরবর্তী"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "১ মিনিট"
|
||||||
|
other: "{{ .Count }} মিনিট"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "১ টি শব্দ"
|
||||||
|
other: "{{ .Count }} টি শব্দ"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "সূচিপত্র"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "অনুবাদসমূহ"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "হোম"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "সম্পাদনা করুন"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "কপি করুন"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "কপি হয়েছে!"
|
||||||
19
themes/PaperMod/i18n/ca.yaml
Normal file
19
themes/PaperMod/i18n/ca.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Pàgina anterior"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Pàgina següent"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Taula de Continguts"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traduccions"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Inici"
|
||||||
25
themes/PaperMod/i18n/ckb.yaml
Normal file
25
themes/PaperMod/i18n/ckb.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "پەڕەی پێشتر"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "پەڕەی دواتر"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 خولەک"
|
||||||
|
other: "{{ .Count }} خولەک"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "پێڕست"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "وەرگێڕانەکان"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "ماڵەوە"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "لەبەری بگرەوە"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "لەبەر گیرایەوە!"
|
||||||
33
themes/PaperMod/i18n/cs.yaml
Normal file
33
themes/PaperMod/i18n/cs.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Předchozí"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Další"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "slovo"
|
||||||
|
other: "{{ .Count }} slov"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Obsah"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Překlady"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Domů"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Upravit"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopírovat"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "zkopírováno!"
|
||||||
28
themes/PaperMod/i18n/da.yaml
Normal file
28
themes/PaperMod/i18n/da.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Forrige Side"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Næste Side"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Indholdsfortegnelse"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Oversættelser"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Start"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Rediger"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopier"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "kopieret!"
|
||||||
33
themes/PaperMod/i18n/de.yaml
Normal file
33
themes/PaperMod/i18n/de.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Vorherige"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Nächste"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 Minute"
|
||||||
|
other: "{{ .Count }} Minuten"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "Wort"
|
||||||
|
other: "{{ .Count }} Wörter"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Inhaltsverzeichnis"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Übersetzungen"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Home"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Bearbeiten"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Kopieren"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Kopiert!"
|
||||||
33
themes/PaperMod/i18n/el.yaml
Normal file
33
themes/PaperMod/i18n/el.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Προηγούμενο"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Επόμενο"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 λεπτό"
|
||||||
|
other: "{{ .Count }} λεπτά"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "λέξη"
|
||||||
|
other: "{{ .Count }} λέξεις"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Πίνακας Περιεχομένων"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Μεταφράσεις"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Αρχική"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Επεξεργασία"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "αντιγραφή"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "αντιγράφηκε!"
|
||||||
33
themes/PaperMod/i18n/en.yaml
Normal file
33
themes/PaperMod/i18n/en.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Prev"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Next"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "word"
|
||||||
|
other: "{{ .Count }} words"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Table of Contents"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Translations"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Home"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Edit"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "copy"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "copied!"
|
||||||
25
themes/PaperMod/i18n/eo.yaml
Normal file
25
themes/PaperMod/i18n/eo.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "antaŭa paĝo"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "sekva paĝo"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Enhavo"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "tradukoj"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "ĉefpaĝo"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopii"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "kopiite!"
|
||||||
33
themes/PaperMod/i18n/es.yaml
Normal file
33
themes/PaperMod/i18n/es.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Anterior"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Siguiente"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "palabra"
|
||||||
|
other: "{{ .Count }} palabras"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Tabla de Contenidos"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traducciones"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Inicio"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Editar"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "copiar"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "¡copiado!"
|
||||||
28
themes/PaperMod/i18n/fa.yaml
Normal file
28
themes/PaperMod/i18n/fa.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "صفحه قبلی"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "صفحه بعدی"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "۱ دقیقه"
|
||||||
|
other: "{{ .Count }} دقیقه"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "فهرست مطالب"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "ترجمه ها"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "خانه"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "ویرایش"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "کپی"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "کپی شد!"
|
||||||
33
themes/PaperMod/i18n/fi.yaml
Normal file
33
themes/PaperMod/i18n/fi.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Edellinen"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Seuraava"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} minuuttia"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "sana"
|
||||||
|
other: "{{ .Count }} sanaa"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Sisällysluettelo"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Käännökset"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Etusivu"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Muokkaa"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Kopioi"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Kopioitu!"
|
||||||
33
themes/PaperMod/i18n/fr.yaml
Normal file
33
themes/PaperMod/i18n/fr.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Précédent"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Suivant"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "mot"
|
||||||
|
other: "{{ .Count }} mots"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Table des matières"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traductions"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Accueil"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Modifier"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Copier"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Copié !"
|
||||||
33
themes/PaperMod/i18n/he.yaml
Normal file
33
themes/PaperMod/i18n/he.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "הקודם"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "הבא"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "דקה אחת"
|
||||||
|
other: "{{ .Count }} דקות"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "מילה אחת"
|
||||||
|
other: "{{ .Count }} מילים"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "תוכן עניינים"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "תרגומים"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "בית"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "ערוך"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "העתק"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "הועתק!"
|
||||||
19
themes/PaperMod/i18n/hi.yaml
Normal file
19
themes/PaperMod/i18n/hi.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "पिछला"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "अगला"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "एक मिनट"
|
||||||
|
other: "{{ .Count }} मिनट"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "सुधारें"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "विषय - सूची"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "अनुवाद"
|
||||||
33
themes/PaperMod/i18n/hr.yaml
Normal file
33
themes/PaperMod/i18n/hr.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Prethodna stranica"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Sljedeća stranica"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 minuta"
|
||||||
|
other: "{{ .Count }} minute"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "riječ"
|
||||||
|
other: "{{ .Count }} riječi"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Tablica Sadržaja"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Prijevodi"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Početna stranica"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Promjeni"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopiraj"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "kopirano!"
|
||||||
16
themes/PaperMod/i18n/hu.yaml
Normal file
16
themes/PaperMod/i18n/hu.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Előző oldal"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Következő oldal"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 perc"
|
||||||
|
other: "{{ .Count }} perc"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Tartalomjegyzék"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Fordítások"
|
||||||
33
themes/PaperMod/i18n/id.yaml
Normal file
33
themes/PaperMod/i18n/id.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Sebelumnya"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Selanjutnya"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 menit"
|
||||||
|
other: "{{ .Count }} menit"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "kata"
|
||||||
|
other: "{{ .Count }} kata"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Daftar isi"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Terjemahan"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Beranda"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Sunting"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "salin"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "disalin!"
|
||||||
33
themes/PaperMod/i18n/it.yaml
Normal file
33
themes/PaperMod/i18n/it.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Precedente"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Successivo"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 minuto"
|
||||||
|
other: "{{ .Count }} minuti"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "parola"
|
||||||
|
other: "{{ .Count }} parole"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Indice contenuti"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traduzioni"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Home"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Modifica"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "copia"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "copiato!"
|
||||||
33
themes/PaperMod/i18n/ja.yaml
Normal file
33
themes/PaperMod/i18n/ja.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "前へ"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "次へ"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 分"
|
||||||
|
other: "{{ .Count }} 分"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "文字"
|
||||||
|
other: "{{ .Count }} 文字"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "目次"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "言語"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "ホーム"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "編集"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "コピー"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "コピーされました!"
|
||||||
33
themes/PaperMod/i18n/ko.yaml
Normal file
33
themes/PaperMod/i18n/ko.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "이전 페이지"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "다음 페이지"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 분"
|
||||||
|
other: "{{ .Count }} 분"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "단어"
|
||||||
|
other: "{{ .Count }} 단어"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "목차"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "번역"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "홈"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "편집"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "복사"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "복사 완료!"
|
||||||
25
themes/PaperMod/i18n/ku.yaml
Normal file
25
themes/PaperMod/i18n/ku.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Rûpela Paş"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Rûpela Pêş"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 xulek"
|
||||||
|
other: "{{ .Count }} xulek"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Pêrist"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Wergeran"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Xanî"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Jê bigire"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Hat jêgirtin!"
|
||||||
25
themes/PaperMod/i18n/mn.yaml
Normal file
25
themes/PaperMod/i18n/mn.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Ѳмнѳх"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Дараах"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 МИН"
|
||||||
|
other: "{{ .Count }} МИН"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Агуулга"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Орчуулга"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Нүүр"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "хуулах"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "хуулсан!"
|
||||||
28
themes/PaperMod/i18n/ms.yaml
Normal file
28
themes/PaperMod/i18n/ms.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Halaman Sebelumnya"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Halaman Seterusnya"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 minit"
|
||||||
|
other: "{{ .Count }} minit"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Isi Kandungan"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Terjemahan"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Home"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Sunting"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Salin"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Disalin!"
|
||||||
33
themes/PaperMod/i18n/nl.yaml
Normal file
33
themes/PaperMod/i18n/nl.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Vorige"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Volgende"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "woord"
|
||||||
|
other: "{{ .Count }} woorden"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Inhoudsopgave"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Vertalingen"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Startpagina"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Bewerk"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopieer"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "gekopieerd!"
|
||||||
33
themes/PaperMod/i18n/no.yaml
Normal file
33
themes/PaperMod/i18n/no.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Forrige Side"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Neste Side"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "ord"
|
||||||
|
other: "{{ .Count }} ord"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Innholdsfortegnelse"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Oversettelser"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Hjem"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Rediger"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Kopier"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Kopiert!"
|
||||||
33
themes/PaperMod/i18n/oc.yaml
Normal file
33
themes/PaperMod/i18n/oc.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Prec."
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Seg."
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "mot"
|
||||||
|
other: "{{ .Count }} motss"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Taula de contengut"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traduccions"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Acuèlh"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Modificar"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "copiar"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "copiat !"
|
||||||
33
themes/PaperMod/i18n/pa.yaml
Normal file
33
themes/PaperMod/i18n/pa.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "ਪਿਛਲਾ"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "ਅਗਲਾ"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 ਮਿੰਟ"
|
||||||
|
other: "{{ .Count }} ਮਿੰਟ"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "ਸ਼ਬਦ"
|
||||||
|
other: "{{ .Count }} ਸ਼ਬਦ"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "ਤਤਕਰਾ"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "ਅਨੁਵਾਦ"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "ਘਰ"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "ਸੋਧ"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "ਕਾਪੀ"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "ਕਾਪੀ ਕੀਤੀ ਗਈ!!"
|
||||||
33
themes/PaperMod/i18n/pl.yaml
Normal file
33
themes/PaperMod/i18n/pl.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Poprzednia"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Następna"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "słowo"
|
||||||
|
other: "{{ .Count }} słów"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Spis treści"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Tłumaczenia"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Strona Główna"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Edytuj"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Kopiuj"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Skopiowano!"
|
||||||
33
themes/PaperMod/i18n/pnb.yaml
Normal file
33
themes/PaperMod/i18n/pnb.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "پِچھلا"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "اگلا"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "ایک منٹ"
|
||||||
|
other: "مِنٹ {{ .Count }}"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "لفظ"
|
||||||
|
other: "لفظ {{ .Count }}"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "تتکرا"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "انوواد"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "گھر"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "سودھ"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "کاپی"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "کاپی کیتی گئی!"
|
||||||
33
themes/PaperMod/i18n/pt.yaml
Normal file
33
themes/PaperMod/i18n/pt.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Página Anterior"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Próxima Página"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 minuto"
|
||||||
|
other: "{{ .Count }} minutos"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "palavra"
|
||||||
|
other: "{{ .Count }} palavras"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Conteúdo"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traduções"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Início"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Editar"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "copiar"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "copiado!"
|
||||||
33
themes/PaperMod/i18n/ro.yaml
Normal file
33
themes/PaperMod/i18n/ro.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Înapoi"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Înainte"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 minut"
|
||||||
|
other: "{{ .Count }} minute"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "cuvânt"
|
||||||
|
other: "{{ .Count }} cuvinte"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Sumar"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Traduceri"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Acasă"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Editează"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "copiază"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "copiat!"
|
||||||
39
themes/PaperMod/i18n/ru.yaml
Normal file
39
themes/PaperMod/i18n/ru.yaml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Предыдущая"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Следующая"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
zero: "0 минут"
|
||||||
|
one: "1 минута"
|
||||||
|
few: "{{ .Count }} минуты"
|
||||||
|
many: "{{ .Count }} минут"
|
||||||
|
other: "{{ .Count }} минута"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
zero: "0 слов"
|
||||||
|
one: "1 слово"
|
||||||
|
few: "{{ .Count }} слова"
|
||||||
|
many: "{{ .Count }} слов"
|
||||||
|
other: "{{ .Count }} слово"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Оглавление"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Переводы"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Главная"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Редактировать"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "копировать"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "скопировано!"
|
||||||
33
themes/PaperMod/i18n/sk.yaml
Normal file
33
themes/PaperMod/i18n/sk.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Predch"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Ďaľší"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "slovo"
|
||||||
|
other: "{{ .Count }} slov"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Obsah"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Preklady"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Domov"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Upraviť"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopírovať"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "skopírované!"
|
||||||
28
themes/PaperMod/i18n/sv.yaml
Normal file
28
themes/PaperMod/i18n/sv.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Förra Sidan"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Nästa Sida"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 min"
|
||||||
|
other: "{{ .Count }} min"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Innehållsförteckning"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Översättningar"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Hem"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Redigera"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "kopiera"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "kopierad!"
|
||||||
33
themes/PaperMod/i18n/sw.yaml
Normal file
33
themes/PaperMod/i18n/sw.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Uliopita"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Ujao"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "dakika 1"
|
||||||
|
other: "dakika {{ .Count }}"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "neno"
|
||||||
|
other: "maneno {{ .Count }}"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Jedwali la Yaliyomo"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Tafsiri"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Mwanzo"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Hariri"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "nakili"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "nakiliwa!"
|
||||||
33
themes/PaperMod/i18n/th.yaml
Normal file
33
themes/PaperMod/i18n/th.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "ก่อนหน้า"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "ถัดไป"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 นาที"
|
||||||
|
other: "{{ .Count }} นาที"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "คำ"
|
||||||
|
other: "{{ .Count }} คำ"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "สารบัญ"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "การแปล"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "หน้าหลัก"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "แก้ไข"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "คัดลอก"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "คัดลอกแล้ว!"
|
||||||
33
themes/PaperMod/i18n/tr.yaml
Normal file
33
themes/PaperMod/i18n/tr.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Önceki"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Sonraki"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 dk"
|
||||||
|
other: "{{ .Count }} dk"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one : "sözcük"
|
||||||
|
other: "{{ .Count }} sözcük"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "İçindekiler"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Çeviriler"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Ana Sayfa"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Düzenle"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Kopyala"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Kopyalandı!"
|
||||||
25
themes/PaperMod/i18n/uk.yaml
Normal file
25
themes/PaperMod/i18n/uk.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Попередня"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Наступна"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 хвилина"
|
||||||
|
other: "{{ .Count }} хвилин"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Зміст"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Переклади"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Головна"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "копіювати"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "скопійовано!"
|
||||||
20
themes/PaperMod/i18n/uz.yaml
Normal file
20
themes/PaperMod/i18n/uz.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Oldingi sahifa"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Keyingi sahifa"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "Bir daqiqa"
|
||||||
|
other: "{{ .Count }} daqiqa"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Mundarija"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Tarjimalar"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Bosh sahifa"
|
||||||
|
|
||||||
33
themes/PaperMod/i18n/vi.yaml
Normal file
33
themes/PaperMod/i18n/vi.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "Trang trước"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "Trang tiếp theo"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one: "1 phút"
|
||||||
|
other: "{{ .Count }} phút"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "từ"
|
||||||
|
other: "{{ .Count }} từ"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "Mục lục"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "Bản dịch"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "Trang chủ"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "Chỉnh sửa"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "Sao chép"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "Đã sao chép!"
|
||||||
33
themes/PaperMod/i18n/zh-tw.yaml
Normal file
33
themes/PaperMod/i18n/zh-tw.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "上一頁"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "下一頁"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 分鐘"
|
||||||
|
other: "{{ .Count }} 分鐘"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "字"
|
||||||
|
other: "{{ .Count }} 字"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "目錄"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "語言"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "首頁"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "編輯"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "複製"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "已複製!"
|
||||||
33
themes/PaperMod/i18n/zh.yaml
Normal file
33
themes/PaperMod/i18n/zh.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
- id: prev_page
|
||||||
|
translation: "上一页"
|
||||||
|
|
||||||
|
- id: next_page
|
||||||
|
translation: "下一页"
|
||||||
|
|
||||||
|
- id: read_time
|
||||||
|
translation:
|
||||||
|
one : "1 分钟"
|
||||||
|
other: "{{ .Count }} 分钟"
|
||||||
|
|
||||||
|
- id: words
|
||||||
|
translation:
|
||||||
|
one: "字"
|
||||||
|
other: "{{ .Count }} 字"
|
||||||
|
|
||||||
|
- id: toc
|
||||||
|
translation: "目录"
|
||||||
|
|
||||||
|
- id: translations
|
||||||
|
translation: "语言"
|
||||||
|
|
||||||
|
- id: home
|
||||||
|
translation: "主页"
|
||||||
|
|
||||||
|
- id: edit_post
|
||||||
|
translation: "编辑"
|
||||||
|
|
||||||
|
- id: code_copy
|
||||||
|
translation: "复制"
|
||||||
|
|
||||||
|
- id: code_copied
|
||||||
|
translation: "已复制!"
|
||||||
BIN
themes/PaperMod/images/screenshot.png
Normal file
BIN
themes/PaperMod/images/screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
BIN
themes/PaperMod/images/tn.png
Normal file
BIN
themes/PaperMod/images/tn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
3
themes/PaperMod/layouts/404.html
Normal file
3
themes/PaperMod/layouts/404.html
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{{- define "main" }}
|
||||||
|
<div class="not-found">404</div>
|
||||||
|
{{- end }}{{/* end main */ -}}
|
||||||
22
themes/PaperMod/layouts/_default/_markup/render-image.html
Normal file
22
themes/PaperMod/layouts/_default/_markup/render-image.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{{- $u := urls.Parse .Destination -}}
|
||||||
|
{{- $src := $u.String -}}
|
||||||
|
{{- if not $u.IsAbs -}}
|
||||||
|
{{- $path := strings.TrimPrefix "./" $u.Path }}
|
||||||
|
{{- with or (.PageInner.Resources.Get $path) (resources.Get $path) -}}
|
||||||
|
{{- $src = .RelPermalink -}}
|
||||||
|
{{- with $u.RawQuery -}}
|
||||||
|
{{- $src = printf "%s?%s" $src . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- with $u.Fragment -}}
|
||||||
|
{{- $src = printf "%s#%s" $src . -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $attributes := merge .Attributes (dict "alt" .Text "src" $src "title" (.Title | transform.HTMLEscape) "loading" "lazy") -}}
|
||||||
|
<img
|
||||||
|
{{- range $k, $v := $attributes -}}
|
||||||
|
{{- if $v -}}
|
||||||
|
{{- printf " %s=%q" $k $v | safeHTMLAttr -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}>
|
||||||
|
{{- /**/ -}}
|
||||||
83
themes/PaperMod/layouts/_default/archives.html
Normal file
83
themes/PaperMod/layouts/_default/archives.html
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{{- define "main" }}
|
||||||
|
|
||||||
|
<header class="page-header">
|
||||||
|
<h1>
|
||||||
|
{{ .Title }}
|
||||||
|
{{- if (.Param "ShowRssButtonInSectionTermList") }}
|
||||||
|
{{- $rss := (.OutputFormats.Get "rss") }}
|
||||||
|
{{- if (eq .Kind `page`) }}
|
||||||
|
{{- $rss = (.Parent.OutputFormats.Get "rss") }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with $rss }}
|
||||||
|
<a href="{{ .RelPermalink }}" title="RSS" aria-label="RSS">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round" height="23">
|
||||||
|
<path d="M4 11a9 9 0 0 1 9 9" />
|
||||||
|
<path d="M4 4a16 16 0 0 1 16 16" />
|
||||||
|
<circle cx="5" cy="19" r="1" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</h1>
|
||||||
|
{{- if .Description }}
|
||||||
|
<div class="post-description">
|
||||||
|
{{ .Description }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
|
||||||
|
|
||||||
|
{{- if site.Params.ShowAllPagesInArchive }}
|
||||||
|
{{- $pages = site.RegularPages }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- range $pages.GroupByPublishDate "2006" }}
|
||||||
|
{{- if ne .Key "0001" }}
|
||||||
|
<div class="archive-year">
|
||||||
|
{{- $year := replace .Key "0001" "" }}
|
||||||
|
<h2 class="archive-year-header" id="{{ $year }}">
|
||||||
|
<a class="archive-header-link" href="#{{ $year }}">
|
||||||
|
{{- $year -}}
|
||||||
|
</a>
|
||||||
|
<sup class="archive-count"> {{ len .Pages }}</sup>
|
||||||
|
</h2>
|
||||||
|
{{- range .Pages.GroupByDate "January" }}
|
||||||
|
<div class="archive-month">
|
||||||
|
<h3 class="archive-month-header" id="{{ $year }}-{{ .Key }}">
|
||||||
|
<a class="archive-header-link" href="#{{ $year }}-{{ .Key }}">
|
||||||
|
{{- .Key -}}
|
||||||
|
</a>
|
||||||
|
<sup class="archive-count"> {{ len .Pages }}</sup>
|
||||||
|
</h3>
|
||||||
|
<div class="archive-posts">
|
||||||
|
{{- range .Pages }}
|
||||||
|
{{- if eq .Kind "page" }}
|
||||||
|
<div class="archive-entry">
|
||||||
|
<h3 class="archive-entry-title entry-hint-parent">
|
||||||
|
{{- .Title | markdownify }}
|
||||||
|
{{- if .Draft }}
|
||||||
|
<span class="entry-hint" title="Draft">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="15" viewBox="0 -960 960 960" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
{{- end }}
|
||||||
|
</h3>
|
||||||
|
<div class="archive-meta">
|
||||||
|
{{- partial "post_meta.html" . -}}
|
||||||
|
</div>
|
||||||
|
<a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- end }}{{/* end main */}}
|
||||||
27
themes/PaperMod/layouts/_default/baseof.html
Normal file
27
themes/PaperMod/layouts/_default/baseof.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{{- if lt hugo.Version "0.146.0" }}
|
||||||
|
{{- errorf "=> hugo v0.146.0 or greater is required for hugo-PaperMod to build " }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
{{- partial "head.html" . }}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="
|
||||||
|
{{- if (or (ne .Kind `page` ) (eq .Layout `archives`) (eq .Layout `search`)) -}}
|
||||||
|
{{- print "list" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if eq site.Params.defaultTheme `dark` -}}
|
||||||
|
{{- print " dark" }}
|
||||||
|
{{- end -}}
|
||||||
|
" id="top">
|
||||||
|
{{- partialCached "header.html" . .Page -}}
|
||||||
|
<main class="main">
|
||||||
|
{{- block "main" . }}{{ end }}
|
||||||
|
</main>
|
||||||
|
{{ partialCached "footer.html" . .Layout .Kind (.Param "hideFooter") (.Param "ShowCodeCopyButtons") -}}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
7
themes/PaperMod/layouts/_default/index.json
Normal file
7
themes/PaperMod/layouts/_default/index.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{{- $.Scratch.Add "index" slice -}}
|
||||||
|
{{- range site.RegularPages -}}
|
||||||
|
{{- if and (not .Params.searchHidden) (ne .Layout `archives`) (ne .Layout `search`) }}
|
||||||
|
{{- $.Scratch.Add "index" (dict "title" .Title "content" .Plain "permalink" .Permalink "summary" .Summary) -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $.Scratch.Get "index" | jsonify -}}
|
||||||
121
themes/PaperMod/layouts/_default/list.html
Normal file
121
themes/PaperMod/layouts/_default/list.html
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
{{- define "main" }}
|
||||||
|
|
||||||
|
{{- if (and site.Params.profileMode.enabled .IsHome) }}
|
||||||
|
{{- partial "index_profile.html" . }}
|
||||||
|
{{- else }} {{/* if not profileMode */}}
|
||||||
|
|
||||||
|
{{- if not .IsHome | and .Title }}
|
||||||
|
<header class="page-header">
|
||||||
|
{{- partial "breadcrumbs.html" . }}
|
||||||
|
<h1>
|
||||||
|
{{ .Title }}
|
||||||
|
{{- if and (or (eq .Kind `term`) (eq .Kind `section`)) (.Param "ShowRssButtonInSectionTermList") }}
|
||||||
|
{{- with .OutputFormats.Get "rss" }}
|
||||||
|
<a href="{{ .RelPermalink }}" title="RSS" aria-label="RSS">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round" height="23">
|
||||||
|
<path d="M4 11a9 9 0 0 1 9 9" />
|
||||||
|
<path d="M4 4a16 16 0 0 1 16 16" />
|
||||||
|
<circle cx="5" cy="19" r="1" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</h1>
|
||||||
|
{{- if .Description }}
|
||||||
|
<div class="post-description">
|
||||||
|
{{ .Description | markdownify }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</header>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Content }}
|
||||||
|
<div class="post-content">
|
||||||
|
{{- if not (.Param "disableAnchoredHeadings") }}
|
||||||
|
{{- partial "anchored_headings.html" .Content -}}
|
||||||
|
{{- else }}{{ .Content }}{{ end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- $pages := union .RegularPages .Sections }}
|
||||||
|
|
||||||
|
{{- if .IsHome }}
|
||||||
|
{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
|
||||||
|
{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- $paginator := .Paginate $pages }}
|
||||||
|
|
||||||
|
{{- if and .IsHome site.Params.homeInfoParams (eq $paginator.PageNumber 1) }}
|
||||||
|
{{- partial "home_info.html" . }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- $term := .Data.Term }}
|
||||||
|
{{- range $index, $page := $paginator.Pages }}
|
||||||
|
|
||||||
|
{{- $class := "post-entry" }}
|
||||||
|
|
||||||
|
{{- $user_preferred := or site.Params.disableSpecial1stPost site.Params.homeInfoParams }}
|
||||||
|
{{- if (and $.IsHome (eq $paginator.PageNumber 1) (eq $index 0) (not $user_preferred)) }}
|
||||||
|
{{- $class = "first-entry" }}
|
||||||
|
{{- else if $term }}
|
||||||
|
{{- $class = "post-entry tag-entry" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
<article class="{{ $class }}">
|
||||||
|
{{- $isHidden := (.Param "cover.hiddenInList") | default (.Param "cover.hidden") | default false }}
|
||||||
|
{{- partial "cover.html" (dict "cxt" . "IsSingle" false "isHidden" $isHidden) }}
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">
|
||||||
|
{{- .Title }}
|
||||||
|
{{- if .Draft }}
|
||||||
|
<span class="entry-hint" title="Draft">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
{{- end }}
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
{{- if (ne (.Param "hideSummary") true) }}
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}</p>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- if not (.Param "hideMeta") }}
|
||||||
|
<footer class="entry-footer">
|
||||||
|
{{- partial "post_meta.html" . -}}
|
||||||
|
</footer>
|
||||||
|
{{- end }}
|
||||||
|
<a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
|
||||||
|
</article>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if gt $paginator.TotalPages 1 }}
|
||||||
|
<footer class="page-footer">
|
||||||
|
<nav class="pagination">
|
||||||
|
{{- if $paginator.HasPrev }}
|
||||||
|
<a class="prev" href="{{ $paginator.Prev.URL | absURL }}">
|
||||||
|
« {{ i18n "prev_page" }}
|
||||||
|
{{- if (.Param "ShowPageNums") }}
|
||||||
|
{{- sub $paginator.PageNumber 1 }}/{{ $paginator.TotalPages }}
|
||||||
|
{{- end }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- if $paginator.HasNext }}
|
||||||
|
<a class="next" href="{{ $paginator.Next.URL | absURL }}">
|
||||||
|
{{- i18n "next_page" }}
|
||||||
|
{{- if (.Param "ShowPageNums") }}
|
||||||
|
{{- add 1 $paginator.PageNumber }}/{{ $paginator.TotalPages }}
|
||||||
|
{{- end }} »
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
</nav>
|
||||||
|
</footer>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- end }}{{/* end profileMode */}}
|
||||||
|
|
||||||
|
{{- end }}{{- /* end main */ -}}
|
||||||
83
themes/PaperMod/layouts/_default/rss.xml
Normal file
83
themes/PaperMod/layouts/_default/rss.xml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}}
|
||||||
|
{{- $authorEmail := "" }}
|
||||||
|
{{- with site.Params.author }}
|
||||||
|
{{- if reflect.IsMap . }}
|
||||||
|
{{- with .email }}
|
||||||
|
{{- $authorEmail = . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{- with site.Author.email }}
|
||||||
|
{{- $authorEmail = . }}
|
||||||
|
{{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}}
|
||||||
|
{{- $authorName := "" }}
|
||||||
|
{{- with site.Params.author }}
|
||||||
|
{{- if reflect.IsMap . }}
|
||||||
|
{{- with .name }}
|
||||||
|
{{- $authorName = . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $authorName = . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{- with site.Author.name }}
|
||||||
|
{{- $authorName = . }}
|
||||||
|
{{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- $pctx := . }}
|
||||||
|
{{- if .IsHome }}{{ $pctx = site }}{{ end }}
|
||||||
|
{{- $pages := slice }}
|
||||||
|
{{- if or $.IsHome $.IsSection }}
|
||||||
|
{{- $pages = $pctx.RegularPages }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $pages = $pctx.Pages }}
|
||||||
|
{{- end }}
|
||||||
|
{{- $limit := site.Config.Services.RSS.Limit }}
|
||||||
|
{{- if ge $limit 1 }}
|
||||||
|
{{- $pages = $pages | first $limit }}
|
||||||
|
{{- end }}
|
||||||
|
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||||
|
<channel>
|
||||||
|
<title>{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }}</title>
|
||||||
|
<link>{{ .Permalink }}</link>
|
||||||
|
<description>Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }}</description>
|
||||||
|
{{- with site.Params.images }}
|
||||||
|
<image>
|
||||||
|
<title>{{ site.Title }}</title>
|
||||||
|
<url>{{ index . 0 | absURL }}</url>
|
||||||
|
<link>{{ index . 0 | absURL }}</link>
|
||||||
|
</image>
|
||||||
|
{{- end }}
|
||||||
|
<generator>Hugo -- {{ hugo.Version }}</generator>
|
||||||
|
<language>{{ "en" }}</language>{{ with $authorEmail }}
|
||||||
|
<managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
|
||||||
|
<webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with site.Copyright }}
|
||||||
|
<copyright>{{ . | markdownify | plainify | strings.TrimPrefix "© " }}</copyright>{{ end }}{{ if not .Date.IsZero }}
|
||||||
|
<lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
|
||||||
|
{{- with .OutputFormats.Get "RSS" }}
|
||||||
|
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $pages }}
|
||||||
|
{{- if and (ne .Layout `search`) (ne .Layout `archives`) }}
|
||||||
|
<item>
|
||||||
|
<title>{{ .Title }}</title>
|
||||||
|
<link>{{ .Permalink }}</link>
|
||||||
|
<pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
|
||||||
|
{{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
|
||||||
|
<guid>{{ .Permalink }}</guid>
|
||||||
|
<description>{{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}}</description>
|
||||||
|
{{- if and site.Params.ShowFullTextinRSS .Content }}
|
||||||
|
<content:encoded>{{ (printf "<![CDATA[%s]]>" .Content) | safeHTML }}</content:encoded>
|
||||||
|
{{- end }}
|
||||||
|
</item>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
29
themes/PaperMod/layouts/_default/search.html
Normal file
29
themes/PaperMod/layouts/_default/search.html
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{{- define "main" }}
|
||||||
|
|
||||||
|
<header class="page-header">
|
||||||
|
<h1>{{- (printf "%s " .Title ) | htmlUnescape -}}
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none"
|
||||||
|
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<circle cx="11" cy="11" r="8"></circle>
|
||||||
|
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
||||||
|
</svg>
|
||||||
|
</h1>
|
||||||
|
{{- if .Description }}
|
||||||
|
<div class="post-description">
|
||||||
|
{{ .Description }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- if not (.Param "hideMeta") }}
|
||||||
|
<div class="post-meta">
|
||||||
|
{{- partial "translation_list.html" . -}}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div id="searchbox">
|
||||||
|
<input id="searchInput" autofocus placeholder="{{ .Params.placeholder | default (printf "%s ↵" .Title) }}"
|
||||||
|
aria-label="search" type="search" autocomplete="off" maxlength="64">
|
||||||
|
<ul id="searchResults" aria-label="search results"></ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{- end }}{{/* end main */}}
|
||||||
65
themes/PaperMod/layouts/_default/single.html
Normal file
65
themes/PaperMod/layouts/_default/single.html
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{{- define "main" }}
|
||||||
|
|
||||||
|
<article class="post-single">
|
||||||
|
<header class="post-header">
|
||||||
|
{{ partial "breadcrumbs.html" . }}
|
||||||
|
<h1 class="post-title entry-hint-parent">
|
||||||
|
{{ .Title }}
|
||||||
|
{{- if .Draft }}
|
||||||
|
<span class="entry-hint" title="Draft">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="35" viewBox="0 -960 960 960" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
{{- end }}
|
||||||
|
</h1>
|
||||||
|
{{- if .Description }}
|
||||||
|
<div class="post-description">
|
||||||
|
{{ .Description }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- if not (.Param "hideMeta") }}
|
||||||
|
<div class="post-meta">
|
||||||
|
{{- partial "post_meta.html" . -}}
|
||||||
|
{{- partial "translation_list.html" . -}}
|
||||||
|
{{- partial "edit_post.html" . -}}
|
||||||
|
{{- partial "post_canonical.html" . -}}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</header>
|
||||||
|
{{- $isHidden := (.Param "cover.hiddenInSingle") | default (.Param "cover.hidden") | default false }}
|
||||||
|
{{- partial "cover.html" (dict "cxt" . "IsSingle" true "isHidden" $isHidden) }}
|
||||||
|
{{- if (.Param "ShowToc") }}
|
||||||
|
{{- partial "toc.html" . }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Content }}
|
||||||
|
<div class="post-content">
|
||||||
|
{{- if not (.Param "disableAnchoredHeadings") }}
|
||||||
|
{{- partial "anchored_headings.html" .Content -}}
|
||||||
|
{{- else }}{{ .Content }}{{ end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
<footer class="post-footer">
|
||||||
|
{{- $tags := .Language.Params.Taxonomies.tag | default "tags" }}
|
||||||
|
<ul class="post-tags">
|
||||||
|
{{- range ($.GetTerms $tags) }}
|
||||||
|
<li><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
{{- if (.Param "ShowPostNavLinks") }}
|
||||||
|
{{- partial "post_nav_links.html" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (and site.Params.ShowShareButtons (ne .Params.disableShare true)) }}
|
||||||
|
{{- partial "share_icons.html" . -}}
|
||||||
|
{{- end }}
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
{{- if (.Param "comments") }}
|
||||||
|
{{- partial "comments.html" . }}
|
||||||
|
{{- end }}
|
||||||
|
</article>
|
||||||
|
|
||||||
|
{{- end }}{{/* end main */}}
|
||||||
27
themes/PaperMod/layouts/_default/terms.html
Normal file
27
themes/PaperMod/layouts/_default/terms.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{{- define "main" }}
|
||||||
|
|
||||||
|
{{- if .Title }}
|
||||||
|
<header class="page-header">
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
{{- if .Description }}
|
||||||
|
<div class="post-description">
|
||||||
|
{{ .Description }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</header>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
<ul class="terms-tags">
|
||||||
|
{{- $type := .Type }}
|
||||||
|
{{- range $key, $value := .Data.Terms.Alphabetical }}
|
||||||
|
{{- $name := .Name }}
|
||||||
|
{{- $count := .Count }}
|
||||||
|
{{- with site.GetPage (printf "/%s/%s" $type $name) }}
|
||||||
|
<li>
|
||||||
|
<a href="{{ .Permalink }}">{{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{{- end }}{{/* end main */ -}}
|
||||||
2
themes/PaperMod/layouts/partials/anchored_headings.html
Normal file
2
themes/PaperMod/layouts/partials/anchored_headings.html
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
{{- /* formats .Content headings by adding an anchor */ -}}
|
||||||
|
{{ . | replaceRE "(<h[1-6] id=\"([^\"]+)\".+)(</h[1-6]+>)" "${1}<a hidden class=\"anchor\" aria-hidden=\"true\" href=\"#${2}\">#</a>${3}" | safeHTML }}
|
||||||
9
themes/PaperMod/layouts/partials/author.html
Normal file
9
themes/PaperMod/layouts/partials/author.html
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{{- if or .Params.author site.Params.author }}
|
||||||
|
{{- $author := (.Params.author | default site.Params.author) }}
|
||||||
|
{{- $author_type := (printf "%T" $author) }}
|
||||||
|
{{- if (or (eq $author_type "[]string") (eq $author_type "[]interface {}")) }}
|
||||||
|
{{- (delimit $author ", " ) }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $author }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end -}}
|
||||||
19
themes/PaperMod/layouts/partials/breadcrumbs.html
Normal file
19
themes/PaperMod/layouts/partials/breadcrumbs.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{{- if (.Param "ShowBreadCrumbs") -}}
|
||||||
|
<div class="breadcrumbs">
|
||||||
|
{{- $url := replace .Parent.Permalink (printf "%s" site.Home.Permalink) "" }}
|
||||||
|
{{- $lang_url := strings.TrimPrefix (printf "%s/" .Lang) $url -}}
|
||||||
|
|
||||||
|
<a href="{{ "" | absLangURL }}">{{ i18n "home" | default "Home" }}</a>
|
||||||
|
{{- $scratch := newScratch }}
|
||||||
|
{{- range $index, $element := split $lang_url "/" }}
|
||||||
|
|
||||||
|
{{- $scratch.Add "path" (printf "%s/" $element )}}
|
||||||
|
{{- $bc_pg := site.GetPage ($scratch.Get "path") -}}
|
||||||
|
|
||||||
|
{{- if (and ($bc_pg) (gt (len . ) 0))}}
|
||||||
|
{{- print " » " | safeHTML -}}<a href="{{ $bc_pg.Permalink }}">{{ $bc_pg.Name }}</a>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
3
themes/PaperMod/layouts/partials/comments.html
Normal file
3
themes/PaperMod/layouts/partials/comments.html
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{{- /* Comments area start */ -}}
|
||||||
|
{{- /* to add comments read => https://gohugo.io/content-management/comments/ */ -}}
|
||||||
|
{{- /* Comments area end */ -}}
|
||||||
65
themes/PaperMod/layouts/partials/cover.html
Normal file
65
themes/PaperMod/layouts/partials/cover.html
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{{- with .cxt}} {{/* Apply proper context from dict */}}
|
||||||
|
{{- if (and .Params.cover.image (not $.isHidden)) }}
|
||||||
|
<figure class="entry-cover">
|
||||||
|
{{- $loading := cond $.IsSingle "eager" "lazy" }}
|
||||||
|
{{- $addLink := (and site.Params.cover.linkFullImages $.IsSingle) }}
|
||||||
|
{{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
|
||||||
|
{{- $alt := (.Params.cover.alt | default .Params.cover.caption | plainify) }}
|
||||||
|
{{- $responsiveImages := (.Params.cover.responsiveImages | default site.Params.cover.responsiveImages) | default true }}
|
||||||
|
|
||||||
|
{{- $pageBundleCover := (.Resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }}
|
||||||
|
{{- $globalResourcesCover := (resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }}
|
||||||
|
{{- $cover := (or $pageBundleCover $globalResourcesCover)}}
|
||||||
|
{{- /* We are not using the .Param.cover.relative to decide the location of image */}}
|
||||||
|
{{- /* If we have the image in pageBundle or globalResources we can process the image */}}
|
||||||
|
|
||||||
|
{{- $sizes := (slice "360" "480" "720" "1080" "1500") }}
|
||||||
|
{{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
|
||||||
|
{{- if hugo.IsExtended -}}
|
||||||
|
{{- $processableFormats = $processableFormats | append "webp" -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- $imgdl := (.Params.cover.image) | absURL }}
|
||||||
|
{{- if $cover -}}
|
||||||
|
{{- $imgdl = $cover.Permalink }}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $addLink }}
|
||||||
|
<a href="{{ $imgdl }}" target="_blank" rel="noopener noreferrer">
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if $cover -}}
|
||||||
|
{{/* i.e it is present in page bundle */}}
|
||||||
|
{{- if (and (in $processableFormats $cover.MediaType.SubType) ($responsiveImages) (eq $prod true)) }}
|
||||||
|
<img loading="{{$loading}}"
|
||||||
|
srcset='{{- range $size := $sizes -}}
|
||||||
|
{{- if (ge $cover.Width $size) }}
|
||||||
|
{{- printf "%s %s" (($cover.Resize (printf "%sx" $size)).Permalink) (printf "%sw," $size) }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- printf "%s %dw" ($cover.Permalink) ($cover.Width) }}'
|
||||||
|
src="{{ $cover.Permalink }}"
|
||||||
|
sizes="(min-width: 768px) 720px, 100vw"
|
||||||
|
width="{{ $cover.Width }}" height="{{ $cover.Height }}"
|
||||||
|
alt="{{ $alt }}">
|
||||||
|
{{- else }}{{/* Unprocessable image or responsive images disabled */}}
|
||||||
|
<img loading="{{ $loading }}" src="{{ $imgdl }}" alt="{{ $alt }}">
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{- /* For absolute urls and external links, no img processing here */}}
|
||||||
|
<img loading="{{ $loading }}" src="{{ $imgdl }}" alt="{{ $alt }}">
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if $addLink }}
|
||||||
|
</a>
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- /* Display Caption */}}
|
||||||
|
{{- if $.IsSingle }}
|
||||||
|
{{ with .Params.cover.caption -}}
|
||||||
|
<figcaption>{{ . | markdownify }}</figcaption>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</figure>
|
||||||
|
{{- end }}{{/* End image */}}
|
||||||
|
{{- end -}}{{/* End context */ -}}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user