This commit is contained in:
parent
15af8e487c
commit
3a467134b3
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -61,3 +61,9 @@
|
|||||||
[submodule "vendor/github.com/ddliu/motto"]
|
[submodule "vendor/github.com/ddliu/motto"]
|
||||||
path = vendor/github.com/ddliu/motto
|
path = vendor/github.com/ddliu/motto
|
||||||
url = https://github.com/ddliu/motto
|
url = https://github.com/ddliu/motto
|
||||||
|
[submodule "vendor/github.com/disintegration/imaging"]
|
||||||
|
path = vendor/github.com/disintegration/imaging
|
||||||
|
url = https://github.com/disintegration/imaging
|
||||||
|
[submodule "vendor/golang.org/x/image"]
|
||||||
|
path = vendor/golang.org/x/image
|
||||||
|
url = https://go.googlesource.com/image
|
||||||
|
@ -27,6 +27,36 @@ func BackToRoot(curNavPath string) string {
|
|||||||
return tmpPath
|
return tmpPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ResolveNavPath fixes nav target relative to current navigation path
|
||||||
|
func ResolveNavPath(target string) string {
|
||||||
|
curNavPath := (*currentContext)["CurrentPath"].(string)
|
||||||
|
if strings.HasPrefix(target, "/") {
|
||||||
|
target = BackToRoot(curNavPath) + target
|
||||||
|
}
|
||||||
|
target = path.Clean(target)
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResolveOutputPath fixes output directory relative to current navigation path
|
||||||
|
func ResolveOutputPath(target string) string {
|
||||||
|
if strings.HasPrefix(target, "/") {
|
||||||
|
target = config.Config.Directories.Output + "/" + target
|
||||||
|
} else {
|
||||||
|
target = currentTreeNodeConfig.OutputPath + "/" + target
|
||||||
|
}
|
||||||
|
return path.Clean(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResolveInputPath fixes input directory relative to current navigation path
|
||||||
|
func ResolveInputPath(target string) string {
|
||||||
|
if strings.HasPrefix(target, "/") {
|
||||||
|
target = config.Config.Directories.Input + "/" + target
|
||||||
|
} else {
|
||||||
|
target = currentTreeNodeConfig.InputPath + "/" + target
|
||||||
|
}
|
||||||
|
return path.Clean(target)
|
||||||
|
}
|
||||||
|
|
||||||
// SetTemplateDir sets base directory for searching template files
|
// SetTemplateDir sets base directory for searching template files
|
||||||
func SetTemplateDir(dir string) {
|
func SetTemplateDir(dir string) {
|
||||||
templateDir = dir
|
templateDir = dir
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
package helper
|
package helper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ddliu/motto"
|
"github.com/ddliu/motto"
|
||||||
|
"github.com/disintegration/imaging"
|
||||||
"github.com/flosch/pongo2"
|
"github.com/flosch/pongo2"
|
||||||
_ "github.com/flosch/pongo2-addons"
|
_ "github.com/flosch/pongo2-addons"
|
||||||
_ "github.com/robertkrimen/otto/underscore"
|
_ "github.com/robertkrimen/otto/underscore"
|
||||||
@ -16,6 +20,17 @@ func init() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newFilters := map[string]pongo2.FilterFunction{
|
||||||
|
"image_resize": ImageResizeFilter,
|
||||||
|
"relative_path": RelativePathFilter,
|
||||||
|
}
|
||||||
|
for name, fn := range newFilters {
|
||||||
|
err := pongo2.RegisterFilter(name, fn)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarkdownFilter is a pongo2 filter, which converts markdown to html
|
// MarkdownFilter is a pongo2 filter, which converts markdown to html
|
||||||
@ -29,6 +44,88 @@ func MarkdownFilter(in *pongo2.Value, param *pongo2.Value) (*pongo2.Value, *pong
|
|||||||
nil
|
nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type imageParams struct {
|
||||||
|
width int
|
||||||
|
height int
|
||||||
|
filename string
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseImageParams(str string) (*imageParams, error) {
|
||||||
|
if str == "" {
|
||||||
|
return nil, errors.New("missing image parameters")
|
||||||
|
}
|
||||||
|
p := imageParams{}
|
||||||
|
for _, s := range strings.Split(str, ",") {
|
||||||
|
e := strings.Split(s, "=")
|
||||||
|
if len(e) < 2 {
|
||||||
|
return nil, fmt.Errorf("invalid image parameter: %s", s)
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
switch e[0] {
|
||||||
|
case "w":
|
||||||
|
p.width, err = strconv.Atoi(e[1])
|
||||||
|
case "h":
|
||||||
|
p.height, err = strconv.Atoi(e[1])
|
||||||
|
case "f":
|
||||||
|
p.filename = e[1]
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("invalid image parameter: %s", s)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not convert image parameter to correct value type for '%s': %s", s, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ImageResizeFilter read the image url and resize parameters and saves the resized image
|
||||||
|
// param: w=WITDH,h=HEIGHT
|
||||||
|
func ImageResizeFilter(in *pongo2.Value, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
|
||||||
|
imgSource := in.String()
|
||||||
|
p, err := parseImageParams(param.String())
|
||||||
|
if err != nil {
|
||||||
|
return nil, &pongo2.Error{
|
||||||
|
Sender: "filter:image_resize",
|
||||||
|
OrigError: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
imgSource = ResolveInputPath(imgSource)
|
||||||
|
if p.filename == "" {
|
||||||
|
p.filename = fmt.Sprintf("%dx%d_%s", p.width, p.height, path.Base(imgSource))
|
||||||
|
}
|
||||||
|
imgTarget := ResolveOutputPath(p.filename)
|
||||||
|
Log.Noticef("resizing image from %s to %s", imgSource, imgTarget)
|
||||||
|
|
||||||
|
img, err := imaging.Open(imgSource, imaging.AutoOrientation(true))
|
||||||
|
if err != nil {
|
||||||
|
return nil, &pongo2.Error{
|
||||||
|
Sender: "filter:image_resize",
|
||||||
|
OrigError: fmt.Errorf("could not open image '%s': %s", imgSource, err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
img = imaging.Resize(img, p.width, p.height, imaging.Lanczos)
|
||||||
|
|
||||||
|
err = imaging.Save(img, imgTarget)
|
||||||
|
if err != nil {
|
||||||
|
return nil, &pongo2.Error{
|
||||||
|
Sender: "filter:image_resize",
|
||||||
|
OrigError: fmt.Errorf("could save image '%s': %s", imgTarget, err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pongo2.AsValue(ResolveNavPath(p.filename)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RelativePathFilter returns the relative path to navpoint based on current nav
|
||||||
|
func RelativePathFilter(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
|
||||||
|
return pongo2.AsValue(
|
||||||
|
ResolveNavPath(
|
||||||
|
in.String(),
|
||||||
|
),
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
// RegisterFilters reads a directory and register filters from files within it
|
// RegisterFilters reads a directory and register filters from files within it
|
||||||
func RegisterFilters(dir string) {
|
func RegisterFilters(dir string) {
|
||||||
files, err := ioutil.ReadDir(dir)
|
files, err := ioutil.ReadDir(dir)
|
||||||
|
@ -1 +1 @@
|
|||||||
POST https://cockpit.basiscms.de/api/collections/get/mark2webBlog?filter[published]=true&sort[date]=-1&limit=1&skip=1
|
GET https://mark2web.basiscms.de/api/collections/get/mark2webBlog?filter[published]=true&sort[date]=-1&limit=1&skip=0
|
1
vendor/github.com/disintegration/imaging
generated
vendored
Submodule
1
vendor/github.com/disintegration/imaging
generated
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 5362c131d56305ce787e79a5b94ffc956df00d62
|
1
vendor/golang.org/x/image
generated
vendored
Submodule
1
vendor/golang.org/x/image
generated
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 0694c2d4d067f97ebef574d63a763ee8ab559da7
|
BIN
website/content/de/01_Navigation/02_Installation/bild.jpg
Normal file
BIN
website/content/de/01_Navigation/02_Installation/bild.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 790 KiB |
@ -24,7 +24,10 @@ hr { display:block; height:1px; border:0; border:none; padding:0;}
|
|||||||
input, select {vertical-align:middle;}
|
input, select {vertical-align:middle;}
|
||||||
input, select, textarea {-webkit-appearance: none; border-radius: 0;}
|
input, select, textarea {-webkit-appearance: none; border-radius: 0;}
|
||||||
.clear {clear:both; margin: 0; padding:0;}
|
.clear {clear:both; margin: 0; padding:0;}
|
||||||
img {line-height:0;}
|
img {
|
||||||
|
line-height:0;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------
|
/*--------------------------------------------------------------
|
||||||
# General Settings
|
# General Settings
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<header id="header">
|
<header id="header">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="logo"><img src="project-files/img/logo.png" alt=""></div>
|
<div class="logo"><a href="{{ "/"|relative_path }}"><img src="project-files/img/logo.png" alt=""></a></div>
|
||||||
<a id="pull">
|
<a id="pull">
|
||||||
<span class="pull_button">
|
<span class="pull_button">
|
||||||
<span></span>
|
<span></span>
|
||||||
|
@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
{% block part1 %}
|
{% block part1 %}
|
||||||
{{ Body }}
|
{{ Body }}
|
||||||
|
<img src="{{ "https://mark2web.basiscms.de/"|add:Data.details.image.path }}">
|
||||||
<a href="../" class="btn">« zurück</a>
|
<a href="../" class="btn">« zurück</a>
|
||||||
{% endblock part1 %}
|
{% endblock part1 %}
|
||||||
|
Loading…
Reference in New Issue
Block a user