feat: Implement robust theme system and document architecture

- Implement flexible theme switching via site.conf (site_theme, site_theme_css_file).
- Ensure correct copying of theme static assets, with theme assets overriding root assets.
- Resolve CSS linking issues by checking file existence after static copy and using correct paths for Pandoc.
- Refactor path construction to prevent duplication when using absolute/relative output paths.
- Create comprehensive how-it-works.md detailing system architecture, theme creation, and overall workflow.
- Clarify design philosophy: qsgen3 remains design-agnostic, only linking main theme CSS automatically.
This commit is contained in:
Stig-Ørjan Smelror 2025-05-31 00:00:21 +02:00
parent c14e943f2b
commit c470ac40c0
34 changed files with 5058 additions and 82 deletions

View File

@ -1,70 +1,45 @@
<img src="qsg2-square.png" width="150" align="left">
# qsgen3 - A Minimal Markdown Static Site Generator
# Quick Site Generator 2
This is a refactored version of qsgen, focusing on simplicity, Markdown with YAML frontmatter, and a Zsh-based build process.
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
## Project Goals
Quick Site Generator 2 is a powerful static website generator written in Zsh, inspired by [Nikola](https://github.com/getnikola/nikola). It's designed to be fast, flexible, and easy to use, with support for both custom QSTags and standard Markdown syntax.
- Remove QSTags and switch to Markdown + YAML frontmatter.
- Simplify codebase by removing multilingual and theme support.
- Refactor templating with uniform variables (e.g., `{{ content }}`, `{{ title }}`).
- Ensure future-proofing by avoiding complex dependencies (like AWK for long string manipulation) for core tasks.
- Provide a solid initial setup that works out of the box with a sample post, index, and layout.
- Include a converter script in `scripts/convert-qstags-to-md.sh` for legacy content.
## Features
## Structure
- 🚀 Blazing fast static site generation
- 📝 Supports both QSTags and Markdown content
- 🌍 Multi-language support (en_US, en_UK, es_ES, fr_FR, nb_NO)
- 🎨 Themeable with custom templates (see [THEME-HOWTO.md](THEME-HOWTO.md))
- 📱 Responsive design ready
- 🔍 SEO friendly
- 🔄 Automatic rebuild on file changes
- `bin/qsgen3`: The main Zsh build script.
- `site.conf`: Site configuration (INI format).
- `content/`: Source Markdown files.
- `content/posts/`: Blog posts.
- `content/pages/`: Static pages.
- `layouts/`: HTML templates.
- `layouts/base.html`: Base template for all pages.
- `layouts/post.html`: Template for individual blog posts.
- `layouts/page.html`: Template for static pages.
- `static/`: Static assets (CSS, images, etc.) copied as-is to the output.
- `output/`: The generated website.
- `scripts/`: Utility scripts (e.g., content converter).
## Quick Start
## Usage
1. **Installation**
1. Configure your site in `site.conf`.
2. Add Markdown content to the `content/` directory.
3. Customize templates in `layouts/`.
4. Run the build script:
```bash
git clone https://github.com/kekePower/qsgen2.git
cd qsgen2
chmod +x qsgen2
./bin/qsgen3
```
5. Your static site will be generated in the `output/` directory.
2. **Create a new site**
```bash
./qsgen2 new my-site
cd my-site
```
## Dependencies
3. **Build and serve**
```bash
./qsgen2 build
./qsgen2 serve
```
- Zsh
- A Markdown processor (e.g., Pandoc, CommonMark, or a Zsh-native solution if feasible for basic needs).
- Standard Unix utilities (grep, sed, find, etc.).
For detailed documentation, see the [HOWTO.md](HOWTO.md) guide.
## Recent Changes
- Added Norwegian (nb_NO) language support
- Improved internationalization (i18n) system
- Cleaned up temporary and backup files
- Updated documentation
- Added comprehensive HOWTO guide
## Requirements
- Zsh 5.8 or later
- Pandoc (for Markdown support)
- Basic Unix tools (sed, grep, etc.)
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Contributing
Contributions are welcome! Please read our [contributing guidelines](CONTRIBUTING.md) before submitting pull requests.
## Support
For support, please [open an issue](https://github.com/kekePower/qsgen2/issues) on GitHub.
---
*Created with ❤️ by kekePower*

1110
bin/qsgen3 Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
---
title: "Hello, World!"
date: "2024-05-30"
author: "qsgen3"
draft: false
summary: "My first post using the qsgen3 static site generator."
---
Welcome to qsgen3!
This is your first post. You can edit it or delete it and start writing your own content.
## Markdown Features
Qsgen3 supports standard Markdown features, including:
- Headings
- **Bold** and *italic* text
- Lists:
- Unordered
- Ordered
- [Links](https://example.com)
- `Inline code`
```bash
# Code blocks
echo "Hello from a code block!"
```
Enjoy creating your site!

View File

@ -0,0 +1,131 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>#sitename - Blog</title>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="Webflow" name="generator"/>
<link href="/css/minimaltemplate-v1.css" rel="stylesheet" type="text/css"/>
<script src="/css/webfont.js" type="text/javascript">
</script>
<script type="text/javascript">WebFont.load({ google: { families: ["Vollkorn:400,400italic,700,700italic","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Oswald:200,300,400,500,600,700"] }});</script>
<script type="text/javascript">
!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);
</script>
<link href="/images/el-vikingo-ti.png" rel="shortcut icon" type="image/png"/>
<link href="/images/el-vikingo-ti.png" rel="apple-touch-icon"/>
</head>
<body>
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="w-container">
<a href="/" class="brand-block w-clearfix w-nav-brand">
<img src="/images/el-vikingo-ti.png" width="65" alt="" class="logo-img"/>
<h1 class="logo-title">#sitename</h1>
</a>
<nav role="navigation" class="nav-menu w-nav-menu">
<a href="/" class="nav-link w-nav-link">Inicio</a>
<a href="/sobre.html" class="nav-link w-nav-link">Sobre El Vikingo TI</a>
<a href="/servicios.html" class="nav-link w-nav-link">Que Hago</a>
<a href="/contacto.html" class="nav-link w-nav-link">Contáctame</a>
<a href="/blog/" class="nav-link w-nav-link">Blog</a>
</nav>
<div class="menu-button w-nav-button">
<div class="w-icon-nav-menu">
</div>
</div>
</div>
</div>
<div class="header">
<div class="w-container">
<h1 class="main-heading">Blog</h1>
<div class="divider">
</div>
<div class="main-subtitle">#tagline</div>
</div>
</div>
<div class="about-section">
<div class="w-container">
<p>&nbsp;</p>
<!-- Header End -->
<!-- Body Start -->
BODY
<!-- Body End -->
<!-- Begin Footer Template -->
</div>
</div>
</div>
<div id="contact" class="section contact">
<div class="w-container">
<h2>Ponte en contacto conmigo</h2>
<div class="divider grey">
</div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="icon-wrapper">
<img src="/images/map-icon.png" width="44" alt=""/>
</div>
<h3>Lo que hago</h3>
<p class="contact-text">
Elegir a El Vikingo TI significa<br/>
optar por la tranquilidad, la profesionalidad<br/>
y una calidad de transmisión inigualable.
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/mail-icon.png" width="70" alt=""/>
</div>
<h3>La manera tradicional</h3>
<p class="contact-text">Correo Electronico<br/>
<a href="/contacto.html" class="link">Envíeme un mensaje</a>
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/heart-icon.png" width="68" alt=""/>
</div>
<h3>Redes Sociales</h3>
<a href="#" class="social-wrapper contact-text w-inline-block w-clearfix">
<img src="/images/facebook-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Facebook</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/twitter-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Twitter</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/linkdin-icon-black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">LinkedIn</div></a>
</div>
</div>
</div>
</div>
<footer id="footer" class="newsection footer">
<img src="/images/el-vikingo-ti.png" width="43" alt="El Vikingo TI Logo" class="footer-logo"/>
<p class="footer-text">
#updated
</p>
</div>
</footer>
<script src="/css/jquery-3.5.1.js" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="/css/webflow.js" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,17 @@
<!-- Blog Post for Index Start -->
<!-- <div id="process" class="section"> -->
<div class="w-container">
<h3><a class="link" href="BLOGURL">BLOGTITLE</a></h3>
<div class="grow-row w-row">
INGRESS
</div>
<div class="grow-row w-row">
<strong style="font-size: 10px; padding-top: 3px;">BLOGDATE</strong>
</div>
<div class="divider grey"></div>
</div>
<!-- </div> -->
<!-- Blog Post for Index End -->

View File

@ -0,0 +1,125 @@
<html>
<head>
<meta charset="utf-8"/>
<title>#sitename - BLOGTITLE</title>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<link href="/css/minimaltemplate-v1.css" rel="stylesheet" type="text/css"/>
<script src="/css/webfont.js" type="text/javascript">
</script>
<script type="text/javascript">
WebFont.load({ google: { families: ["Vollkorn:400,400italic,700,700italic","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Oswald:200,300,400,500,600,700"] }});</script>
<script type="text/javascript">
!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
<link href="/images/el-vikingo-ti.png" rel="shortcut icon" type="image/png"/>
<link href="/images/el-vikingo-ti.png" rel="apple-touch-icon"/>
</head>
<body>
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="w-container">
<a href="/" class="brand-block w-clearfix w-nav-brand">
<img src="/images/el-vikingo-ti.png" width="65" alt="" class="logo-img"/>
<h1 class="logo-title">#sitename</h1>
</a>
<nav role="navigation" class="nav-menu w-nav-menu">
<a href="/blog/" class="nav-link w-nav-link">← Al Blog</a>
</nav>
<div class="menu-button w-nav-button">
<div class="w-icon-nav-menu">
</div>
</div>
</div>
</div>
<div class="header project-page">
<div class="w-container">
<h1 class="main-heading">BLOGTITLE</h1>
<div class="divider">
</div>
<div class="main-subtitle">
CALADAY - CALNDAY - CALMONTH - CALYEAR
</div>
</div>
</div>
<!-- Blog Post Start -->
<div class="about-section">
<div class="w-container">
<div id="process" class="section ingress">
<div class="w-container">
INGRESS
<div class="divider grey"></div>
<div class="grow-row w-row">
BODY
</div>
</div>
</div>
</div>
<!-- Blog Post End -->
</div>
<div id="contact" class="section contact">
<div class="w-container">
<h2>Ponte en contacto conmigo</h2>
<div class="divider grey">
</div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="icon-wrapper">
<img src="/images/map-icon.png" width="44" alt=""/>
</div>
<h3>Lo que hago</h3>
<p class="contact-text">
Elegir a El Vikingo TI significa<br/>
optar por la tranquilidad, la profesionalidad<br/>
y una calidad de transmisión inigualable.
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/mail-icon.png" width="70" alt=""/>
</div>
<h3>La manera tradicional</h3>
<p class="contact-text">Correo Electronico<br/>
<a href="/contacto.html" class="link">Envíeme un mensaje</a>
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/heart-icon.png" width="68" alt=""/>
</div>
<h3>Redes Sociales</h3>
<a href="#" class="social-wrapper contact-text w-inline-block w-clearfix">
<img src="/images/facebook-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Facebook</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/twitter-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Twitter</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/linkdin-icon-black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">LinkedIn</div></a>
</div>
</div>
</div>
</div>
<footer id="footer" class="newsection footer">
<img src="/images/el-vikingo-ti.png" width="43" alt="El Vikingo TI Logo" class="footer-logo"/>
<p class="footer-text">
#updated
</p>
</div>
</footer>
<script src="/css/jquery-3.5.1.js" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="/css/webflow.js" type="text/javascript"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,33 @@
/*
* Copyright 2016 Small Batch, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
/* Web Font Loader v1.6.26 - (c) Adobe Systems, Google. License: Apache 2.0 */(function(){function aa(a,b,c){return a.call.apply(a.bind,arguments)}function ba(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}function p(a,b,c){p=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?aa:ba;return p.apply(null,arguments)}var q=Date.now||function(){return+new Date};function ca(a,b){this.a=a;this.m=b||a;this.c=this.m.document}var da=!!window.FontFace;function t(a,b,c,d){b=a.c.createElement(b);if(c)for(var e in c)c.hasOwnProperty(e)&&("style"==e?b.style.cssText=c[e]:b.setAttribute(e,c[e]));d&&b.appendChild(a.c.createTextNode(d));return b}function u(a,b,c){a=a.c.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(c,a.lastChild)}function v(a){a.parentNode&&a.parentNode.removeChild(a)}
function w(a,b,c){b=b||[];c=c||[];for(var d=a.className.split(/\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<d.length;g+=1)if(b[e]===d[g]){f=!0;break}f||d.push(b[e])}b=[];for(e=0;e<d.length;e+=1){f=!1;for(g=0;g<c.length;g+=1)if(d[e]===c[g]){f=!0;break}f||b.push(d[e])}a.className=b.join(" ").replace(/\s+/g," ").replace(/^\s+|\s+$/,"")}function y(a,b){for(var c=a.className.split(/\s+/),d=0,e=c.length;d<e;d++)if(c[d]==b)return!0;return!1}
function z(a){if("string"===typeof a.f)return a.f;var b=a.m.location.protocol;"about:"==b&&(b=a.a.location.protocol);return"https:"==b?"https:":"http:"}function ea(a){return a.m.location.hostname||a.a.location.hostname}
function A(a,b,c){function d(){k&&e&&f&&(k(g),k=null)}b=t(a,"link",{rel:"stylesheet",href:b,media:"all"});var e=!1,f=!0,g=null,k=c||null;da?(b.onload=function(){e=!0;d()},b.onerror=function(){e=!0;g=Error("Stylesheet failed to load");d()}):setTimeout(function(){e=!0;d()},0);u(a,"head",b)}
function B(a,b,c,d){var e=a.c.getElementsByTagName("head")[0];if(e){var f=t(a,"script",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(g=!0,c&&c(null),f.onload=f.onreadystatechange=null,"HEAD"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,c&&c(Error("Script load timeout")))},d||5E3);return f}return null};function C(){this.a=0;this.c=null}function D(a){a.a++;return function(){a.a--;E(a)}}function F(a,b){a.c=b;E(a)}function E(a){0==a.a&&a.c&&(a.c(),a.c=null)};function G(a){this.a=a||"-"}G.prototype.c=function(a){for(var b=[],c=0;c<arguments.length;c++)b.push(arguments[c].replace(/[\W_]+/g,"").toLowerCase());return b.join(this.a)};function H(a,b){this.c=a;this.f=4;this.a="n";var c=(b||"n4").match(/^([nio])([1-9])$/i);c&&(this.a=c[1],this.f=parseInt(c[2],10))}function fa(a){return I(a)+" "+(a.f+"00")+" 300px "+J(a.c)}function J(a){var b=[];a=a.split(/,\s*/);for(var c=0;c<a.length;c++){var d=a[c].replace(/['"]/g,"");-1!=d.indexOf(" ")||/^\d/.test(d)?b.push("'"+d+"'"):b.push(d)}return b.join(",")}function K(a){return a.a+a.f}function I(a){var b="normal";"o"===a.a?b="oblique":"i"===a.a&&(b="italic");return b}
function ga(a){var b=4,c="n",d=null;a&&((d=a.match(/(normal|oblique|italic)/i))&&d[1]&&(c=d[1].substr(0,1).toLowerCase()),(d=a.match(/([1-9]00|normal|bold)/i))&&d[1]&&(/bold/i.test(d[1])?b=7:/[1-9]00/.test(d[1])&&(b=parseInt(d[1].substr(0,1),10))));return c+b};function ha(a,b){this.c=a;this.f=a.m.document.documentElement;this.h=b;this.a=new G("-");this.j=!1!==b.events;this.g=!1!==b.classes}function ia(a){a.g&&w(a.f,[a.a.c("wf","loading")]);L(a,"loading")}function M(a){if(a.g){var b=y(a.f,a.a.c("wf","active")),c=[],d=[a.a.c("wf","loading")];b||c.push(a.a.c("wf","inactive"));w(a.f,c,d)}L(a,"inactive")}function L(a,b,c){if(a.j&&a.h[b])if(c)a.h[b](c.c,K(c));else a.h[b]()};function ja(){this.c={}}function ka(a,b,c){var d=[],e;for(e in b)if(b.hasOwnProperty(e)){var f=a.c[e];f&&d.push(f(b[e],c))}return d};function N(a,b){this.c=a;this.f=b;this.a=t(this.c,"span",{"aria-hidden":"true"},this.f)}function O(a){u(a.c,"body",a.a)}function P(a){return"display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:"+J(a.c)+";"+("font-style:"+I(a)+";font-weight:"+(a.f+"00")+";")};function Q(a,b,c,d,e,f){this.g=a;this.j=b;this.a=d;this.c=c;this.f=e||3E3;this.h=f||void 0}Q.prototype.start=function(){var a=this.c.m.document,b=this,c=q(),d=new Promise(function(d,e){function k(){q()-c>=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(k,25)},function(){e()})}k()}),e=new Promise(function(a,d){setTimeout(d,b.f)});Promise.race([e,d]).then(function(){b.g(b.a)},function(){b.j(b.a)})};function R(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.o=this.j=this.h=this.g=null;this.g=new N(this.c,this.s);this.h=new N(this.c,this.s);this.j=new N(this.c,this.s);this.o=new N(this.c,this.s);a=new H(this.a.c+",serif",K(this.a));a=P(a);this.g.a.style.cssText=a;a=new H(this.a.c+",sans-serif",K(this.a));a=P(a);this.h.a.style.cssText=a;a=new H("serif",K(this.a));a=P(a);this.j.a.style.cssText=a;a=new H("sans-serif",K(this.a));a=
P(a);this.o.a.style.cssText=a;O(this.g);O(this.h);O(this.j);O(this.o)}var S={D:"serif",C:"sans-serif"},T=null;function U(){if(null===T){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);T=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return T}R.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.o.a.offsetWidth;this.A=q();la(this)};
function ma(a,b,c){for(var d in S)if(S.hasOwnProperty(d)&&b===a.f[S[d]]&&c===a.f[S[d]])return!0;return!1}function la(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f["sans-serif"])||(d=U()&&ma(a,b,c));d?q()-a.A>=a.w?U()&&ma(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):na(a):V(a,a.v)}function na(a){setTimeout(p(function(){la(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.o.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.o=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,K(a).toString(),"active")],[b.a.c("wf",a.c,K(a).toString(),"loading"),b.a.c("wf",a.c,K(a).toString(),"inactive")]);L(b,"fontactive",a);this.o=!0;oa(this)};
W.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c("wf",a.c,K(a).toString(),"active")),d=[],e=[b.a.c("wf",a.c,K(a).toString(),"loading")];c||d.push(b.a.c("wf",a.c,K(a).toString(),"inactive"));w(b.f,d,e)}L(b,"fontinactive",a);oa(this)};function oa(a){0==--a.f&&a.j&&(a.o?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),L(a,"active")):M(a.a))};function pa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}pa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;qa(this,new ha(this.c,a),a)};
function ra(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,k=d||null||{};if(0===c.length&&f)M(b.a);else{b.f+=c.length;f&&(b.j=f);var h,m=[];for(h=0;h<c.length;h++){var l=c[h],n=k[l.c],r=b.a,x=l;r.g&&w(r.f,[r.a.c("wf",x.c,K(x).toString(),"loading")]);L(r,"fontloading",x);r=null;null===X&&(X=window.FontFace?(x=/Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent))?42<parseInt(x[1],10):!0:!1);X?r=new Q(p(b.g,b),p(b.h,b),b.c,l,b.s,n):r=new R(p(b.g,b),p(b.h,b),b.c,l,b.s,a,
n);m.push(r)}for(h=0;h<m.length;h++)m[h].start()}},0)}function qa(a,b,c){var d=[],e=c.timeout;ia(b);var d=ka(a.a,c,a.c),f=new W(a.c,b,e);a.h=d.length;b=0;for(c=d.length;b<c;b++)d[b].load(function(b,d,c){ra(a,f,b,d,c)})};function sa(a,b){this.c=a;this.a=b}function ta(a,b,c){var d=z(a.c);a=(a.a.api||"fast.fonts.net/jsapi").replace(/^.*http(s?):(\/\/)?/,"");return d+"//"+a+"/"+b+".js"+(c?"?v="+c:"")}
sa.prototype.load=function(a){function b(){if(f["__mti_fntLst"+d]){var c=f["__mti_fntLst"+d](),e=[],h;if(c)for(var m=0;m<c.length;m++){var l=c[m].fontfamily;void 0!=c[m].fontStyle&&void 0!=c[m].fontWeight?(h=c[m].fontStyle+c[m].fontWeight,e.push(new H(l,h))):e.push(new H(l))}a(e)}else setTimeout(function(){b()},50)}var c=this,d=c.a.projectId,e=c.a.version;if(d){var f=c.c.m;B(this.c,ta(c,d,e),function(e){e?a([]):(f["__MonotypeConfiguration__"+d]=function(){return c.a},b())}).id="__MonotypeAPIScript__"+
d}else a([])};function ua(a,b){this.c=a;this.a=b}ua.prototype.load=function(a){var b,c,d=this.a.urls||[],e=this.a.families||[],f=this.a.testStrings||{},g=new C;b=0;for(c=d.length;b<c;b++)A(this.c,d[b],D(g));var k=[];b=0;for(c=e.length;b<c;b++)if(d=e[b].split(":"),d[1])for(var h=d[1].split(","),m=0;m<h.length;m+=1)k.push(new H(d[0],h[m]));else k.push(new H(d[0]));F(g,function(){a(k,f)})};function va(a,b,c){a?this.c=a:this.c=b+wa;this.a=[];this.f=[];this.g=c||""}var wa="//fonts.googleapis.com/css";function xa(a,b){for(var c=b.length,d=0;d<c;d++){var e=b[d].split(":");3==e.length&&a.f.push(e.pop());var f="";2==e.length&&""!=e[1]&&(f=":");a.a.push(e.join(f))}}
function ya(a){if(0==a.a.length)throw Error("No fonts to load!");if(-1!=a.c.indexOf("kit="))return a.c;for(var b=a.a.length,c=[],d=0;d<b;d++)c.push(a.a[d].replace(/ /g,"+"));b=a.c+"?family="+c.join("%7C");0<a.f.length&&(b+="&subset="+a.f.join(","));0<a.g.length&&(b+="&text="+encodeURIComponent(a.g));return b};function za(a){this.f=a;this.a=[];this.c={}}
var Aa={latin:"BESbswy","latin-ext":"\u00e7\u00f6\u00fc\u011f\u015f",cyrillic:"\u0439\u044f\u0416",greek:"\u03b1\u03b2\u03a3",khmer:"\u1780\u1781\u1782",Hanuman:"\u1780\u1781\u1782"},Ba={thin:"1",extralight:"2","extra-light":"2",ultralight:"2","ultra-light":"2",light:"3",regular:"4",book:"4",medium:"5","semi-bold":"6",semibold:"6","demi-bold":"6",demibold:"6",bold:"7","extra-bold":"8",extrabold:"8","ultra-bold":"8",ultrabold:"8",black:"9",heavy:"9",l:"3",r:"4",b:"7"},Ca={i:"i",italic:"i",n:"n",normal:"n"},
Da=/^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/;
function Ea(a){for(var b=a.f.length,c=0;c<b;c++){var d=a.f[c].split(":"),e=d[0].replace(/\+/g," "),f=["n4"];if(2<=d.length){var g;var k=d[1];g=[];if(k)for(var k=k.split(","),h=k.length,m=0;m<h;m++){var l;l=k[m];if(l.match(/^[\w-]+$/)){var n=Da.exec(l.toLowerCase());if(null==n)l="";else{l=n[2];l=null==l||""==l?"n":Ca[l];n=n[1];if(null==n||""==n)n="4";else var r=Ba[n],n=r?r:isNaN(n)?"4":n.substr(0,1);l=[l,n].join("")}}else l="";l&&g.push(l)}0<g.length&&(f=g);3==d.length&&(d=d[2],g=[],d=d?d.split(","):
g,0<d.length&&(d=Aa[d[0]])&&(a.c[e]=d))}a.c[e]||(d=Aa[e])&&(a.c[e]=d);for(d=0;d<f.length;d+=1)a.a.push(new H(e,f[d]))}};function Fa(a,b){this.c=a;this.a=b}var Ga={Arimo:!0,Cousine:!0,Tinos:!0};Fa.prototype.load=function(a){var b=new C,c=this.c,d=new va(this.a.api,z(c),this.a.text),e=this.a.families;xa(d,e);var f=new za(e);Ea(f);A(c,ya(d),D(b));F(b,function(){a(f.a,f.c,Ga)})};function Ha(a,b){this.c=a;this.a=b}Ha.prototype.load=function(a){var b=this.a.id,c=this.c.m;b?B(this.c,(this.a.api||"https://use.typekit.net")+"/"+b+".js",function(b){if(b)a([]);else if(c.Typekit&&c.Typekit.config&&c.Typekit.config.fn){b=c.Typekit.config.fn;for(var e=[],f=0;f<b.length;f+=2)for(var g=b[f],k=b[f+1],h=0;h<k.length;h++)e.push(new H(g,k[h]));try{c.Typekit.load({events:!1,classes:!1,async:!0})}catch(m){}a(e)}},2E3):a([])};function Ia(a,b){this.c=a;this.f=b;this.a=[]}Ia.prototype.load=function(a){var b=this.f.id,c=this.c.m,d=this;b?(c.__webfontfontdeckmodule__||(c.__webfontfontdeckmodule__={}),c.__webfontfontdeckmodule__[b]=function(b,c){for(var g=0,k=c.fonts.length;g<k;++g){var h=c.fonts[g];d.a.push(new H(h.name,ga("font-weight:"+h.weight+";font-style:"+h.style)))}a(d.a)},B(this.c,z(this.c)+(this.f.api||"//f.fontdeck.com/s/css/js/")+ea(this.c)+"/"+b+".js",function(b){b&&a([])})):a([])};var Y=new pa(window);Y.a.c.custom=function(a,b){return new ua(b,a)};Y.a.c.fontdeck=function(a,b){return new Ia(b,a)};Y.a.c.monotype=function(a,b){return new sa(b,a)};Y.a.c.typekit=function(a,b){return new Ha(b,a)};Y.a.c.google=function(a,b){return new Fa(b,a)};var Z={load:p(Y.load,Y)};"function"===typeof define&&define.amd?define(function(){return Z}):"undefined"!==typeof module&&module.exports?module.exports=Z:(window.WebFont=Z,window.WebFontConfig&&Y.load(window.WebFontConfig));}());

