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.
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.
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.
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?
لقد قمت للتو بإنشاء حساب هنا للمشاركة وأقول إنني أعتقد أيضًا أن هذا النوع من الميزات مهم جدًا!
الطباعة (إلى PDF) لا تعمل حاليًا بشكل جيد مع المواضيع التي تحتوي على كتل تعليمات برمجية لأنها لا تلتف أو تتمدد، لذلك تنتهي الأمور بالقص.
أعتقد أن طريقة موثوقة وسهلة نسبيًا لاستخراج المحتوى من discourse، على سبيل المثال لأغراض الأرشفة، مهمة حقًا.
نقطة أخرى للنظر فيها: أشارك في منتدى قام للتو بدمج العديد من المستخدمين من قائمة بريدية تم إغلاقها - خلال مناقشات الانتقال حول ما إذا كان سيتم الاحتفاظ بالقائمة البريدية نشطة أو التحول بالكامل إلى المنتدى، قال عضو كفيف إنه لن يتمكن من المشاركة في المنتدى بسبب نقص الدعم للمتصفحات المستندة إلى النصوص. أعتقد أن وضعًا خامًا مناسبًا، مع إسناد المؤلف وجميع المواضيع، سيعمل نحو مزيد من الشمول.
دعنا نرى. سأدرج كتلة تعليمات برمجية هنا مع قدر كبير من التعليمات البرمجية وأرى كيف ستبدو عند الطباعة:
import java.util.Scanner;
/**
* لعبة AceyDucey
* <p>
* بناءً على لعبة AceyDucey الأساسية هنا
* https://github.com/coding-horror/basic-computer-games/blob/main/01%20Acey%20Ducey/aceyducey.bas
* ملاحظة: كانت الفكرة هي إنشاء نسخة من لعبة Basic في السبعينيات بلغة Java، دون تقديم
* ميزات جديدة - لم تتم إضافة أي نصوص إضافية أو التحقق من الأخطاء، إلخ.
*/
public class AceyDucey {
// المبلغ الحالي لنقود اللاعب
private int playerAmount;
// أول بطاقة موزع تم سحبها
private Card firstCard;
// ثاني بطاقة موزع تم سحبها
private Card secondCard;
// بطاقة اللاعب المسحوبة
private Card playersCard;
// المستخدم لعرض مقدمة اللعبة/التعليمات
private boolean firstTimePlaying = true;
// حالة اللعبة لتحديد ما إذا كانت اللعبة قد انتهت
private boolean gameOver = false;
// يستخدم لإدخال لوحة المفاتيح
private final Scanner kbScanner;
// قيمة ثابتة للبطاقات من مجموعة أوراق اللعب - 2 الأدنى، 14 (الآس) الأعلى
public static final int LOW_CARD_RANGE = 2;
public static final int HIGH_CARD_RANGE = 14;
public AceyDucey() {
// تهيئة نقود اللاعب
playerAmount = 100;
// تهيئة ماسح لوحة المفاتيح
kbScanner = new Scanner(System.in);
}
// طريقة إعادة اللعب - طريقة عامة يتم استدعاؤها من الفئة التي تستدعي اللعبة
// إذا أدخل اللاعب "نعم" فيمكن إعادة تشغيل اللعبة (يتم إرجاع true)
// بخلاف ذلك لا (يتم إرجاع false)
public boolean playAgain() {
System.out.println();
System.out.println("آسف يا صديقي، لكنك أتلفت كل أموالك.");
System.out.println();
System.out.println();
System.out.print("هل تريد المحاولة مرة أخرى (نعم أم لا)؟ ");
String playAgain = kbScanner.next().toUpperCase();
System.out.println();
System.out.println();
if (playAgain.equals("YES")) {
return true;
} else {
System.out.println("حسناً، أتمنى أن تكون قد استمتعت!");
return false;
}
}
// طريقة حلقة اللعبة
public void play() {
// استمر في لعب الجولات حتى ينفد مال اللاعب
do {
if (firstTimePlaying) {
intro();
firstTimePlaying = false;
}
displayBalance();
drawCards();
displayCards();
int betAmount = getBet();
playersCard = randomCard();
displayPlayerCard();
if (playerWon()) {
System.out.println("لقد فزت!!");
playerAmount += betAmount;
} else {
System.out.println("آسف، لقد خسرت");
playerAmount -= betAmount;
// هل نفد مال اللاعب؟
if (playerAmount <= 0) {
gameOver = true;
}
}
} while (!gameOver); // استمر في اللعب حتى ينفد مال اللاعب
}
// طريقة لتحديد ما إذا كان اللاعب قد فاز (يتم إرجاع true) أو خسر (يتم إرجاع false)
// للفوز، يجب أن تكون بطاقة اللاعب ضمن نطاق بطاقتي الموزع الأولى والثانية
// بما في ذلك البطاقتين الأولى والثانية.
private boolean playerWon() {
// الفائز
return (playersCard.getValue() >= firstCard.getValue())
&& playersCard.getValue() <= secondCard.getValue();
}
private void displayPlayerCard() {
System.out.println(playersCard.getName());
}
// احصل على رهان اللاعب، وأرجع المبلغ
// 0 يعتبر رهانًا صالحًا، ولكن أكثر من المبلغ المتاح للاعب ليس كذلك
// ستتكرر الطريقة حتى يتم إدخال رهان صالح.
private int getBet() {
boolean validBet = false;
int amount;
do {
System.out.print("ما هو رهانك؟ ");
amount = kbScanner.nextInt();
if (amount == 0) {
System.out.println("جبان!!");
validBet = true;
} else if (amount > playerAmount) {
System.out.println("آسف يا صديقي، لكنك راهنت بالكثير.");
System.out.println("لديك فقط " + playerAmount + " دولار للمراهنة.");
} else {
validBet = true;
}
} while (!validBet);
return amount;
}
private void displayBalance() {
System.out.println("لديك الآن " + playerAmount + " دولار.");
}
private void displayCards() {
System.out.println("هذه هي بطاقتاك التاليتان: ");
System.out.println(firstCard.getName());
System.out.println(secondCard.getName());
}
// اسحب بطاقتي موزع، واحفظهما للاستخدام لاحقًا.
// تأكد من أن البطاقة الأولى هي بطاقة ذات قيمة أقل من الثانية
private void drawCards() {
do {
firstCard = randomCard();
secondCard = randomCard();
} while (firstCard.getValue() >= secondCard.getValue());
}
// ينشئ بطاقة عشوائية
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("لعبة بطاقات ACEY DUCEY");
System.out.println("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
System.out.println();
System.out.println();
System.out.println("تُلعب ACEY-DUCEY بالطريقة التالية");
System.out.println("يقوم الموزع (الكمبيوتر) بتوزيع بطاقتين مكشوفتين");
System.out.println("لديك خيار المراهنة أو عدم المراهنة اعتمادًا");
System.out.println("على ما إذا كنت تعتقد أن البطاقة ستكون لها");
System.out.println("قيمة بين البطاقتين الأوليين.");
System.out.println("إذا كنت لا ترغب في المراهنة، أدخل: 0");
}
}
لاحظ أن لدينا دعمًا كاملاً تقريبًا لإمكانية الوصول، لذا سأكون مهتمًا بمعرفة ما لا يعمل تحديدًا لمستخدمك الأعمى @thresholdpeople.
أيضًا، تبدو كتلة التعليمات البرمجية أعلاه جيدة في النسخة المطبوعة بالنسبة لي. لقد ضغطت للتو على “طباعة” في Chrome ثم “حفظ باسم PDF” لإنشاء نسخة PDF من هذا الموضوع نفسه:
أنا أستخدم Vivaldi، ولكني استخدمت Chrome أيضاً، وأجهزة كمبيوتر مختلفة، ليس كلها بإعدادات متصفح متزامنة، ولكن عندما أستخدم الطباعة، يتم اقتطاع كتلة الكود الخاصة بك عند:
// Players drawn card
private Card playersCard;
وهذا أيضاً كل ما أستطيع رؤيته حتى عند عرض منشورك بشكل مضمن (يجب علي التمرير لأسفل داخل إطار الكود لرؤية المزيد). أود نشر نسختي، ولكن ليس لدي ما يكفي من المشاركات لتحميل الملفات، ولكنك تفهم الفكرة.
نسختك المطبوعة تبدو بالتأكيد أفضل، لست متأكداً لماذا تختلف عن نسختي بصراحة، ولكنها ليست مثالية أيضاً. سطور الكود لا تلتف وبالتالي يتم اقتطاعها، وجميع الصفحات تحتوي على مستطيل أزرق عائم في أسفل اليسار والذي يحجب أيضاً بعض النصوص. للأسف في تلك الحالة، فهي ليست قابلة للاستخدام حقاً أيضاً.
قدم شخص ما في منتدى SuperCollider حلاً يتمثل في وضع كتلة CSS التالية إما في مفتش المتصفح، أو عند استخدام إضافة للمتصفح (حالياً لدي إضافة Chrome Stylish، وهي تضيفها تلقائياً عندما أكون في ذلك المنتدى):
pre code {
white-space: pre-wrap;
max-height: none;
background: #fafafa;
}
استخدام هذا يجعل الطباعة تعمل بشكل جيد بالنسبة لي. ومع إضافة المتصفح، لا أحتاج إلى الدخول وتعديلها في كل مرة أرغب في حفظ شيء ما، وهذا هو الحل الفعلي… بخلاف ذلك، فهو عمل شاق للغاية.
ومع ذلك، أتمنى لو كانت هناك طريقة أسهل لأرشفة المواضيع، أو بالأحرى، أتمنى لو كانت هناك طريقة لعدم الحاجة إلى تلك الخطوات الإضافية.
خاصة وأن معظم الوظائف موجودة بالفعل: إما عرض منشور بصيغة خام أو القدرة على الطباعة. ولكن نعم، لا يمكن رؤية الموضوع بأكمله بصيغة خام، بل منشور واحد فقط، والطباعة لا تعمل بشكل جيد.
ومع ذلك، فإن الإشارات المرجعية هي ميزة رائعة للمنتدى وأستخدمها طوال الوقت، ولكنها تحتفظ بكل شيء داخل discourse.