Exportar tema como markdown

Encontré esto UI: Exportación/Importación de Temas y Categorías, pero no cubre lo que tenía en mente:

  • Un medio para exportar un tema público o de mensajes directos (DM) completo como un único documento Markdown, donde la acción de exportación sea accesible mediante la interfaz de usuario para todos los participantes de dicho tema.

Y quizás (pero para mí no es obligatorio) tener esta función disponible para cualquier persona en temas públicos.


Interactúo con muchos foros de Discourse públicamente y mediante mensajes directos, y necesito archivar esas discusiones en una base de conocimientos personal basada en Markdown. Esto no solo es muy laborioso, sino que no puedo obtener el Markdown crudo de las publicaciones de otras personas en foros donde no soy moderador ni administrador (lógicamente), por lo que tengo que recrearlo manualmente.

7 Me gusta

Ya puedes acceder al markdown sin procesar de los temas:
Https://meta.discourse.org/raw/152185

2 Me gusta

Gracias, eso sería genial. Pero solo devuelve el primer mensaje del tema y no todo el hilo de conversación.

Edición: Más viable, iterando sobre cada mensaje del hilo en modo raw, pero para un hilo con 60 mensajes sigue siendo mucho trabajo. Además, solo contiene el cuerpo del mensaje y no hay información sobre quién lo publicó ni cuándo.

Puedes usar la función print en un tema y guardar la salida en un archivo PDF. No es Markdown, ¡pero es muy sencillo!

1 me gusta

Gracias, sí, a veces lo uso, pero el contenido queda ‘bloqueado’. No se integra bien con mi base de conocimientos (crear enlaces cruzados, etc.). Markdown es tan simple y fácil de usar que he elegido todas mis herramientas en torno a él. Es un gran ahorro de tiempo si puedes mover fragmentos de MD por todas partes.

2 Me gusta

Me hicieron esa pregunta ayer. ¿Te refieres a la función de imprimir del navegador? ¿O hay una característica de Discourse para imprimir todo el hilo del tema que no estoy viendo?

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

2 Me gusta

Gracioso, ¡a mí también me gustaría algo así! Así que supongo que solo otro voto de apoyo…

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