View File

@ -0,0 +1,127 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>#sitename - #pagetitle</title>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="Webflow" name="generator"/>
<link href="/css/minimaltemplate-v1.css" rel="stylesheet" type="text/css"/>
<script src="/css/webfont.js" type="text/javascript">
</script>
<script type="text/javascript">WebFont.load({ google: { families: ["Vollkorn:400,400italic,700,700italic","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Oswald:200,300,400,500,600,700"] }});</script>
<script type="text/javascript">
!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);
</script>
<link href="/images/el-vikingo-ti.png" rel="shortcut icon" type="image/png"/>
<link href="/images/el-vikingo-ti.png" rel="apple-touch-icon"/>
</head>
<body>
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="w-container">
<a href="/" class="brand-block w-clearfix w-nav-brand">
<img src="/images/el-vikingo-ti.png" width="65" alt="" class="logo-img"/>
<h1 class="logo-title">#sitename</h1>
</a>
<nav role="navigation" class="nav-menu w-nav-menu">
<a href="/" class="nav-link w-nav-link">Inicio</a>
<a href="/sobre.html" class="nav-link w-nav-link">Sobre #sitename</a>
<a href="/servicios.html" class="nav-link w-nav-link">Que Hago</a>
<a href="/contacto.html" class="nav-link w-nav-link">Contáctame</a>
<a href="/blog/" class="nav-link w-nav-link">Blog</a>
</nav>
<div class="menu-button w-nav-button">
<div class="w-icon-nav-menu">
</div>
</div>
</div>
</div>
<div class="header">
<div class="w-container">
<h1 class="main-heading">#pagetitle</h1>
<div class="divider">
</div>
<div class="main-subtitle">#tagline</div>
</div>
</div>
<div class="about-section">
<div class="w-container">
<!-- Header End -->
<!-- Body Start -->
BODY
<!-- Body End -->
<!-- Begin Footer Template -->
</div>
<div id="contact" class="section contact">
<div class="w-container">
<h2>Ponte en contacto conmigo</h2>
<div class="divider grey">
</div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="icon-wrapper">
<img src="/images/map-icon.png" width="44" alt=""/>
</div>
<h3>Lo que hago</h3>
<p class="contact-text">
Elegir a El Vikingo TI significa<br/>
optar por la tranquilidad, la profesionalidad<br/>
y una calidad de transmisión inigualable.
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/mail-icon.png" width="70" alt=""/>
</div>
<h3>La manera tradicional</h3>
<p class="contact-text">Correo Electronico<br/>
<a href="/contacto.html" class="link">Envíeme un mensaje</a>
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/heart-icon.png" width="68" alt=""/>
</div>
<h3>Redes Sociales</h3>
<a href="#" class="social-wrapper contact-text w-inline-block w-clearfix">
<img src="/images/facebook-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Facebook</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/twitter-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Twitter</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/linkdin-icon-black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">LinkedIn</div></a>
</div>
</div>
</div>
</div>
<footer id="footer" class="newsection footer">
<img src="/images/el-vikingo-ti.png" width="43" alt="El Vikingo TI Logo" class="footer-logo"/>
<p class="footer-text">
#updated
</p>
</div>
</footer>
<script src="/css/jquery-3.5.1.js" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="/css/webflow.js" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,29 @@
<div id="process" class="section">
<div class="w-container">
<h2>How we make brands thrive</h2>
<div class="divider grey"></div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="grey-icon-wrapper">
<img src="https://assets.website-files.com/530ab3ac7b5bc4ca19000b96/530b7763b9b97cdf3e0008b9_icon-target.png" width="127" alt="" class="big-icon"/>
</div>
<h3>SET a target</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.</p>
</div>
<div class="w-col w-col-4">
<div class="grey-icon-wrapper push-top">
<img src="https://assets.website-files.com/530ab3ac7b5bc4ca19000b96/530b7772b9b97cdf3e0008bc_icon-design.png" width="127" alt="" class="big-icon"/>
</div>
<h3>design a solution</h3>
<p>Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat.</p>
</div>
<div class="w-col w-col-4">
<div class="grey-icon-wrapper push-top">
<img src="https://assets.website-files.com/530ab3ac7b5bc4ca19000b96/530b7778b9b97cdf3e0008be_icon-chart.png" width="127" alt="" class="big-icon"/>
</div>
<h3>track the progress</h3>
<p>Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.</p>
</div>
</div>
</div>
</div>

