Merge pull request #2 from dignajar/master

Merge
This commit is contained in:
clickwork-git 2015-09-23 01:36:09 +02:00
commit 7f1410cd30
17 changed files with 348 additions and 140 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

View File

@ -8,6 +8,8 @@
<title><?php echo $layout['title'] ?></title>
<link rel="shortcut icon" type="image/x-icon" href="./css/favicon.png">
<link rel="stylesheet" type="text/css" href="./css/kube.min.css?version=<?php echo BLUDIT_VERSION ?>">
<link rel="stylesheet" type="text/css" href="./css/default.css?version=<?php echo BLUDIT_VERSION ?>">
<link rel="stylesheet" type="text/css" href="./css/jquery.datetimepicker.css?version=<?php echo BLUDIT_VERSION ?>">

View File

@ -152,10 +152,13 @@ define('HTML_PATH_THEME_JS', HTML_PATH_THEME.'js/');
define('HTML_PATH_THEME_IMG', HTML_PATH_THEME.'img/');
define('HTML_PATH_ADMIN_THEME', HTML_PATH_ROOT.'admin/themes/'.$Site->adminTheme().'/');
define('HTML_PATH_ADMIN_THEME_JS', HTML_PATH_ADMIN_THEME.'js/');
define('HTML_PATH_ADMIN_ROOT', HTML_PATH_ROOT.'admin/');
define('HTML_PATH_UPLOADS', HTML_PATH_ROOT.'content/uploads/');
define('HTML_PATH_PLUGINS', HTML_PATH_ROOT.'plugins/');
define('JQUERY', HTML_PATH_ADMIN_THEME_JS.'jquery.min.js');
// PHP paths with dependency
define('PATH_THEME', PATH_ROOT.'themes/'.$Site->theme().'/');
define('PATH_THEME_PHP', PATH_THEME.'php'.DS);

View File

