Export topic as markdown

I found this UI: Topic and Category Export/Import but that does not cover what I was thinking about:

  • A means to export an entire public or DM topic as a single markdown document where the export action is UI-accessible to all the participants in said topic.

And maybe (but for me not required) to have this feature available for anyone on public topics.


I interact with many Discourse forums publicly and DM’ingly and have a need to archive discussions there in a personal markdown-based knowledge base. This is not only very time-consuming, but I can’t get the raw markdown of other people’s posts in forums where I’m not mod or admin (logically), so I have to recreate it manually.

7 Mi Piace

You can already access the raw markdown to topics:
Https://meta.discourse.org/raw/152185

2 Mi Piace

Thanks, that would be so cool. But it only returns the first post in the topic and not the entire conversation thread.

Edit: More doable, by iterating over each post in the thread in raw mode, but for a thread with 60 posts still a lot of work. Furthermore it contains only the body of the post and there is no information on who posted, and when.

You can use the print function on a topic and save the output to a pdf. It is not markdown but it is easy!

1 Mi Piace

Thank you, yes, I sometimes use that, but the content becomes ‘locked in’. It does not fit well with my knowledge base (create cross-links, etc.). Markdown is so simple and easy to work with, that I select all my tools around it. It is a great timesaver if you can just move MD snippets around all over the place.

2 Mi Piace

I was just asked that question yesterday. Are you referring to the print function of the browser? Or is there a Discourse feature to print the entire topic thread that I am not seeing?

https://meta.discourse.org/t/print-long-topic-to-pdf-redux-again/44639/37?u=falco

2 Mi Piace

Funny, I too would like something like this! So just another vote of support, I guess…

Ciao,

Ho appena creato un account qui per intervenire e dire che anche io penso che questo tipo di funzionalità sia molto importante!

La stampa (in PDF) attualmente non funziona bene con i thread che contengono blocchi di codice poiché non vanno a capo o non si estendono, quindi le cose finiscono per essere tagliate.

Penso che un modo affidabile e abbastanza semplice per estrarre contenuti da Discourse, ad esempio a scopo di archiviazione, sia davvero importante.

Un altro punto da considerare: partecipo a un forum che ha appena consolidato molti utenti da una mailing list che è stata chiusa. Durante le discussioni di transizione sull’opportunità di mantenere attiva la mailing list o passare completamente al forum, un membro non vedente ha detto che non sarebbe stato in grado di partecipare al forum a causa della mancanza di supporto per i browser basati su testo. Penso che una modalità raw adeguata, con attribuzione dell’autore e tutti i thread, contribuirebbe a una maggiore inclusione.

2 Mi Piace

Vediamo. Includerò un blocco di codice qui con un bel po’ di codice e vedrò come appare stampato:

import java.util.Scanner;

/**
 * Gioco di AceyDucey
 * 
 * Basato sul gioco base di AceyDucey qui
 * https://github.com/coding-horror/basic-computer-games/blob/main/01%20Acey%20Ducey/aceyducey.bas
 * Nota: L'idea era di creare una versione del gioco Basic degli anni '70 in Java, senza introdurre
 * nuove funzionalità - non sono stati aggiunti testi aggiuntivi, controlli degli errori, ecc.
 */
public class AceyDucey {

    // Importo attuale in contanti del giocatore
    private int playerAmount;

    // Prima carta del mazziere pescata
    private Card firstCard;

    // Seconda carta del mazziere pescata
    private Card secondCard;

    // Carta pescata dal giocatore
    private Card playersCard;

    // Utente per visualizzare l'introduzione/istruzioni del gioco
    private boolean firstTimePlaying = true;

    // Stato del gioco per determinare se il gioco è finito
    private boolean gameOver = false;

    // Usato per l'input da tastiera
    private final Scanner kbScanner;

    // Valore costante per le carte da un mazzo - 2 il più basso, 14 (Asso) il più alto
    public static final int LOW_CARD_RANGE = 2;
    public static final int HIGH_CARD_RANGE = 14;

    public AceyDucey() {
        // Inizializza i contanti del giocatore
        playerAmount = 100;

        // Inizializza lo scanner da tastiera
        kbScanner = new Scanner(System.in);
    }