1029
how-it-works.md Normal file

File diff suppressed because it is too large Load Diff

110
layouts/css/default.css Normal file
View File

@ -0,0 +1,110 @@
/* Default Theme for qsgen3 */
body {
font-family: sans-serif;
line-height: 1.6;
margin: 20px auto;
padding: 0 20px;
max-width: 800px;
background-color: #fdfdfd;
color: #333;
}
header {
background-color: #eee;
padding: 1em 0;
margin-bottom: 2em;
text-align: center;
}
header h1 a {
color: #333;
text-decoration: none;
}
header .tagline {
color: #555;
font-size: 0.9em;
}
nav ul {
list-style-type: none;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
margin-right: 15px;
}
nav ul li a {
text-decoration: none;
color: #007bff;
}
nav ul li a:hover {
text-decoration: underline;
}
article header {
background-color: transparent;
padding: 0;
margin-bottom: 1em;
text-align: left;
}
h1, h2, h3, h4, h5, h6 {
color: #333;
margin-top: 1.5em;
margin-bottom: 0.5em;
}
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
img {
max-width: 100%;
height: auto;
}
pre {
background-color: #f0f0f0;
padding: 15px;
overflow-x: auto;
border-radius: 4px;
}
code {
font-family: monospace;
background-color: #f0f0f0;
padding: 0.2em 0.4em;
border-radius: 3px;
}
pre code {
padding: 0;
background-color: transparent;
}
blockquote {
border-left: 4px solid #ccc;
padding-left: 15px;
margin-left: 0;
font-style: italic;
color: #555;
}
footer {
text-align: center;
margin-top: 3em;
padding-top: 1em;
border-top: 1px solid #eee;
font-size: 0.9em;
color: #777;
}

