Exemple #1
0
    def __init__(self, p_percorso_tema: str):
        """
        Inizializza la classe passandogli subito i parametri generali
        da utilizzare per creare le pagine (roba come il nome del sito,
        il disclaimer da scrivere in ogni piè di pagina, ...)

        Args:
            p_percorso_tema (str):
                Percorso alla cartella che contiene i layout e gli asset
                per renderizzare le pagine e gli articoli con il tema

        Returns:
            None
        """

        self._preferenze_sito = Preferenze()

        # Carica le eventuali preferenze del tema
        percorso_config = os.path.join(p_percorso_tema, "_config.yml")
        try:
            # Carica (o perlomeno tenta) il file delle preferenze _config.yml
            self._preferenze_tema = Preferenze(percorso_config)
        except FilePreferenzeNonTrovato:
            # Non esiste un file _config.yml con le preferenze del tema
            # Usa quelle di default
            self._preferenze_tema = Preferenze()

        # Chiama in causa Jinja2 e gli spiega da quale
        # cartella dovrà tirarsi su i template/layout da utilizzare
        # per creare le pagine HTML
        self.jinja2 = Environment(
            loader=FileSystemLoader(p_percorso_tema),
            trim_blocks=True)
Exemple #2
0
class Pagina:
    """
    Questa classe gestisce una pagina
    """
    def __init__(self, p_file):
        self.meta = Preferenze()
        self.contenuto = ""
        self.importa(p_file)

    def importa(self, p_file):
        with open(p_file) as f:
            leggi_yaml = False
            parte_yaml = ""
            parte_testo = ""
            for riga in f:
                if riga[:3] == "---" and riga[-1:] == "\n":
                    leggi_yaml = not leggi_yaml
                else:
                    if leggi_yaml:
                        parte_yaml += riga
                    else:
                        parte_testo += riga
            f.close()

        self.meta.importa_da_testo(parte_yaml)
        self.contenuto = markdown2.markdown(parte_testo)
        try:
            # Se l'articolo / pagina ha una proprietà "title" da usare..
            titolo = self.meta.title
            self.meta.url = self.decidi_url(titolo)
        except TagNonTrovato:
            # Altrimenti come nome usa quello del file senza estensione
            nome, estensione = os.path.splitext(os.path.basename(p_file))
            self.meta.url = self.decidi_url(nome)

    @staticmethod
    def decidi_url(p_nome):
        # Rimuove tutte le accentate e le sostituisce con caratteri ASCII
        nfkd_form = unicodedata.normalize('NFKD', p_nome)
        temp = u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
        # Sostituisce gli spazi e altri caratteri con delle lineette
        temp = temp.lower().replace(chr(32), "-") \
            .replace(".", "-").replace(",", "-") \
            .replace(";", "-").replace(":", "-") \
            .replace("'", "-").replace(chr(34), "-")
        # Elimina i casi in cui ci sono due o tre lineette di seguito
        temp = temp.replace("---", "-").replace("--", "-")
        # Restituisce la stringa modificata
        return temp

    def __str__(self) -> str:
        temp = "FILE: {0}\n".format(self.url)
        temp += str(self.meta)
        temp += self.meta.content
        return temp
Exemple #3
0
    def render(self,
               p_pagina: Pagina,
               p_layout_default: str = "default") -> str:
        """
        Crea un file HTML a partire da un template/layout
        indicato ed utilizzando i parametri globali e
        quelli passati dall'utente.

        Args:
            p_pagina (Pagine):
                Un'istanza della classe Pagina che conterrà la pagina da convertire
            p_layout_default (String):
                Se non viene indicato nelle preferenze di una pagina,
                per il rendering utilizza questo layout

        Returns (String):
            Una stringa contenente il codice HTML della pagina
            appena costruita dal metodo
        """

        # Decide quale layout deve utilizzare
        # per fare il rendering della pagina
        try:
            # La pagina in questione ha nella parte YAML
            # un parametro "layout" che specifica come
            # l'utente vuole renderizzarla ?
            layout = p_pagina.meta.layout
        except TagNonTrovato:
            # No. Allora decide il programma per l'utente.
            layout = p_layout_default

        # PATCH DA RIMUOVERE
        layout = "default"

        # Fa caricare il template in memoria a Jinja2
        try:
            template = self.jinja2.get_template(layout + ".html")
        except TemplateNotFound:
            template = self.jinja2.get_template(p_layout_default + ".html")

        # Prepara il dizionario con i parametri da passare a Jinja2,
        # unendo quelli globali del sito a quelli del tema ed
        # aggiunge quelli della pagina che sta renderizzando
        preferenze = Preferenze()
        preferenze["site"] = self._preferenze_sito.esporta()
        preferenze["theme"] = self._preferenze_tema.esporta()
        preferenze["page"] = p_pagina.meta.esporta()
        preferenze["page"]["content"] = p_pagina.contenuto
        preferenze["content"] = preferenze["page"]["content"]

        # Renderizza la pagina e la restituisce
        return template.render(preferenze.esporta())