@ -30,26 +30,21 @@ function build_page($key)
global $dbUsers;
global $Parsedown;
// Page object.
// Page object, content from FILE.
$Page = new Page($key);
if( !$Page->isValid() ) {
return false;
}
// Page database.
// Page database, content from DATABASE JSON.
$db = $dbPages->getDb($key);
if( !$db ) {
return false;
}
// Foreach field from database.
foreach($db as $field=>$value)
{
// Not overwrite the value from file.
$Page->setField($field, $value, false);
// Overwrite the value on the db.
//$dbPages->setDb($key, $field, $value);
// Foreach field from DATABASE.
foreach($db as $field=>$value) {
$Page->setField($field, $value);
}
// Content in raw format

View File

@ -34,25 +34,23 @@ function buildPost($key)
global $Parsedown;
global $Site;
// Post object, this get the content from the file.
// Post object, content from FILE.
$Post = new Post($key);
if( !$Post->isValid() ) {
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying build the post from file with key: '.$key);
return false;
}
// Page database, this get the contente from the database json.
// Post database, content from DATABASE JSON.
$db = $dbPosts->getDb($key);
if( !$db ) {
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying build the post from database with key: '.$key);
return false;
}
// Foreach field from database.
foreach($db as $field=>$value)
{
// Not overwrite the value from file.
$Post->setField($field, $value, false);
// Foreach field from DATABASE.
foreach($db as $field=>$value) {
$Post->setField($field, $value);
}
// Content in raw format
@ -119,7 +117,9 @@ function buildPostsForPage($pageNumber=0, $amount=POSTS_PER_PAGE_ADMIN, $removeU
// Search for changes on posts by the user.
if( $Site->cliMode() ) {
$dbPosts->regenerateCli();
if($dbPosts->regenerateCli()) {
reIndexTagsPosts();
}
}
// Execute the scheduler.

View File

@ -335,6 +335,7 @@ class dbPages extends dbJSON
$fields['status'] = CLI_STATUS;
$fields['date'] = Date::current(DB_DATE_FORMAT);
$fields['username'] = 'admin';
//$tmpPaths = glob(PATH_PAGES.'*', GLOB_ONLYDIR);
$tmpPaths = Filesystem::listDirectories(PATH_PAGES);
@ -372,13 +373,27 @@ class dbPages extends dbJSON
// Update all fields from FILE to DATABASE.
foreach($fields as $f=>$v)
{
if($Page->getField($f)) {
// DEBUG: Validar/Sanitizar valores, ej: validar formato fecha
$this->db[$key][$f] = $Page->getField($f);
}
}
// If the field exists on the FILE, update it.
if($Page->getField($f))
{
$valueFromFile = $Page->getField($f);
// DEBUG: Update tags
if($f=='tags') {
// Generate tags array.
$this->db[$key]['tags'] = $this->generateTags($valueFromFile);
}
elseif($f=='date') {
// Validate Date from file
if(Valid::date($valueFromFile, DB_DATE_FORMAT)) {
$this->db[$key]['date'] = $valueFromFile;
}
}
else {
// Sanitize the values from file.
$this->db[$key][$f] = Sanitize::html($valueFromFile);
}
}
}
}
// Remove old pages from db

View File

@ -378,13 +378,15 @@ class dbPosts extends dbJSON
return $a['date']<$b['date'];
}
// Return TRUE if there are new posts, FALSE otherwise.
public function regenerateCli()
{
$db = $this->db;
$newPaths = array();
$allPosts = array();
$fields = array();
$currentDate = Date::current(DB_DATE_FORMAT);
// Default fields and value
// Generate default fields and values.
foreach($this->dbFields as $field=>$options) {
if(!$options['inFile']) {
$fields[$field] = $options['value'];
@ -392,55 +394,63 @@ class dbPosts extends dbJSON
}
$fields['status'] = CLI_STATUS;
$fields['date'] = Date::current(DB_DATE_FORMAT);
$fields['date'] = $currentDate;
$fields['username'] = 'admin';
// Recovery pages from the first level of directories
//$tmpPaths = glob(PATH_POSTS.'*', GLOB_ONLYDIR);
// Recovery posts from the first level of directories
$tmpPaths = Filesystem::listDirectories(PATH_POSTS);
foreach($tmpPaths as $directory)
{
if(file_exists($directory.DS.'index.txt'))
{
// The key is the directory name.
$key = basename($directory);
if(file_exists($directory.DS.'index.txt')) {
// The key is the directory name
$newPaths[$key] = true;
}
}
// All keys posts
$allPosts[$key] = true;
foreach($newPaths as $key=>$value)
{
// Create the new entry if not exists on DATABASE.
if(!isset($this->db[$key])) {
// New entry on database
$this->db[$key] = $fields;
}
// Create the post from FILE.
$Post = new Post($key);
// Update all fields from FILE to DATABASE.
foreach($fields as $f=>$v)
{
if($Post->getField($f)) {
// If the field exists on the FILE, update it.
if($Post->getField($f))
{
$valueFromFile = $Post->getField($f);
// Validate values from file.
if($f=='tags') {
$valueFromFile = array_map('trim', explode(',', $valueFromFile));
$valueFromFile = implode(',', $valueFromFile);
// Generate tags array.
$this->db[$key]['tags'] = $this->generateTags($valueFromFile);
}
elseif($f=='date') {
if(!Valid::date($valueFromFile,DB_DATE_FORMAT)) {
$valueFromFile = Date::current(DB_DATE_FORMAT);
}
}
// Validate Date from file
if(Valid::date($valueFromFile, DB_DATE_FORMAT)) {
$this->db[$key]['date'] = $valueFromFile;
if( $valueFromFile>$currentDate ) {
$this->db[$key]['status'] = 'scheduled';
}
}
}
else {
// Sanitize the values from file.
$this->db[$key][$f] = Sanitize::html($valueFromFile);
}
}
}
}
}
// Remove old posts from db
foreach( array_diff_key($db, $newPaths) as $key=>$data ) {
// Remove orphan posts from db, the orphan posts are posts deleted by hand (directory deleted).
foreach( array_diff_key($db, $allPosts) as $key=>$data ) {
unset($this->db[$key]);
}

View File

@ -3,6 +3,8 @@
class Filesystem {
// NEW
// Returns an array with the absolutes directories.
public static function listDirectories($path, $regex='*')
{
$directories = glob($path.$regex, GLOB_ONLYDIR);

View File

@ -4,6 +4,17 @@ class Theme {
// NEW
public static function favicon($file='favicon.png', $path=HTML_PATH_THEME_IMG, $echo=true)
{
$tmp = '<link rel="shortcut icon" href="'.$path.$file.'" type="image/x-icon">'.PHP_EOL;
if($echo) {
echo $tmp;
}
return $tmp;
}
public static function css($files, $path=HTML_PATH_THEME_CSS, $echo=true)
{
if(!is_array($files)) {
@ -109,6 +120,16 @@ class Theme {
}
}
public static function jquery($echo=true)
{
$tmp = '<script src="'.JQUERY.'"></script>'.PHP_EOL;
if($echo) {
echo $tmp;
}
return $tmp;
}
// OLD
@ -120,17 +141,8 @@ class Theme {
return BLOG_URL;
}
public static function jquery($path=JS_JQUERY)
{
$tmp = '<script src="'.$path.'"></script>'.PHP_EOL;
return $tmp;
}
public static function favicon()
{
return '<link rel="shortcut icon" href="'.HTML_THEME_CSS.'img/favicon.ico" type="image/x-icon">'.PHP_EOL;
}
public static function name()
{

View File

@ -64,6 +64,10 @@ class Page extends fileContent
return $tags;
}
else {
if($tags==false) {
return false;
}
// Return string with tags separeted by comma.
return implode(', ', $tags);
}

View File

@ -126,6 +126,10 @@ class Post extends fileContent
return $tags;
}
else {
if($tags==false) {
return false;
}
// Return string with tags separeted by comma.
return implode(', ', $tags);
}

View File

@ -162,5 +162,6 @@
"you-can-schedule-the-post-just-select-the-date-and-time": "You can schedule the post, just select the date and time.",
"scheduled": "Scheduled",
"publish": "Publish",
"please-check-your-theme-configuration": "Please check your theme configuration."
"please-check-your-theme-configuration": "Please check your theme configuration.",
"plugin-label": "Plugin label"
}

159
languages/pt_BR.json Normal file
View File

@ -0,0 +1,159 @@
{
"language-data":
{
"native": "Português (Brasil)",
"english-name": "Portuguese",
"last-update": "2015-09-21",
"author": "Hackdorte",
"email": "hackdorte@sapo.pt",
"website": "https://twitter.com/hackdorte"
},
"username": "Nome de usuário",
"password": "Senha",
"confirm-password": "Confirmar senha",
"editor": "Editor",
"dashboard": "Painel",
"role": "Cargo",
"post": "Postagem",
"posts": "Postagens",
"users": "Usuários",
"administrator": "Administrador",
"add": "Adicionar",
"cancel": "Cancelar",
"content": "Conteúdo",
"title": "Título",
"no-parent": "Sem parente",
"edit-page": "Editar página",
"edit-post": "Editar postagem",
"add-a-new-user": "Adicionar novo usuário",
"parent": "Parente",
"friendly-url": "URL amigável",
"description": "Descrição",
"posted-by": "Publicado por",
"tags": "Tags",
"position": "Posição",
"save": "Salvar",
"draft": "Rascunho",
"delete": "Deletar",
"registered": "Registrado",
"Notifications": "Notificações",
"profile": "Perfil",
"email": "Email",
"settings": "Configurações",
"general": "Geral",
"advanced": "Avançado",
"regional": "Regional",
"about": "Sobre",
"login": "Entrar",
"logout": "Sair",
"manage": "Administrar",
"themes": "Temas",
"prev-page": "Pág. anterior",
"next-page": "Pág. seguinte",
"configure-plugin": "Configurar plugin",
"confirm-delete-this-action-cannot-be-undone": "Confirmar exclusão. Esta operação não poderá ser desfeita.",
"site-title": "Título do site",
"site-slogan": "Slogan do site",
"site-description": "Descrição do site",
"footer-text": "Texto do rodapé",
"posts-per-page": "Postagens por páginas",
"site-url": "URL do site",
"writting-settings": "Configurações de escrita",
"url-filters": "Filtros para URL",
"page": "página",
"pages": "páginas",
"home": "Início",
"welcome-back": "Bem vindo(a)",
"language": "Idioma",
"website": "Website",
"timezone": "Zona horária",
"locale": "Codificação",
"new-post": "Nova postagem",
"new-page": "Nova página",
"html-and-markdown-code-supported": "Códigos HTML e Markdown são aceitos",
"manage-posts": "Gerenciar postagens",
"published-date": "Data de publicação",
"modified-date": "Data de modificação",
"empty-title": "Título vazio",
"plugins": "Plugins",
"install-plugin": "Instalar plugin",
"uninstall-plugin": "Desinstalar plugin",
"new-password": "Nova senha",
"edit-user": "Editar usuário",
"publish-now": "Publicar",
"first-name": "Nome",
"last-name": "Sobrenome",
"bludit-version": "Bludit versão",
"powered-by": "Feito com",
"recent-posts": "Postagens recentes",
"manage-pages": "Gerenciar páginas",
"advanced-options": "Opções avançadas",
"user-deleted": "Usuário Deletado",
"page-added-successfully": "Página criada com sucesso",
"post-added-successfully": "Postagem criada com sucesso ",
"the-post-has-been-deleted-successfully": "Postagem eliminada com sucesso",
"the-page-has-been-deleted-successfully": "Página deletada com sucesso",
"username-or-password-incorrect": "Nome ou senha incorretos",
"database-regenerated": "Base de dados regenerada",
"the-changes-have-been-saved": "As alterações foram salvas!",
"enable-more-features-at": "Habilitar mais funções em",
"username-already-exists": "Usuário não existe",
"username-field-is-empty": "O campo **Nome** não pode ficar vazio.",
"the-password-and-confirmation-password-do-not-match": "Ops! As senhas são diferentes.",
"user-has-been-added-successfully": "Usuário criado com sucesso",
"you-do-not-have-sufficient-permissions": "Você não tem permissão. Por favor entre em contato com o administrador do site",
"settings-advanced-writting-settings": "Configurações->Avançado->Configurações de escrita",
"new-posts-and-pages-synchronized": "Novas postagens e páginas sincronizadas.",
"you-can-choose-the-users-privilege": "Pode alterar os previlégios dos usuários. O editor só poderá gerenciar páginas e postagens.",
"email-will-not-be-publicly-displayed": "O endereço de email não é visível. Recomendado para recuperar sua senha e receber notificações.",
"use-this-field-to-name-your-site": "Utilize este campo para adicionar um título para seu site, ele aparecerá na parte superior das páginas.",
"use-this-field-to-add-a-catchy-phrase": "Utilize este campo se desejar adicionar um slogan ao nome do seu site.",
"you-can-add-a-site-description-to-provide": "Pode adicionar um descrição para promover uma biografia do seu site.",
"you-can-add-a-small-text-on-the-bottom": "Pode adicionar um pequeno texto no final da página. ex: copyright, autor, etc.",
"number-of-posts-to-show-per-page": "Número de postagens para mostrar por página.",
"the-url-of-your-site": "URL do seu site.",
"add-or-edit-description-tags-or": "Adicionar ou editar a descrição, tags e alterar URL amigável.",
"select-your-sites-language": "Selecione o idioma padrão do seu site.",
"select-a-timezone-for-a-correct": "Selecione a zona horária correta do seu país.",
"you-can-use-this-field-to-define-a-set-of": "Use este campo para o correto conjunto de idioma, país e preferências especiais.",
"you-can-modify-the-url-which-identifies": "Pode alterar a URL para facilitar a sua localização de forma legível. Em 150 caractéres.",
"this-field-can-help-describe-the-content": "Resumo do conteúdo da postagem. Em 150 caractéres.",
"write-the-tags-separeted-by-comma": "Criar tags separadas por vírgulas. ex: tag1, tag2, tag3",
"delete-the-user-and-all-its-posts": "Eliminar usuário e suas postagens",
"delete-the-user-and-associate-its-posts-to-admin-user": "Eliminar usuário e associar postagens ao administrador",
"read-more": "Ler mais",
"show-blog": "Ver blog",
"default-home-page": "página de início padrão",
"version": "Versão",
"there-are-no-drafts": "Não há rascunhos",
"create-a-new-article-for-your-blog":"Criar um novo artigo para seu blog.",
"create-a-new-page-for-your-website":"Criar nova página para seu site.",
"invite-a-friend-to-collaborate-on-your-website":"Convidar amigos para colaborar com seu site.",
"change-your-language-and-region-settings":"Modificar as configurações de idioma e região.",
"language-and-timezone":"Idioma e zona horária",
"author": "Autor",
"start-here": "Começe aqui",
"install-theme": "Instalar tema",
"first-post": "Primeira postagem",
"congratulations-you-have-successfully-installed-your-bludit": "Parabéns, você instalou **Bludit** com sucesso",
"whats-next": "Siguientes pasos",
"manage-your-bludit-from-the-admin-panel": "Gerencie seu Bludit em [painel de administração](./admin/)",
"follow-bludit-on": "Siga Bludit em",
"visit-the-support-forum": "Visite o [fórum](http://forum.bludit.com) para obter ajuda",
"read-the-documentation-for-more-information": "Leia a [documentación](http://docs.bludit.com) para mais informações",
"share-with-your-friends-and-enjoy": "Compartilhe com os seus amigos para que desfrutem também",
"the-page-has-not-been-found": "A página não foi localizada.",
"error": "Erro",
"bludit-installer": "Instalador do Bludit",
"welcome-to-the-bludit-installer": "Bem vindo(a) ao instalador do Bludit",
"complete-the-form-choose-a-password-for-the-username-admin": "Crie uma senha e informe um endereço de email para o usuário « admin »",
"password-visible-field": "Senha, este campo é visível.",
"install": "Instalar",
"the-password-field-is-empty": "Preencha o campo da senha",
"your-email-address-is-invalid":"O endereço do email é inválido",
"proceed-anyway": "Continuar assim mesmo!",
"drafts":"Rascunhos",
"ip-address-has-been-blocked":"O endereço de IP foi bloqueado.",
"try-again-in-a-few-minutes": "Volte e tente daqui uns minutinhos!"
}

View File

@ -15,7 +15,7 @@ class pluginPages extends Plugin {
global $Language;
$html = '<div>';
$html .= '<label>Plugin label</label>';
$html .= '<label>'.$Language->get('Plugin label').'</label>';
$html .= '<input name="label" id="jslabel" type="text" value="'.$this->getDbField('label').'">';
$html .= '</div>';
@ -32,51 +32,48 @@ class pluginPages extends Plugin {
global $Language;
global $pagesParents;
global $Site, $Url;
$home = $Url->whereAmI()==='home';
$html = '<div class="plugin plugin-pages">';
// Print the label if it not empty.
// Print the label if not empty.
$label = $this->getDbField('label');
if( !empty($label) ) {
$html .= '<h2>'.$label.'</h2>';
}
$html .= '<div class="plugin-content">';
$parents = $pagesParents[NO_PARENT_CHAR];
$html .= '<ul>';
// Show home link ?
if($this->getDbField('homeLink')) {
$current = ($Site->homeLink()==$home) ? ' class="active"' : '';
$html .= '<li' .$current. '><a class="parent" href="'.$Site->homeLink().'">'.$Language->get('Home').'</a></li>';
$html .= '<li>';
$html .= '<a class="parent'.( ($Url->whereAmI()=='home')?' active':'').'" href="'.$Site->homeLink().'">'.$Language->get('Home').'</a>';
$html .= '</li>';
}
$parents = $pagesParents[NO_PARENT_CHAR];
foreach($parents as $parent)
{
//if($Site->homepage()!==$parent->key())
{
$current_parent = ($parent->slug()==$Url->slug()) ? ' class="active"' : '';
// Print the parent
$html .= '<li' .$current_parent. '><a class="parent" href="'.$parent->permalink().'">'.$parent->title().'</a>';
$html .= '<li>';
$html .= '<a class="parent '.( ($parent->key()==$Url->slug())?' active':'').'" href="'.$parent->permalink().'">'.$parent->title().'</a>';
// Check if the parent has children
if(isset($pagesParents[$parent->key()]))
{
$children = $pagesParents[$parent->key()];
// Print the children
// Print children
$html .= '<ul>';
foreach($children as $child)
{
$current_child = ($child->slug()==$Url->slug()) ? ' class="active"' : '';
$html .= '<li' .$current_child. '><a class="children" href="'.$child->permalink().'">'.$child->title().'</a></li>';
$html .= '<li>';
$html .= '<a class="children '.( ($child->key()==$Url->slug())?' active':'').'" href="'.$child->permalink().'">'.$child->title().'</a>';
$html .= '</li>';
}
$html .= '</ul>';
}
}
}
$html .= '</li></ul>';
$html .= '</div>';

View File

@ -54,6 +54,10 @@ pre, code {
white-space: pre-wrap !important;
}
blockquote {
border-left: 10px solid #f0f2f4;
padding-left: 10px;
}
/* ------------------------
Content / Main
@ -139,15 +143,20 @@ margin: 0;
.post-title a
{
color: #555;
border-bottom: 5px solid #ccc;
display: inline-block;
}
.page a.read-more,
.post a.read-more{
display: block;
text-align: center;
padding: 2px 5px;
border: 1px solid #ccc;
display: inline-block;
margin-top: 10px;
padding: 2px 20px;
}
.page a.read-more:hover,
.post a.read-more:hover{
background: #f1f1f1;
}
@ -268,9 +277,6 @@ div.plugin-content li {
margin-top: 5px;
}
div.plugin-content ul li.active a {
color: #2672ec;
}
div.plugin-content ul {
display: block;
list-style-type: none;
@ -292,6 +298,11 @@ div.plugin-content ul > li > ul > li > a {
color: #777;
}
div.plugin-content a.active {
color: #2672ec !important;
}
/* ------------------------
Responsive
------------------------ */

View File

@ -3,7 +3,7 @@
<head>
<!-- Meta tags -->
<?php include('php/head.php') ?>
<?php include(PATH_THEME_PHP.'head.php') ?>
</head>
<body>
@ -16,7 +16,7 @@
<!-- Sidebar -->
<div class="sidebar pure-u-1 pure-u-md-1-4">
<?php include('php/sidebar.php') ?>
<?php include(PATH_THEME_PHP.'sidebar.php') ?>
</div>
<!-- Main -->
@ -26,15 +26,15 @@
<?php
if( ($Url->whereAmI()=='home') || ($Url->whereAmI()=='tag') )
{
include('php/home.php');
include(PATH_THEME_PHP.'home.php');
}
elseif($Url->whereAmI()=='post')
{
include('php/post.php');
include(PATH_THEME_PHP.'post.php');
}
elseif($Url->whereAmI()=='page')
{
include('php/page.php');
include(PATH_THEME_PHP.'page.php');
}
?>

View File

@ -1,13 +1,23 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="<?php echo $Site->description() ?>">
<title><?php echo $Site->title() ?></title>
<?php
Theme::charset('UTF-8');
// CSS from theme/css/
Theme::css(array(
'pure-min.css',
'grids-responsive-min.css',
'blog.css',
'rainbow.github.css'
));
Theme::viewport();
// Javascript from theme/js/
Theme::javascript('rainbow.min.js');
// <title>Site title</title>
Theme::title( $Site->title() );
// <meta name="description" content="Site description">
Theme::description( $Site->description() );
// Favicon from theme/img/
Theme::favicon('favicon.png');
// <meta name="keywords" content="HTML,CSS,XML,JavaScript">
if( $Url->whereAmI()=='post' ) {
@ -16,34 +26,17 @@
elseif( $Url->whereAmI()=='page' ) {
Theme::keywords( $Page->tags() );
}
// <link rel="stylesheet" type="text/css" href="pure-min.css">
// <link rel="stylesheet" type="text/css" href="grids-responsive-min.css">
// <link rel="stylesheet" type="text/css" href="blog.css">
// <link rel="stylesheet" type="text/css" href="rainbow.github.css">
Theme::css(array(
'pure-min.css',
'grids-responsive-min.css',
'blog.css',
'rainbow.github.css'
));
Theme::css(array(
'http://fonts.googleapis.com/css?family=Open+Sans:400,300,600&subset=latin,cyrillic-ext,greek-ext,greek,vietnamese,cyrillic,latin-ext'
), '');
// <script src="rainbow.min.js"></script>
Theme::javascript(array(
'rainbow.min.js'
));
?>
<!-- Custom Fonts -->
<link href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600&subset=latin,cyrillic-ext,greek-ext,greek,vietnamese,cyrillic,latin-ext" rel="stylesheet" type="text/css">
<!-- Pure and Google Fonts -->
<style>
html, button, input, select, textarea,
.pure-g [class *= "pure-u"] {
html, button, input, select, textarea,
.pure-g [class *= "pure-u"] {
font-family: 'Open Sans', sans-serif;
}
}
</style>
<!-- Plugins Site Head -->