47
layouts/index.html Normal file
View File

@ -0,0 +1,47 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>$site_name$ - $site_tagline$</title>
$for(css)$
<link rel="stylesheet" href="$css$">
$endfor$
$if(site_rss_url)$
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="$site_rss_url$">
$endif$
</head>
<body>
<header>
<h1><a href="$site_url$">$site_name$</a></h1>
<p>$site_tagline$</p>
</header>
<main>
<section id="posts-list">
<h2>Latest Posts</h2>
$if(posts)$
<ul>
$for(posts)$
<li>
<h3><a href="$posts.url$">$posts.title$</a></h3>
$if(posts.date)$
<p class="date">$posts.date$</p>
$endif$
$if(posts.summary)$
<p>$posts.summary$</p>
$endif$
</li>
$endfor$
</ul>
$else$
<p>No posts found.</p>
$endif$
</section>
</main>
<footer>
<p>&copy; $current_year$ $site_name$. Generated by qsgen3.</p>
</footer>
</body>
</html>

32
layouts/page.html Normal file
View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>$site_name$ - $title$</title>
<meta name="description" content="$description$"> <!-- Add description to frontmatter -->
<link rel="stylesheet" href="/static/css/style.css"> <!-- Assuming site served from root -->
$for(css)$
<link rel="stylesheet" href="$css$">
$endfor$
$if(math)$ $math$ $endif$
</head>
<body>
<header>
<h1><a href="/">$site_name$</a></h1>
<p>$site_tagline$</p>
</header>
<main>
<article>
<header>
<h1>$title$</h1>
</header>
$body$
</article>
</main>
<footer>
<p>&copy; $current_year$ $site_name$. Generated by qsgen3.</p>
<p><a href="$site_url$">$site_url$</a></p>
</footer>
</body>
</html>

39
layouts/post.html Normal file
View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>$site_name$ - $title$</title>
<meta name="author" content="$author$">
<meta name="description" content="$description$"> <!-- Add description to frontmatter -->
$if(date)$<meta name="date" content="$date$">$endif$
$for(css)$
<link rel="stylesheet" href="$css$">
$endfor$
$if(math)$ $math$ $endif$
</head>
<body>
<header>
<h1><a href="/">$site_name$</a></h1>
<p>$site_tagline$</p>
</header>
<main>
<article>
<header>
<h1>$title$</h1>
$if(author)$
<p class="author">By: $author$</p>
$endif$
$if(date)$
<p class="date">Published: $date$</p>
$endif$
</header>
$body$
</article>
</main>
<footer>
<p>&copy; $current_year$ $site_name$. Generated by qsgen3. </p>
<p><a href="$site_url$">$site_url$</a></p>
</footer>
</body>
</html>

