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 Me gusta

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

2 Me gusta

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 me gusta

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 Me gusta

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 Me gusta

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

Hola,

¡Acabo de crear una cuenta aquí para intervenir y decir que también creo que este tipo de función es muy importante!

La impresión (a PDF) actualmente no funciona bien con hilos que contienen bloques de código, ya que no se ajustan ni se extienden, por lo que las cosas terminan recortadas.

Creo que una forma fiable y bastante sencilla de extraer contenido de Discourse, por ejemplo, con fines de archivo, es realmente importante.

Otro punto a considerar: participo en un foro que acaba de consolidar a muchos usuarios de una lista de correo que cerró. Durante las discusiones de transición sobre si mantener activa la lista de correo o cambiar completamente al foro, un miembro ciego dijo que no podría participar en el foro debido a la falta de soporte para navegadores basados en texto. Creo que un modo de texto sin formato adecuado, con atribución de autor y todos los hilos, contribuiría a una mayor inclusión.

2 Me gusta

Veamos. Incluiré un bloque de código aquí con una buena cantidad de código y veré cómo se ve impreso:

import java.util.Scanner;

/**
 * Juego de AceyDucey
 * <p>
 * Basado en el juego básico de AceyDucey aquí
 * https://github.com/coding-horror/basic-computer-games/blob/main/01%20Acey%20Ducey/aceyducey.bas
 * Nota: La idea era crear una versión del juego Basic de los años 70 en Java, sin introducir
 * nuevas características - no se ha añadido texto adicional, comprobación de errores, etc.
 */
public class AceyDucey {

    // Cantidad actual de dinero del jugador
    private int playerAmount;

    // Primera carta repartida por el crupier
    private Card firstCard;

    // Segunda carta repartida por el crupier
    private Card secondCard;

    // Carta repartida al jugador
    private Card playersCard;

    // Se usa para mostrar la introducción/instrucciones del juego
    private boolean firstTimePlaying = true;

    // Estado del juego para determinar si ha terminado
    private boolean gameOver = false;

    // Se usa para la entrada del teclado
    private final Scanner kbScanner;

    // Valor constante para las cartas de una baraja - 2 la más baja, 14 (As) la más alta
    public static final int LOW_CARD_RANGE = 2;
    public static final int HIGH_CARD_RANGE = 14;

    public AceyDucey() {
        // Inicializar el dinero del jugador
        playerAmount = 100;

        // Inicializar el escáner del teclado
        kbScanner = new Scanner(System.in);
    }

    // Método para jugar de nuevo - método público llamado desde la clase que invoca el juego
    // Si el jugador introduce SÍ, el juego se puede volver a jugar (devuelve verdadero)
    // de lo contrario no (falso)
    public boolean playAgain() {
        System.out.println();
        System.out.println("LO SIENTO, AMIGO, PERO TE HAS QUEDADO SIN DINERO.");
        System.out.println();
        System.out.println();
        System.out.print("¿QUIERES JUGAR OTRA VEZ (SÍ O NO)? ");
        String playAgain = kbScanner.next().toUpperCase();
        System.out.println();
        System.out.println();
        if (playAgain.equals("SÍ")) {
            return true;
        } else {
            System.out.println("¡DE ACUERDO, ESPERO QUE TE HAYAS DIVERTIDO!");
            return false;
        }
    }

    // método del bucle del juego

    public void play() {

        // Seguir jugando manos hasta que el jugador se quede sin dinero
        do {
            if (firstTimePlaying) {
                intro();
                firstTimePlaying = false;
            }
            displayBalance();
            drawCards();
            displayCards();
            int betAmount = getBet();
            playersCard = randomCard();
            displayPlayerCard();
            if (playerWon()) {
                System.out.println("¡HAS GANADO!!");
                playerAmount += betAmount;
            } else {
                System.out.println("LO SIENTO, HAS PERDIDO");
                playerAmount -= betAmount;
                // ¿Se ha quedado el jugador sin dinero?
                if (playerAmount <= 0) {
                    gameOver = true;
                }
            }

        } while (!gameOver); // Seguir jugando hasta que el jugador se quede sin dinero
    }

    // Método para determinar si el jugador ganó (devuelve verdadero) o perdió (devuelve falso)
    // para ganar, la carta del jugador debe estar en el rango de la primera y la segunda carta del crupier
    // repartidas, incluidas la primera y la segunda carta.
    private boolean playerWon() {
        // ganador
        return (playersCard.getValue() >= firstCard.getValue())
                && playersCard.getValue() <= secondCard.getValue();

    }

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

    // Obtener la apuesta del jugador y devolver la cantidad
    // 0 se considera una apuesta válida, pero más de lo que el jugador tiene disponible no lo es
    // el método se repetirá hasta que se introduzca una apuesta válida.
    private int getBet() {
        boolean validBet = false;
        int amount;
        do {
            System.out.print("¿CUÁL ES TU APUESTA? ");
            amount = kbScanner.nextInt();
            if (amount == 0) {
                System.out.println("¡GALLINA!");
                validBet = true;
            } else if (amount > playerAmount) {
                System.out.println("LO SIENTO, AMIGO, PERO HAS APOSTADO DEMASIADO.");
                System.out.println("SOLO TIENES " + playerAmount + " DÓLARES PARA APOSTAR.");
            } else {
                validBet = true;
            }
        } while (!validBet);

        return amount;
    }