    // Metodo per giocare di nuovo - metodo pubblico chiamato dalla classe che invoca il gioco
    // Se il giocatore inserisce SÌ, il gioco può essere giocato di nuovo (restituisce true)
    // altrimenti no (false)
    public boolean playAgain() {
        System.out.println();
        System.out.println("MI DISPIACE, AMICO, MA HAI FINITO I TUOI SOLDI.");
        System.out.println();
        System.out.println();
        System.out.print("RIPROVI (SÌ O NO) ");
        String playAgain = kbScanner.next().toUpperCase();
        System.out.println();
        System.out.println();
        if (playAgain.equals("SÌ")) {
            return true;
        } else {
            System.out.println("OK, SPERO CHE TI SIA DIVERTITO!");
            return false;
        }
    }

    // Metodo del ciclo di gioco

    public void play() {

        // Continua a giocare mani finché il giocatore non finisce i contanti
        do {
            if (firstTimePlaying) {
                intro();
                firstTimePlaying = false;
            }
            displayBalance();
            drawCards();
            displayCards();
            int betAmount = getBet();
            playersCard = randomCard();
            displayPlayerCard();
            if (playerWon()) {
                System.out.println("HAI VINTO!!");
                playerAmount += betAmount;
            } else {
                System.out.println("MI DISPIACE, HAI PERSO");
                playerAmount -= betAmount;
                // Il giocatore ha finito i soldi?
                if (playerAmount <= 0) {
                    gameOver = true;
                }
            }

        } while (!gameOver); // Continua a giocare finché il giocatore non finisce i contanti
    }

    // Metodo per determinare se il giocatore ha vinto (restituisce true) o perso (restituisce false)
    // per vincere una carta del giocatore deve essere nell'intervallo della prima e della seconda carta del mazziere
    // pescate comprese le prime e le seconde carte.
    private boolean playerWon() {
        // vincitore
        return (playersCard.getValue() >= firstCard.getValue())
                && playersCard.getValue() <= secondCard.getValue();

    }

    private void displayPlayerCard() {
        System.out.println(playersCard.getName());
    }

    // Ottiene la puntata del giocatore e restituisce l'importo
    // 0 è considerato una puntata valida, ma meglio più di quanto il giocatore abbia a disposizione non lo è
    // il metodo si ripeterà finché non verrà inserita una puntata valida.
    private int getBet() {
        boolean validBet = false;
        int amount;
        do {
            System.out.print("QUAL È LA TUA PUNTATA ");
            amount = kbScanner.nextInt();
            if (amount == 0) {
                System.out.println("POLLICINO!!");
                validBet = true;
            } else if (amount > playerAmount) {
                System.out.println("MI DISPIACE, AMICO MIO, MA HAI PUNTATO TROPPO.");
                System.out.println("HAI SOLO " + playerAmount + " DOLLARI DA PUNTALE.");
            } else {
                validBet = true;
            }
        } while (!validBet);

        return amount;
    }

    private void displayBalance() {
        System.out.println("ORA HAI " + playerAmount + " DOLLARI.");
    }

    private void displayCards() {
        System.out.println("ECCO LE TUE PROSSIME DUE CARTE: ");
        System.out.println(firstCard.getName());
        System.out.println(secondCard.getName());
    }

    // Pesca due carte del mazziere e le salva per un uso successivo.
    // assicurati che la prima carta abbia un valore inferiore alla seconda
    private void drawCards() {

        do {
            firstCard = randomCard();
            secondCard = randomCard();
        } while (firstCard.getValue() >= secondCard.getValue());
    }

    // Crea una carta casuale
    private Card randomCard() {
        return new Card((int) (Math.random()
                * (HIGH_CARD_RANGE - LOW_CARD_RANGE + 1) + LOW_CARD_RANGE));
    }

    public void intro() {
        System.out.println("GIOCO DI CARTE ACEY DUCEY");
        System.out.println("CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY");
        System.out.println();
        System.out.println();
        System.out.println("ACEY-DUCEY SI GIOCA NEL SEGUENTE MODO");
        System.out.println("IL MAZZIERE (COMPUTER) DISTRIBUISCE DUE CARTE A FACCIA IN SU");
        System.out.println("HAI LA POSSIBILITÀ DI PUNTALE O NON PUNTALE A SECONDA");
        System.out.println("CHE TU PENSI CHE LA CARTA AVRÀ");
        System.out.println("UN VALORE COMPRESO TRA LE PRIME DUE.");
        System.out.println("SE NON VUOI PUNTALE, INSERISCI: 0");
    }
}