24
layouts/rss.xml Normal file
View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>$site_name$</title>
<link>$site_url$</link>
<description>$site_tagline$</description>
<language>en-us</language>
<lastBuildDate>$rfc_2822_date$</lastBuildDate>
<atom:link href="$site_url$/rss.xml" rel="self" type="application/rss+xml" />
$if(posts)$
$for(posts)$
<item>
<title>$it.post_title$</title>
<link>$it.post_url$</link>
<pubDate>$it.post_rfc_2822_date$</pubDate>
<guid isPermaLink="true">$it.post_url$</guid>
<description><![CDATA[$it.post_summary$]]></description>
</item>
$endfor$
$endif$
</channel>
</rss>

110
output/css/theme.css Normal file
View File

@ -0,0 +1,110 @@
/* Default Theme for qsgen3 */
body {
font-family: sans-serif;
line-height: 1.6;
margin: 20px auto;
padding: 0 20px;
max-width: 800px;
background-color: #fdfdfd;
color: #333;
}
header {
background-color: #eee;
padding: 1em 0;
margin-bottom: 2em;
text-align: center;
}
header h1 a {
color: #333;
text-decoration: none;
}
header .tagline {
color: #555;
font-size: 0.9em;
}
nav ul {
list-style-type: none;
padding: 0;
text-align: center;
}
nav ul li {
display: inline;
margin-right: 15px;
}
nav ul li a {
text-decoration: none;
color: #007bff;
}
nav ul li a:hover {
text-decoration: underline;
}
article header {
background-color: transparent;
padding: 0;
margin-bottom: 1em;
text-align: left;
}
h1, h2, h3, h4, h5, h6 {
color: #333;
margin-top: 1.5em;
margin-bottom: 0.5em;
}
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
img {
max-width: 100%;
height: auto;
}
pre {
background-color: #f0f0f0;
padding: 15px;
overflow-x: auto;
border-radius: 4px;
}
code {
font-family: monospace;
background-color: #f0f0f0;
padding: 0.2em 0.4em;
border-radius: 3px;
}
pre code {
padding: 0;
background-color: transparent;
}
blockquote {
border-left: 4px solid #ccc;
padding-left: 15px;
margin-left: 0;
font-style: italic;
color: #555;
}
footer {
text-align: center;
margin-top: 3em;
padding-top: 1em;
border-top: 1px solid #eee;
font-size: 0.9em;
color: #777;
}

34
output/index.html Normal file
View File

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Awesome Site - A brief description of my site</title>
<link rel="stylesheet" href="/static/css/minimaltemplate-v1.css">
</head>
<body>
<header>
<h1><a href="http://localhost:8000">My Awesome Site</a></h1>
<p>A brief description of my site</p>
</header>
<main>
<section id="posts-list">
<h2>Latest Posts</h2>
<ul>
<li>
<h3><a href="http://localhost:8000/posts/hello-world.html">Hello,
World!</a></h3>
<p class="date">2024-05-30</p>
<p>My first
post using the qsgen3 static site generator.</p>
</li>
</ul>
</section>
</main>
<footer>
<p>&copy; 2025 My Awesome Site. Generated by qsgen3.</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Awesome Site - Hello, World!</title>
<meta name="author" content="qsgen3">
<meta name="description" content=""> <!-- Add description to frontmatter -->
<meta name="date" content="2024-05-30">
<link rel="stylesheet" href="/static/css/minimaltemplate-v1.css">
</head>
<body>
<header>
<h1><a href="/">My Awesome Site</a></h1>
<p>A brief description of my site</p>
</header>
<main>
<article>
<header>
<h1>Hello, World!</h1>
<p class="author">By: qsgen3</p>
<p class="date">Published: 2024-05-30</p>
</header>
<p>Welcome to qsgen3!</p>
<p>This is your first post. You can edit it or delete it and
start writing your own content.</p>
<h2 id="markdown-features">Markdown Features</h2>
<p>Qsgen3 supports standard Markdown features,
including:</p>
<ul>
<li>Headings</li>
<li><strong>Bold</strong> and <em>italic</em> text</li>
<li>Lists:
<ul>
<li>Unordered</li>
<li>Ordered</li>
</ul></li>
<li><a href="https://example.com">Links</a></li>
<li><code>Inline code</code></li>
</ul>
<div class="sourceCode" id="cb1"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Code blocks</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;Hello from a code block!&quot;</span></span></code></pre></div>
<p>Enjoy creating your site!</p>
</article>
</main>
<footer>
<p>&copy; 2025 My Awesome Site. Generated by qsgen3. </p>
<p><a href="http://localhost:8000">http://localhost:8000</a></p>
</footer>
</body>
</html>

21
output/rss.xml Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>My Awesome Site</title>
<link>http://localhost:8000</link>
<description>A brief description of my site</description>
<language>en-us</language>
<lastBuildDate></lastBuildDate>
<atom:link href="http://localhost:8000/rss.xml" rel="self" type="application/rss+xml" />
<item>
<title>Hello, World!</title>
<link>http://localhost:8000/posts/hello-world.html</link>
<pubDate></pubDate>
<guid isPermaLink="true">http://localhost:8000/posts/hello-world.html</guid>
<description><![CDATA[My first post using the qsgen3 static site
generator.]]></description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,131 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>#sitename - Blog</title>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="Webflow" name="generator"/>
<link href="/css/minimaltemplate-v1.css" rel="stylesheet" type="text/css"/>
<script src="/css/webfont.js" type="text/javascript">
</script>
<script type="text/javascript">WebFont.load({ google: { families: ["Vollkorn:400,400italic,700,700italic","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Oswald:200,300,400,500,600,700"] }});</script>
<script type="text/javascript">
!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);
</script>
<link href="/images/el-vikingo-ti.png" rel="shortcut icon" type="image/png"/>
<link href="/images/el-vikingo-ti.png" rel="apple-touch-icon"/>
</head>
<body>
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="w-container">
<a href="/" class="brand-block w-clearfix w-nav-brand">
<img src="/images/el-vikingo-ti.png" width="65" alt="" class="logo-img"/>
<h1 class="logo-title">#sitename</h1>
</a>
<nav role="navigation" class="nav-menu w-nav-menu">
<a href="/" class="nav-link w-nav-link">Inicio</a>
<a href="/sobre.html" class="nav-link w-nav-link">Sobre El Vikingo TI</a>
<a href="/servicios.html" class="nav-link w-nav-link">Que Hago</a>
<a href="/contacto.html" class="nav-link w-nav-link">Contáctame</a>
<a href="/blog/" class="nav-link w-nav-link">Blog</a>
</nav>
<div class="menu-button w-nav-button">
<div class="w-icon-nav-menu">
</div>
</div>
</div>
</div>
<div class="header">
<div class="w-container">
<h1 class="main-heading">Blog</h1>
<div class="divider">
</div>
<div class="main-subtitle">#tagline</div>
</div>
</div>
<div class="about-section">
<div class="w-container">
<p>&nbsp;</p>
<!-- Header End -->
<!-- Body Start -->
BODY
<!-- Body End -->
<!-- Begin Footer Template -->
</div>
</div>
</div>
<div id="contact" class="section contact">
<div class="w-container">
<h2>Ponte en contacto conmigo</h2>
<div class="divider grey">
</div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="icon-wrapper">
<img src="/images/map-icon.png" width="44" alt=""/>
</div>
<h3>Lo que hago</h3>
<p class="contact-text">
Elegir a El Vikingo TI significa<br/>
optar por la tranquilidad, la profesionalidad<br/>
y una calidad de transmisión inigualable.
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/mail-icon.png" width="70" alt=""/>
</div>
<h3>La manera tradicional</h3>
<p class="contact-text">Correo Electronico<br/>
<a href="/contacto.html" class="link">Envíeme un mensaje</a>
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/heart-icon.png" width="68" alt=""/>
</div>
<h3>Redes Sociales</h3>
<a href="#" class="social-wrapper contact-text w-inline-block w-clearfix">
<img src="/images/facebook-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Facebook</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/twitter-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Twitter</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/linkdin-icon-black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">LinkedIn</div></a>
</div>
</div>
</div>
</div>
<footer id="footer" class="newsection footer">
<img src="/images/el-vikingo-ti.png" width="43" alt="El Vikingo TI Logo" class="footer-logo"/>
<p class="footer-text">
#updated
</p>
</div>
</footer>
<script src="/css/jquery-3.5.1.js" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="/css/webflow.js" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,17 @@
<!-- Blog Post for Index Start -->
<!-- <div id="process" class="section"> -->
<div class="w-container">
<h3><a class="link" href="BLOGURL">BLOGTITLE</a></h3>
<div class="grow-row w-row">
INGRESS
</div>
<div class="grow-row w-row">
<strong style="font-size: 10px; padding-top: 3px;">BLOGDATE</strong>
</div>
<div class="divider grey"></div>
</div>
<!-- </div> -->
<!-- Blog Post for Index End -->