    private void displayBalance() {
        System.out.println("AHORA TIENES " + playerAmount + " DÓLARES.");
    }

    private void displayCards() {
        System.out.println("AQUÍ ESTÁN TUS DOS PRÓXIMAS CARTAS: ");
        System.out.println(firstCard.getName());
        System.out.println(secondCard.getName());
    }

    // Repartir dos cartas del crupier y guardarlas para su uso posterior.
    // asegurarse de que la primera carta tenga un valor menor que la segunda
    private void drawCards() {

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

    // Crea una carta aleatoria
    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("JUEGO DE CARTAS ACEY DUCEY");
        System.out.println("CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY");
        System.out.println();
        System.out.println();
        System.out.println("ACEY-DUCEY SE JUEGA DE LA SIGUIENTE MANERA");
        System.out.println("EL CRUPIER (ORDENADOR) REPARTE DOS CARTAS BOCA ARRIBA");
        System.out.println("TIENES LA OPCIÓN DE APOSTAR O NO APOSTAR DEPENDIENDO");
        System.out.println("DE SI SIENTES QUE LA CARTA TENDRÁ");
        System.out.println("UN VALOR ENTRE LAS DOS PRIMERAS.");
        System.out.println("SI NO QUIERES APOSTAR, INTRODUCE: 0");
    }
}

Tenga en cuenta que tenemos un soporte de accesibilidad bastante completo, por lo que me interesaría saber específicamente qué no funciona para su usuario ciego @thresholdpeople .

Además, el bloque de código anterior me parece bien en la versión impresa. Simplemente presioné “imprimir” en Chrome y luego “guardar como PDF” para generar una versión en PDF de este mismo tema:

Exportar tema como markdown - característica - Discourse Meta.pdf (249.9 KB)

No veo ningún problema. Por favor, señale áreas específicas del PDF que no sean correctas si ve algún problema. ¡Gracias!

Gracias por investigar esto.

Estoy usando Vivaldi, pero también he usado Chrome, varias computadoras, no todas con configuraciones de navegador sincronizadas, pero cuando imprimo, tu bloque de código se recorta en:

     // Players drawn card
     private Card playersCard;

que es también todo lo que puedo ver hasta al ver tu publicación en línea (tengo que desplazarme hacia abajo dentro del marco del código para ver más). Podría publicar mi versión, pero no tengo suficientes publicaciones para subir archivos, pero te haces una idea.

Tu versión impresa ciertamente se ve mejor, no estoy seguro de por qué es diferente, pero tampoco es perfecta. Las líneas de código no se ajustan y, por lo tanto, se recortan, y todas las páginas tienen un rectángulo azul flotante en la parte inferior izquierda que también oculta algo de texto. Desafortunadamente, en ese estado, tampoco es realmente utilizable.

Alguien en el foro de SuperCollider proporcionó la solución de pegar el siguiente bloque CSS en el inspector del navegador, o al usar un complemento del navegador (actualmente tengo la extensión de Chrome Stylish, y se agrega automáticamente cuando estoy en ese foro):

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

Usar esto hace que la impresión funcione bien para mí. Y con la extensión del navegador, no necesito entrar y molestarme en agregarla cada vez que quiero guardar algo, esa es la solución real… de lo contrario, es demasiado trabajo.

Aún así, desearía que hubiera una forma más fácil de archivar hilos, o más bien, desearía que hubiera una forma de no haber necesitado esos pasos adicionales.

Especialmente porque la mayoría de la funcionalidad ya existe: ya sea ver una publicación sin formato o poder imprimir. Pero sí, no es posible ver el hilo completo sin formato, solo una sola publicación, y la impresión no funciona muy bien.

Dicho esto, los marcadores son una característica increíble del foro y los uso todo el tiempo, pero aún así mantiene todo contenido dentro de discourse.

1 me gusta

Podríamos añadir una ruta que devuelva el tema completo como @falco sin procesar. Eso podría ser útil, aunque debemos tener cuidado con los megatemas.

Ciertamente ya tenemos esto para publicaciones individuales, por ejemplo:

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

3 Me gusta

Eso es ciertamente factible, aunque es un caso de uso algo específico.

El formato sería algo como:

nombredeusuario | marca de tiempo | numerodemensaje

cuerpodelmensaje

---

nombredeusuario | marca de tiempo | numerodemensaje

cuerpodelmensaje

---

nombredeusuario | marca de tiempo | numerodemensaje

cuerpodelmensaje

¿?

2 Me gusta

Sí, lo apoyo. Si tenemos una ruta /raw/ para las publicaciones, ¿por qué no tener una para un tema?

2 Me gusta

Actualmente, la ruta https://meta.discourse.org/raw/152185 solo devuelve el OP. ¿Está bien cambiar el comportamiento de esa ruta? Las personas necesitarán llamar explícitamente a https://meta.discourse.org/raw/152185/1 para obtener solo el OP.

2 Me gusta

Lo que creas que sea mejor está bien para mí.

2 Me gusta

Esto está activo ahora: https://meta.discourse.org/raw/152185

Avísame si esto es lo que tenías en mente @here

8 Me gusta

¡Me encanta! ¡Me parece bien! :heart_eyes:

3 Me gusta

Esto es realmente genial. Gracias :pray:

3 Me gusta

¡Muchas gracias! ¡y más personajes!

2 Me gusta