Exemple #4
0
    def render(self, p_pagina: Pagina, p_layout_default: str = "default") -> str:
        """
        Crea un file HTML a partire da un template/layout
        indicato ed utilizzando i parametri globali e
        quelli passati dall'utente.

        Args:
            p_pagina (Pagine):
                Un'istanza della classe Pagina che conterrà la pagina da convertire
            p_layout_default (String):
                Se non viene indicato nelle preferenze di una pagina,
                per il rendering utilizza questo layout

        Returns (String):
            Una stringa contenente il codice HTML della pagina
            appena costruita dal metodo
        """

        # Decide quale layout deve utilizzare
        # per fare il rendering della pagina
        try:
            # La pagina in questione ha nella parte YAML
            # un parametro "layout" che specifica come
            # l'utente vuole renderizzarla ?
            layout = p_pagina.meta.layout
        except TagNonTrovato:
            # No. Allora decide il programma per l'utente.
            layout = p_layout_default

        # PATCH DA RIMUOVERE
        layout = "default"

        # Fa caricare il template in memoria a Jinja2
        try:
            template = self.jinja2.get_template(layout + ".html")
        except TemplateNotFound:
            template = self.jinja2.get_template(p_layout_default + ".html")

        # Prepara il dizionario con i parametri da passare a Jinja2,
        # unendo quelli globali del sito a quelli del tema ed
        # aggiunge quelli della pagina che sta renderizzando
        preferenze = Preferenze()
        preferenze["site"] = self._preferenze_sito.esporta()
        preferenze["theme"] = self._preferenze_tema.esporta()
        preferenze["page"] = p_pagina.meta.esporta()
        preferenze["page"]["content"] = p_pagina.contenuto
        preferenze["content"] = preferenze["page"]["content"]

        # Renderizza la pagina e la restituisce
        return template.render(preferenze.esporta())
Exemple #5
0
    def __init__(self, p_percorso):
        self.basedir = p_percorso

        # Carica le preferenze del sito
        preferenze = Preferenze(os.path.join(self.basedir, "_config.yml"))

        # Carica le pagine da convertire
        self.lista = Pagine(os.path.join(self.basedir, "_pages"))

        # Carica il tema da utilizzare
        try:
            nome_tema = preferenze.theme
        except TagNonTrovato:
            nome_tema = "default"

        percorso_cartella_temi = os.path.join(self.basedir, "_themes")

        if not os.path.exists(percorso_cartella_temi):
            os.mkdir(percorso_cartella_temi)

        percorso_tema = os.path.join(percorso_cartella_temi, nome_tema)

        if not os.path.exists(percorso_tema):
            os.mkdir(percorso_tema)

        self.tema = Tema(percorso_tema)
        self.tema.set_preferenze_sito(preferenze)
Exemple #6
0
    def _carica_preferenze(self):
        """
        Verifica se esiste un file delle preferenze nella cartella indicata
        Se esiste, lo carica

        Returns:
            None
        """
        file_preferenze = os.path.join(self._percorso, "_config.yml")
        if os.path.exists(file_preferenze):
            self._preferenze = Preferenze(file_preferenze)