125
output/static/blogs.tpl Normal file
View File

@ -0,0 +1,125 @@
<html>
<head>
<meta charset="utf-8"/>
<title>#sitename - BLOGTITLE</title>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<link href="/css/minimaltemplate-v1.css" rel="stylesheet" type="text/css"/>
<script src="/css/webfont.js" type="text/javascript">
</script>
<script type="text/javascript">
WebFont.load({ google: { families: ["Vollkorn:400,400italic,700,700italic","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Oswald:200,300,400,500,600,700"] }});</script>
<script type="text/javascript">
!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
<link href="/images/el-vikingo-ti.png" rel="shortcut icon" type="image/png"/>
<link href="/images/el-vikingo-ti.png" rel="apple-touch-icon"/>
</head>
<body>
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="w-container">
<a href="/" class="brand-block w-clearfix w-nav-brand">
<img src="/images/el-vikingo-ti.png" width="65" alt="" class="logo-img"/>
<h1 class="logo-title">#sitename</h1>
</a>
<nav role="navigation" class="nav-menu w-nav-menu">
<a href="/blog/" class="nav-link w-nav-link">← Al Blog</a>
</nav>
<div class="menu-button w-nav-button">
<div class="w-icon-nav-menu">
</div>
</div>
</div>
</div>
<div class="header project-page">
<div class="w-container">
<h1 class="main-heading">BLOGTITLE</h1>
<div class="divider">
</div>
<div class="main-subtitle">
CALADAY - CALNDAY - CALMONTH - CALYEAR
</div>
</div>
</div>
<!-- Blog Post Start -->
<div class="about-section">
<div class="w-container">
<div id="process" class="section ingress">
<div class="w-container">
INGRESS
<div class="divider grey"></div>
<div class="grow-row w-row">
BODY
</div>
</div>
</div>
</div>
<!-- Blog Post End -->
</div>
<div id="contact" class="section contact">
<div class="w-container">
<h2>Ponte en contacto conmigo</h2>
<div class="divider grey">
</div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="icon-wrapper">
<img src="/images/map-icon.png" width="44" alt=""/>
</div>
<h3>Lo que hago</h3>
<p class="contact-text">
Elegir a El Vikingo TI significa<br/>
optar por la tranquilidad, la profesionalidad<br/>
y una calidad de transmisión inigualable.
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/mail-icon.png" width="70" alt=""/>
</div>
<h3>La manera tradicional</h3>
<p class="contact-text">Correo Electronico<br/>
<a href="/contacto.html" class="link">Envíeme un mensaje</a>
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/heart-icon.png" width="68" alt=""/>
</div>
<h3>Redes Sociales</h3>
<a href="#" class="social-wrapper contact-text w-inline-block w-clearfix">
<img src="/images/facebook-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Facebook</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/twitter-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Twitter</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/linkdin-icon-black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">LinkedIn</div></a>
</div>
</div>
</div>
</div>
<footer id="footer" class="newsection footer">
<img src="/images/el-vikingo-ti.png" width="43" alt="El Vikingo TI Logo" class="footer-logo"/>
<p class="footer-text">
#updated
</p>
</div>
</footer>
<script src="/css/jquery-3.5.1.js" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="/css/webflow.js" type="text/javascript"></script>
</body>
</html>