Nota che abbiamo un supporto di accessibilità abbastanza completo, quindi sarei interessato a sapere specificamente cosa non funziona per il tuo utente non vedente @thresholdpeople .

Inoltre, il blocco di codice sopra mi sembra a posto nella versione stampata. Ho appena premuto “stampa” in Chrome, quindi “salva come PDF” per generare una versione PDF di questo argomento:

Esporta argomento come markdown - funzionalità - Discourse Meta.pdf (249,9 KB)

Non vedo un problema. Per favore, indica le aree specifiche nel PDF che non sono corrette se vedi un problema. Grazie!

Grazie per aver indagato.

Sto usando Vivaldi, ma ho usato anche Chrome, vari computer, non tutti con impostazioni del browser sincronizzate, ma quando uso la stampa il tuo blocco di codice viene ritagliato a:

     // Players drawn card
     private Card playersCard;

che è anche tutto ciò che riesco a vedere fino a quando non visualizzo il tuo post inline (devo scorrere all’interno del frame del codice per vedere di più). Potrei pubblicare la mia versione, ma non ho abbastanza post per caricare file, ma hai capito l’idea.

La tua versione stampata sembra certamente migliore, non sono sicuro del perché sia diversa, ma non è nemmeno perfetta. Le righe di codice non vanno a capo e sono quindi ritagliate, e tutte le pagine hanno un rettangolo blu fluttuante in basso a sinistra che oscura anche del testo. Purtroppo in quello stato, non è realmente utilizzabile.

Qualcuno sul forum di SuperCollider ha fornito la soluzione di inserire il seguente blocco CSS nell’ispettore del browser, o quando si utilizza un plugin del browser (attualmente ho l’estensione Chrome Stylish, e aggiunge automaticamente quando sono su quel forum):

pre code {
    white-space: 	pre-wrap;
    max-height: 	none;
    background: 	#fafafa;
}

Usando questo, la stampa funziona bene per me. E con l’estensione del browser non è necessario intervenire ogni volta che voglio salvare qualcosa, questa è la vera soluzione… altrimenti è troppo lavoro.

Tuttavia, vorrei che ci fosse un modo più semplice per archiviare i thread, o meglio, vorrei che ci fosse un modo per non aver bisogno di quei passaggi aggiuntivi.

Soprattutto perché la maggior parte della funzionalità esiste già: o visualizzare un post in formato raw o poter stampare. Ma sì, non è possibile vedere l’intero thread in formato raw, solo un singolo post, e la stampa non funziona benissimo.

Detto questo, i segnalibri sono un’ottima funzionalità del forum e li uso sempre, ma tutto rimane all’interno di discourse.

1 Mi Piace

Potremmo aggiungere un percorso che restituisca l’intero argomento come @falco grezzo? Potrebbe essere utile, anche se dobbiamo fare attenzione ai megatopici..

Abbiamo certamente già questo per singoli post, ad esempio

https://meta.discourse.org/raw/152185/12

3 Mi Piace

Certamente è fattibile, anche se è un caso d’uso piuttosto di nicchia.

Il formato sarebbe qualcosa del tipo:

username | timestamp | post_number

corpo del post

---

username | timestamp | post_number

corpo del post

---

username | timestamp | post_number

corpo del post

?

2 Mi Piace

Sì, lo supporto comunque. Se abbiamo un percorso /raw/ per i post, perché non averne uno per un argomento?

2 Mi Piace

Attualmente il percorso https://meta.discourse.org/raw/152185 restituisce solo l’OP. Va bene cambiare il comportamento di quel percorso? Le persone dovranno chiamare esplicitamente https://meta.discourse.org/raw/152185/1 per ottenere solo l’OP.

2 Mi Piace

Qualunque cosa tu ritenga migliore va bene per me.

2 Mi Piace

Questo è ora in diretta: https://meta.discourse.org/raw/152185

Fammi sapere se è quello che avevi in mente @here

8 Mi Piace

Lo adoro! Mi sembra ottimo! :heart_eyes:

3 Mi Piace

Questo è davvero fantastico. Grazie :pray:

3 Mi Piace

Grazie mille! e altri personaggi!

2 Mi Piace