Exemple #7
0
    def __init__(self, p_percorso_tema: str):
        """
        Inizializza la classe passandogli subito i parametri generali
        da utilizzare per creare le pagine (roba come il nome del sito,
        il disclaimer da scrivere in ogni piè di pagina, ...)

        Args:
            p_percorso_tema (str):
                Percorso alla cartella che contiene i layout e gli asset
                per renderizzare le pagine e gli articoli con il tema

        Returns:
            None
        """

        self._preferenze_sito = Preferenze()

        # Carica le eventuali preferenze del tema
        percorso_config = os.path.join(p_percorso_tema, "_config.yml")
        try:
            # Carica (o perlomeno tenta) il file delle preferenze _config.yml
            self._preferenze_tema = Preferenze(percorso_config)
        except FilePreferenzeNonTrovato:
            # Non esiste un file _config.yml con le preferenze del tema
            # Usa quelle di default
            self._preferenze_tema = Preferenze()

        # Chiama in causa Jinja2 e gli spiega da quale
        # cartella dovrà tirarsi su i template/layout da utilizzare
        # per creare le pagine HTML
        self.jinja2 = Environment(loader=FileSystemLoader(p_percorso_tema),
                                  trim_blocks=True)
Exemple #8
0
    def __init__(self, p_percorso: str, p_crea_se_inesistente=True):
        """
        Costruttore della classe

        Args:
            p_percorso: Percorso alla cartella contenente le pagine (_pages)
        """

        self._percorso = p_percorso

        # Controlla se nel caso deve creare la cartella per le pagine
        if p_crea_se_inesistente:
            # Crea la cartella delle pagine se non esiste già
            if not os.path.exists(self._percorso):
                os.mkdir(self._percorso)

        self._preferenze = Preferenze()
        self._elenco = []
        self._carica_preferenze()
        self._carica_tutti()
Exemple #9
0
class Tema:
    """
    Questa classe fa da wrapper a Jinja2 e consente di
    creare dei file HTML a partire da un template in formato HTML e dei
    parametri passati sotto forma di dizionario/oggetto
    """
    def __init__(self, p_percorso_tema: str):
        """
        Inizializza la classe passandogli subito i parametri generali
        da utilizzare per creare le pagine (roba come il nome del sito,
        il disclaimer da scrivere in ogni piè di pagina, ...)

        Args:
            p_percorso_tema (str):
                Percorso alla cartella che contiene i layout e gli asset
                per renderizzare le pagine e gli articoli con il tema

        Returns:
            None
        """

        self._preferenze_sito = Preferenze()

        # Carica le eventuali preferenze del tema
        percorso_config = os.path.join(p_percorso_tema, "_config.yml")
        try:
            # Carica (o perlomeno tenta) il file delle preferenze _config.yml
            self._preferenze_tema = Preferenze(percorso_config)
        except FilePreferenzeNonTrovato:
            # Non esiste un file _config.yml con le preferenze del tema
            # Usa quelle di default
            self._preferenze_tema = Preferenze()

        # Chiama in causa Jinja2 e gli spiega da quale
        # cartella dovrà tirarsi su i template/layout da utilizzare
        # per creare le pagine HTML
        self.jinja2 = Environment(loader=FileSystemLoader(p_percorso_tema),
                                  trim_blocks=True)

    def set_preferenze_sito(self, p_preferenze):
        self._preferenze_sito = p_preferenze

    def render(self,
               p_pagina: Pagina,
               p_layout_default: str = "default") -> str:
        """
        Crea un file HTML a partire da un template/layout
        indicato ed utilizzando i parametri globali e
        quelli passati dall'utente.

        Args:
            p_pagina (Pagine):
                Un'istanza della classe Pagina che conterrà la pagina da convertire
            p_layout_default (String):
                Se non viene indicato nelle preferenze di una pagina,
                per il rendering utilizza questo layout

        Returns (String):
            Una stringa contenente il codice HTML della pagina
            appena costruita dal metodo
        """

        # Decide quale layout deve utilizzare
        # per fare il rendering della pagina
        try:
            # La pagina in questione ha nella parte YAML
            # un parametro "layout" che specifica come
            # l'utente vuole renderizzarla ?
            layout = p_pagina.meta.layout
        except TagNonTrovato:
            # No. Allora decide il programma per l'utente.
            layout = p_layout_default

        # PATCH DA RIMUOVERE
        layout = "default"

        # Fa caricare il template in memoria a Jinja2
        try:
            template = self.jinja2.get_template(layout + ".html")
        except TemplateNotFound:
            template = self.jinja2.get_template(p_layout_default + ".html")

        # Prepara il dizionario con i parametri da passare a Jinja2,
        # unendo quelli globali del sito a quelli del tema ed
        # aggiunge quelli della pagina che sta renderizzando
        preferenze = Preferenze()
        preferenze["site"] = self._preferenze_sito.esporta()
        preferenze["theme"] = self._preferenze_tema.esporta()
        preferenze["page"] = p_pagina.meta.esporta()
        preferenze["page"]["content"] = p_pagina.contenuto
        preferenze["content"] = preferenze["page"]["content"]

        # Renderizza la pagina e la restituisce
        return template.render(preferenze.esporta())