2
output/static/css/jquery-3.5.1.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,33 @@
/*
* Copyright 2016 Small Batch, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
/* Web Font Loader v1.6.26 - (c) Adobe Systems, Google. License: Apache 2.0 */(function(){function aa(a,b,c){return a.call.apply(a.bind,arguments)}function ba(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}function p(a,b,c){p=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?aa:ba;return p.apply(null,arguments)}var q=Date.now||function(){return+new Date};function ca(a,b){this.a=a;this.m=b||a;this.c=this.m.document}var da=!!window.FontFace;function t(a,b,c,d){b=a.c.createElement(b);if(c)for(var e in c)c.hasOwnProperty(e)&&("style"==e?b.style.cssText=c[e]:b.setAttribute(e,c[e]));d&&b.appendChild(a.c.createTextNode(d));return b}function u(a,b,c){a=a.c.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(c,a.lastChild)}function v(a){a.parentNode&&a.parentNode.removeChild(a)}
function w(a,b,c){b=b||[];c=c||[];for(var d=a.className.split(/\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<d.length;g+=1)if(b[e]===d[g]){f=!0;break}f||d.push(b[e])}b=[];for(e=0;e<d.length;e+=1){f=!1;for(g=0;g<c.length;g+=1)if(d[e]===c[g]){f=!0;break}f||b.push(d[e])}a.className=b.join(" ").replace(/\s+/g," ").replace(/^\s+|\s+$/,"")}function y(a,b){for(var c=a.className.split(/\s+/),d=0,e=c.length;d<e;d++)if(c[d]==b)return!0;return!1}
function z(a){if("string"===typeof a.f)return a.f;var b=a.m.location.protocol;"about:"==b&&(b=a.a.location.protocol);return"https:"==b?"https:":"http:"}function ea(a){return a.m.location.hostname||a.a.location.hostname}
function A(a,b,c){function d(){k&&e&&f&&(k(g),k=null)}b=t(a,"link",{rel:"stylesheet",href:b,media:"all"});var e=!1,f=!0,g=null,k=c||null;da?(b.onload=function(){e=!0;d()},b.onerror=function(){e=!0;g=Error("Stylesheet failed to load");d()}):setTimeout(function(){e=!0;d()},0);u(a,"head",b)}
function B(a,b,c,d){var e=a.c.getElementsByTagName("head")[0];if(e){var f=t(a,"script",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(g=!0,c&&c(null),f.onload=f.onreadystatechange=null,"HEAD"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,c&&c(Error("Script load timeout")))},d||5E3);return f}return null};function C(){this.a=0;this.c=null}function D(a){a.a++;return function(){a.a--;E(a)}}function F(a,b){a.c=b;E(a)}function E(a){0==a.a&&a.c&&(a.c(),a.c=null)};function G(a){this.a=a||"-"}G.prototype.c=function(a){for(var b=[],c=0;c<arguments.length;c++)b.push(arguments[c].replace(/[\W_]+/g,"").toLowerCase());return b.join(this.a)};function H(a,b){this.c=a;this.f=4;this.a="n";var c=(b||"n4").match(/^([nio])([1-9])$/i);c&&(this.a=c[1],this.f=parseInt(c[2],10))}function fa(a){return I(a)+" "+(a.f+"00")+" 300px "+J(a.c)}function J(a){var b=[];a=a.split(/,\s*/);for(var c=0;c<a.length;c++){var d=a[c].replace(/['"]/g,"");-1!=d.indexOf(" ")||/^\d/.test(d)?b.push("'"+d+"'"):b.push(d)}return b.join(",")}function K(a){return a.a+a.f}function I(a){var b="normal";"o"===a.a?b="oblique":"i"===a.a&&(b="italic");return b}
function ga(a){var b=4,c="n",d=null;a&&((d=a.match(/(normal|oblique|italic)/i))&&d[1]&&(c=d[1].substr(0,1).toLowerCase()),(d=a.match(/([1-9]00|normal|bold)/i))&&d[1]&&(/bold/i.test(d[1])?b=7:/[1-9]00/.test(d[1])&&(b=parseInt(d[1].substr(0,1),10))));return c+b};function ha(a,b){this.c=a;this.f=a.m.document.documentElement;this.h=b;this.a=new G("-");this.j=!1!==b.events;this.g=!1!==b.classes}function ia(a){a.g&&w(a.f,[a.a.c("wf","loading")]);L(a,"loading")}function M(a){if(a.g){var b=y(a.f,a.a.c("wf","active")),c=[],d=[a.a.c("wf","loading")];b||c.push(a.a.c("wf","inactive"));w(a.f,c,d)}L(a,"inactive")}function L(a,b,c){if(a.j&&a.h[b])if(c)a.h[b](c.c,K(c));else a.h[b]()};function ja(){this.c={}}function ka(a,b,c){var d=[],e;for(e in b)if(b.hasOwnProperty(e)){var f=a.c[e];f&&d.push(f(b[e],c))}return d};function N(a,b){this.c=a;this.f=b;this.a=t(this.c,"span",{"aria-hidden":"true"},this.f)}function O(a){u(a.c,"body",a.a)}function P(a){return"display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:"+J(a.c)+";"+("font-style:"+I(a)+";font-weight:"+(a.f+"00")+";")};function Q(a,b,c,d,e,f){this.g=a;this.j=b;this.a=d;this.c=c;this.f=e||3E3;this.h=f||void 0}Q.prototype.start=function(){var a=this.c.m.document,b=this,c=q(),d=new Promise(function(d,e){function k(){q()-c>=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(k,25)},function(){e()})}k()}),e=new Promise(function(a,d){setTimeout(d,b.f)});Promise.race([e,d]).then(function(){b.g(b.a)},function(){b.j(b.a)})};function R(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.o=this.j=this.h=this.g=null;this.g=new N(this.c,this.s);this.h=new N(this.c,this.s);this.j=new N(this.c,this.s);this.o=new N(this.c,this.s);a=new H(this.a.c+",serif",K(this.a));a=P(a);this.g.a.style.cssText=a;a=new H(this.a.c+",sans-serif",K(this.a));a=P(a);this.h.a.style.cssText=a;a=new H("serif",K(this.a));a=P(a);this.j.a.style.cssText=a;a=new H("sans-serif",K(this.a));a=
P(a);this.o.a.style.cssText=a;O(this.g);O(this.h);O(this.j);O(this.o)}var S={D:"serif",C:"sans-serif"},T=null;function U(){if(null===T){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);T=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return T}R.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.o.a.offsetWidth;this.A=q();la(this)};
function ma(a,b,c){for(var d in S)if(S.hasOwnProperty(d)&&b===a.f[S[d]]&&c===a.f[S[d]])return!0;return!1}function la(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f["sans-serif"])||(d=U()&&ma(a,b,c));d?q()-a.A>=a.w?U()&&ma(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):na(a):V(a,a.v)}function na(a){setTimeout(p(function(){la(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.o.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.o=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,K(a).toString(),"active")],[b.a.c("wf",a.c,K(a).toString(),"loading"),b.a.c("wf",a.c,K(a).toString(),"inactive")]);L(b,"fontactive",a);this.o=!0;oa(this)};
W.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c("wf",a.c,K(a).toString(),"active")),d=[],e=[b.a.c("wf",a.c,K(a).toString(),"loading")];c||d.push(b.a.c("wf",a.c,K(a).toString(),"inactive"));w(b.f,d,e)}L(b,"fontinactive",a);oa(this)};function oa(a){0==--a.f&&a.j&&(a.o?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),L(a,"active")):M(a.a))};function pa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}pa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;qa(this,new ha(this.c,a),a)};
function ra(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,k=d||null||{};if(0===c.length&&f)M(b.a);else{b.f+=c.length;f&&(b.j=f);var h,m=[];for(h=0;h<c.length;h++){var l=c[h],n=k[l.c],r=b.a,x=l;r.g&&w(r.f,[r.a.c("wf",x.c,K(x).toString(),"loading")]);L(r,"fontloading",x);r=null;null===X&&(X=window.FontFace?(x=/Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent))?42<parseInt(x[1],10):!0:!1);X?r=new Q(p(b.g,b),p(b.h,b),b.c,l,b.s,n):r=new R(p(b.g,b),p(b.h,b),b.c,l,b.s,a,
n);m.push(r)}for(h=0;h<m.length;h++)m[h].start()}},0)}function qa(a,b,c){var d=[],e=c.timeout;ia(b);var d=ka(a.a,c,a.c),f=new W(a.c,b,e);a.h=d.length;b=0;for(c=d.length;b<c;b++)d[b].load(function(b,d,c){ra(a,f,b,d,c)})};function sa(a,b){this.c=a;this.a=b}function ta(a,b,c){var d=z(a.c);a=(a.a.api||"fast.fonts.net/jsapi").replace(/^.*http(s?):(\/\/)?/,"");return d+"//"+a+"/"+b+".js"+(c?"?v="+c:"")}
sa.prototype.load=function(a){function b(){if(f["__mti_fntLst"+d]){var c=f["__mti_fntLst"+d](),e=[],h;if(c)for(var m=0;m<c.length;m++){var l=c[m].fontfamily;void 0!=c[m].fontStyle&&void 0!=c[m].fontWeight?(h=c[m].fontStyle+c[m].fontWeight,e.push(new H(l,h))):e.push(new H(l))}a(e)}else setTimeout(function(){b()},50)}var c=this,d=c.a.projectId,e=c.a.version;if(d){var f=c.c.m;B(this.c,ta(c,d,e),function(e){e?a([]):(f["__MonotypeConfiguration__"+d]=function(){return c.a},b())}).id="__MonotypeAPIScript__"+
d}else a([])};function ua(a,b){this.c=a;this.a=b}ua.prototype.load=function(a){var b,c,d=this.a.urls||[],e=this.a.families||[],f=this.a.testStrings||{},g=new C;b=0;for(c=d.length;b<c;b++)A(this.c,d[b],D(g));var k=[];b=0;for(c=e.length;b<c;b++)if(d=e[b].split(":"),d[1])for(var h=d[1].split(","),m=0;m<h.length;m+=1)k.push(new H(d[0],h[m]));else k.push(new H(d[0]));F(g,function(){a(k,f)})};function va(a,b,c){a?this.c=a:this.c=b+wa;this.a=[];this.f=[];this.g=c||""}var wa="//fonts.googleapis.com/css";function xa(a,b){for(var c=b.length,d=0;d<c;d++){var e=b[d].split(":");3==e.length&&a.f.push(e.pop());var f="";2==e.length&&""!=e[1]&&(f=":");a.a.push(e.join(f))}}
function ya(a){if(0==a.a.length)throw Error("No fonts to load!");if(-1!=a.c.indexOf("kit="))return a.c;for(var b=a.a.length,c=[],d=0;d<b;d++)c.push(a.a[d].replace(/ /g,"+"));b=a.c+"?family="+c.join("%7C");0<a.f.length&&(b+="&subset="+a.f.join(","));0<a.g.length&&(b+="&text="+encodeURIComponent(a.g));return b};function za(a){this.f=a;this.a=[];this.c={}}
var Aa={latin:"BESbswy","latin-ext":"\u00e7\u00f6\u00fc\u011f\u015f",cyrillic:"\u0439\u044f\u0416",greek:"\u03b1\u03b2\u03a3",khmer:"\u1780\u1781\u1782",Hanuman:"\u1780\u1781\u1782"},Ba={thin:"1",extralight:"2","extra-light":"2",ultralight:"2","ultra-light":"2",light:"3",regular:"4",book:"4",medium:"5","semi-bold":"6",semibold:"6","demi-bold":"6",demibold:"6",bold:"7","extra-bold":"8",extrabold:"8","ultra-bold":"8",ultrabold:"8",black:"9",heavy:"9",l:"3",r:"4",b:"7"},Ca={i:"i",italic:"i",n:"n",normal:"n"},
Da=/^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/;
function Ea(a){for(var b=a.f.length,c=0;c<b;c++){var d=a.f[c].split(":"),e=d[0].replace(/\+/g," "),f=["n4"];if(2<=d.length){var g;var k=d[1];g=[];if(k)for(var k=k.split(","),h=k.length,m=0;m<h;m++){var l;l=k[m];if(l.match(/^[\w-]+$/)){var n=Da.exec(l.toLowerCase());if(null==n)l="";else{l=n[2];l=null==l||""==l?"n":Ca[l];n=n[1];if(null==n||""==n)n="4";else var r=Ba[n],n=r?r:isNaN(n)?"4":n.substr(0,1);l=[l,n].join("")}}else l="";l&&g.push(l)}0<g.length&&(f=g);3==d.length&&(d=d[2],g=[],d=d?d.split(","):
g,0<d.length&&(d=Aa[d[0]])&&(a.c[e]=d))}a.c[e]||(d=Aa[e])&&(a.c[e]=d);for(d=0;d<f.length;d+=1)a.a.push(new H(e,f[d]))}};function Fa(a,b){this.c=a;this.a=b}var Ga={Arimo:!0,Cousine:!0,Tinos:!0};Fa.prototype.load=function(a){var b=new C,c=this.c,d=new va(this.a.api,z(c),this.a.text),e=this.a.families;xa(d,e);var f=new za(e);Ea(f);A(c,ya(d),D(b));F(b,function(){a(f.a,f.c,Ga)})};function Ha(a,b){this.c=a;this.a=b}Ha.prototype.load=function(a){var b=this.a.id,c=this.c.m;b?B(this.c,(this.a.api||"https://use.typekit.net")+"/"+b+".js",function(b){if(b)a([]);else if(c.Typekit&&c.Typekit.config&&c.Typekit.config.fn){b=c.Typekit.config.fn;for(var e=[],f=0;f<b.length;f+=2)for(var g=b[f],k=b[f+1],h=0;h<k.length;h++)e.push(new H(g,k[h]));try{c.Typekit.load({events:!1,classes:!1,async:!0})}catch(m){}a(e)}},2E3):a([])};function Ia(a,b){this.c=a;this.f=b;this.a=[]}Ia.prototype.load=function(a){var b=this.f.id,c=this.c.m,d=this;b?(c.__webfontfontdeckmodule__||(c.__webfontfontdeckmodule__={}),c.__webfontfontdeckmodule__[b]=function(b,c){for(var g=0,k=c.fonts.length;g<k;++g){var h=c.fonts[g];d.a.push(new H(h.name,ga("font-weight:"+h.weight+";font-style:"+h.style)))}a(d.a)},B(this.c,z(this.c)+(this.f.api||"//f.fontdeck.com/s/css/js/")+ea(this.c)+"/"+b+".js",function(b){b&&a([])})):a([])};var Y=new pa(window);Y.a.c.custom=function(a,b){return new ua(b,a)};Y.a.c.fontdeck=function(a,b){return new Ia(b,a)};Y.a.c.monotype=function(a,b){return new sa(b,a)};Y.a.c.typekit=function(a,b){return new Ha(b,a)};Y.a.c.google=function(a,b){return new Fa(b,a)};var Z={load:p(Y.load,Y)};"function"===typeof define&&define.amd?define(function(){return Z}):"undefined"!==typeof module&&module.exports?module.exports=Z:(window.WebFont=Z,window.WebFontConfig&&Y.load(window.WebFontConfig));}());

127
output/static/pages.tpl Normal file
View File

@ -0,0 +1,127 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>#sitename - #pagetitle</title>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="Webflow" name="generator"/>
<link href="/css/minimaltemplate-v1.css" rel="stylesheet" type="text/css"/>
<script src="/css/webfont.js" type="text/javascript">
</script>
<script type="text/javascript">WebFont.load({ google: { families: ["Vollkorn:400,400italic,700,700italic","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Oswald:200,300,400,500,600,700"] }});</script>
<script type="text/javascript">
!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);
</script>
<link href="/images/el-vikingo-ti.png" rel="shortcut icon" type="image/png"/>
<link href="/images/el-vikingo-ti.png" rel="apple-touch-icon"/>
</head>
<body>
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="w-container">
<a href="/" class="brand-block w-clearfix w-nav-brand">
<img src="/images/el-vikingo-ti.png" width="65" alt="" class="logo-img"/>
<h1 class="logo-title">#sitename</h1>
</a>
<nav role="navigation" class="nav-menu w-nav-menu">
<a href="/" class="nav-link w-nav-link">Inicio</a>
<a href="/sobre.html" class="nav-link w-nav-link">Sobre #sitename</a>
<a href="/servicios.html" class="nav-link w-nav-link">Que Hago</a>
<a href="/contacto.html" class="nav-link w-nav-link">Contáctame</a>
<a href="/blog/" class="nav-link w-nav-link">Blog</a>
</nav>
<div class="menu-button w-nav-button">
<div class="w-icon-nav-menu">
</div>
</div>
</div>
</div>
<div class="header">
<div class="w-container">
<h1 class="main-heading">#pagetitle</h1>
<div class="divider">
</div>
<div class="main-subtitle">#tagline</div>
</div>
</div>
<div class="about-section">
<div class="w-container">
<!-- Header End -->
<!-- Body Start -->
BODY
<!-- Body End -->
<!-- Begin Footer Template -->
</div>
<div id="contact" class="section contact">
<div class="w-container">
<h2>Ponte en contacto conmigo</h2>
<div class="divider grey">
</div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="icon-wrapper">
<img src="/images/map-icon.png" width="44" alt=""/>
</div>
<h3>Lo que hago</h3>
<p class="contact-text">
Elegir a El Vikingo TI significa<br/>
optar por la tranquilidad, la profesionalidad<br/>
y una calidad de transmisión inigualable.
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/mail-icon.png" width="70" alt=""/>
</div>
<h3>La manera tradicional</h3>
<p class="contact-text">Correo Electronico<br/>
<a href="/contacto.html" class="link">Envíeme un mensaje</a>
</p>
</div>
<div class="w-col w-col-4">
<div class="icon-wrapper _2">
<img src="/images/heart-icon.png" width="68" alt=""/>
</div>
<h3>Redes Sociales</h3>
<a href="#" class="social-wrapper contact-text w-inline-block w-clearfix">
<img src="/images/facebook-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Facebook</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/twitter-icon_black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">Twitter</div></a>
<a href="#" class="social-wrapper contact-text w-inline-block">
<img src="/images/linkdin-icon-black.svg" width="14" alt="" class="social-icon"/>
<div class="social-link-text">LinkedIn</div></a>
</div>
</div>
</div>
</div>
<footer id="footer" class="newsection footer">
<img src="/images/el-vikingo-ti.png" width="43" alt="El Vikingo TI Logo" class="footer-logo"/>
<p class="footer-text">
#updated
</p>
</div>
</footer>
<script src="/css/jquery-3.5.1.js" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="/css/webflow.js" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,29 @@
<div id="process" class="section">
<div class="w-container">
<h2>How we make brands thrive</h2>
<div class="divider grey"></div>
<div class="w-row">
<div class="w-col w-col-4">
<div class="grey-icon-wrapper">
<img src="https://assets.website-files.com/530ab3ac7b5bc4ca19000b96/530b7763b9b97cdf3e0008b9_icon-target.png" width="127" alt="" class="big-icon"/>
</div>
<h3>SET a target</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.</p>
</div>
<div class="w-col w-col-4">
<div class="grey-icon-wrapper push-top">
<img src="https://assets.website-files.com/530ab3ac7b5bc4ca19000b96/530b7772b9b97cdf3e0008bc_icon-design.png" width="127" alt="" class="big-icon"/>
</div>
<h3>design a solution</h3>
<p>Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat.</p>
</div>
<div class="w-col w-col-4">
<div class="grey-icon-wrapper push-top">
<img src="https://assets.website-files.com/530ab3ac7b5bc4ca19000b96/530b7778b9b97cdf3e0008be_icon-chart.png" width="127" alt="" class="big-icon"/>
</div>
<h3>track the progress</h3>
<p>Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.</p>
</div>
</div>
</div>
</div>

19
site.conf Normal file
View File

@ -0,0 +1,19 @@
# Site Configuration for qsgen3
# --- Site Metadata ---
site_name="My Awesome Site"
site_tagline="A brief description of my site"
site_url="http://localhost:8000"
site_theme="minimal"
site_theme_css_file="css/minimaltemplate-v1.css"
# --- Paths ---
paths_content_dir="content"
paths_output_dir="output"
paths_layouts_dir="layouts"
paths_static_dir="static"
# --- Build Options ---
build_options_generate_rss=true
build_options_generate_sitemap=true
build_options_process_drafts=false

View File

@ -1,26 +1,26 @@
; Place this file in your project directory
# Example Site Configuration for qsgen3
# Copy this file to 'site.conf' in your project root and customize it.
[site]
; This is the name of your site
name = "The Site Name"
; This is the tagline
tagline = "The Site Tagline"
; This is the URL of your site
url = "https://www.example.com"
; This is where your HTML files go
root = /path/to/www/dir
; The theme of your site
theme = theme_name
; sitemap or not: true or false
sitemap = true
; Do you want the blog to appear on the front page
; true = yes and false = no
blog = true
# --- Site Metadata ---
site_name="My Example Site"
site_tagline="An example site generated by qsgen3"
site_url="http://localhost:8000" # Or your actual production URL
site_theme="default" # Specifies the theme to use (e.g., default, dark)
[project]
; This is where you work before you generate the output
root = /path/to/working/project
; Languages: en_US, en_UK, es_ES, nb_NO, fr_FR
lang = en_US
; Use QStags (native) or Markdown (markdown)
generator = native
# --- Paths (relative to project root) ---
paths_content_dir="content"
paths_output_dir="output"
paths_layouts_dir="layouts"
paths_static_dir="static"
# --- Build Options ---
# Generate an RSS feed (true/false)
build_options_generate_rss=true
# Generate a sitemap.xml (true/false)
# Note: sitemap generation is not fully implemented in qsgen3 yet,
# but the configuration option is reserved.
build_options_generate_sitemap=true
# Process draft posts/pages (true/false)
build_options_process_drafts=false

31
static/css/style.css Normal file
View File

@ -0,0 +1,31 @@
/* Basic styling - feel free to replace */
body {
font-family: sans-serif;
line-height: 1.6;
margin: 20px;
background-color: #f4f4f4;
color: #333;
}
header h1 a {
color: #333;
text-decoration: none;
}
header p {
font-style: italic;
color: #666;
}
main {
background-color: #fff;
padding: 20px;
border-radius: 5px;
}
footer {
text-align: center;
margin-top: 20px;
font-size: 0.9em;
color: #777;
}