Exemple #10
0
 def __init__(self, p_file):
     self.meta = Preferenze()
     self.contenuto = ""
     self.importa(p_file)
Exemple #11
0
class Tema:
    """
    Questa classe fa da wrapper a Jinja2 e consente di
    creare dei file HTML a partire da un template in formato HTML e dei
    parametri passati sotto forma di dizionario/oggetto
    """

    def __init__(self, p_percorso_tema: str):
        """
        Inizializza la classe passandogli subito i parametri generali
        da utilizzare per creare le pagine (roba come il nome del sito,
        il disclaimer da scrivere in ogni piè di pagina, ...)

        Args:
            p_percorso_tema (str):
                Percorso alla cartella che contiene i layout e gli asset
                per renderizzare le pagine e gli articoli con il tema

        Returns:
            None
        """

        self._preferenze_sito = Preferenze()

        # Carica le eventuali preferenze del tema
        percorso_config = os.path.join(p_percorso_tema, "_config.yml")
        try:
            # Carica (o perlomeno tenta) il file delle preferenze _config.yml
            self._preferenze_tema = Preferenze(percorso_config)
        except FilePreferenzeNonTrovato:
            # Non esiste un file _config.yml con le preferenze del tema
            # Usa quelle di default
            self._preferenze_tema = Preferenze()

        # Chiama in causa Jinja2 e gli spiega da quale
        # cartella dovrà tirarsi su i template/layout da utilizzare
        # per creare le pagine HTML
        self.jinja2 = Environment(
            loader=FileSystemLoader(p_percorso_tema),
            trim_blocks=True)

    def set_preferenze_sito(self, p_preferenze):
        self._preferenze_sito = p_preferenze

    def render(self, p_pagina: Pagina, p_layout_default: str = "default") -> str:
        """
        Crea un file HTML a partire da un template/layout
        indicato ed utilizzando i parametri globali e
        quelli passati dall'utente.

        Args:
            p_pagina (Pagine):
                Un'istanza della classe Pagina che conterrà la pagina da convertire
            p_layout_default (String):
                Se non viene indicato nelle preferenze di una pagina,
                per il rendering utilizza questo layout

        Returns (String):
            Una stringa contenente il codice HTML della pagina
            appena costruita dal metodo
        """

        # Decide quale layout deve utilizzare
        # per fare il rendering della pagina
        try:
            # La pagina in questione ha nella parte YAML
            # un parametro "layout" che specifica come
            # l'utente vuole renderizzarla ?
            layout = p_pagina.meta.layout
        except TagNonTrovato:
            # No. Allora decide il programma per l'utente.
            layout = p_layout_default

        # PATCH DA RIMUOVERE
        layout = "default"

        # Fa caricare il template in memoria a Jinja2
        try:
            template = self.jinja2.get_template(layout + ".html")
        except TemplateNotFound:
            template = self.jinja2.get_template(p_layout_default + ".html")

        # Prepara il dizionario con i parametri da passare a Jinja2,
        # unendo quelli globali del sito a quelli del tema ed
        # aggiunge quelli della pagina che sta renderizzando
        preferenze = Preferenze()
        preferenze["site"] = self._preferenze_sito.esporta()
        preferenze["theme"] = self._preferenze_tema.esporta()
        preferenze["page"] = p_pagina.meta.esporta()
        preferenze["page"]["content"] = p_pagina.contenuto
        preferenze["content"] = preferenze["page"]["content"]

        # Renderizza la pagina e la restituisce
        return template.render(preferenze.esporta())