דילוג לתוכן
0
  • דף הבית
  • חוקי הפורום
  • מדריכים
  • פוסטים אחרונים
  • לא נפתר
  • תגיות
  • פופולרי
  • משתמשים
  • תרומות לאוצריא
  • צור קשר
  • דף הבית
  • חוקי הפורום
  • מדריכים
  • פוסטים אחרונים
  • לא נפתר
  • תגיות
  • פופולרי
  • משתמשים
  • תרומות לאוצריא
  • צור קשר
עיצובים
  • בהיר
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • כהה
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
לוגו אתר

פורום אוצריא

אוצריא - דף הבית
|
קח שותפות בהוספת ספרים
|
תרום לאוצריא
  1. דף הבית
  2. הוספת ספרים לספריית אוצריא
  3. בירור | להכניס ספר בשפת מארקדאון לאוצריא עם פאנדוק אפשרי?

בירור | להכניס ספר בשפת מארקדאון לאוצריא עם פאנדוק אפשרי?

מתוזמן נעוץ נעול הועבר הוספת ספרים לספריית אוצריא
הוספת ספריםmarkdownהמרה
35 פוסטים 12 כותבים 731 צפיות 7 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
    תגובה
    • תגובה כנושא
    התחברו כדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • ס
      ס
      ספי
      כתב ב נערך לאחרונה על ידי ספי
      #1

      הייתי שמח לדעת האם אפשר להכניס ספר שנכתב בשפת מארקונד Markdown כגון בתוכנת Obsidian להכניס לאוצריא
      האם ניתן? האם יש איזה תוכנה לכך?
      אשמח לכל מידע בעניין!!

      Otzaria-BotO האדם החושבה יום חדש מתחילי 3 תגובות תגובה אחרונה
      0
      • ס ספי

        הייתי שמח לדעת האם אפשר להכניס ספר שנכתב בשפת מארקונד Markdown כגון בתוכנת Obsidian להכניס לאוצריא
        האם ניתן? האם יש איזה תוכנה לכך?
        אשמח לכל מידע בעניין!!

        Otzaria-BotO
        Otzaria-BotO
        Otzaria-Bot
        כתב ב נערך לאחרונה על ידי
        #2

        אוצריא תומכת בספרים אישיים בפורמטים: TXT, DOCX, PDF — Markdown ישירות לא נתמך.

        אבל Pandoc בהחלט פתרון מצוין:

        המרה עם Pandoc:

        pandoc yourbook.md -o yourbook.docx
        

        או ל-TXT:

        pandoc yourbook.md -o yourbook.txt
        

        לאחר מכן: הגדרות > ספרייה > "הוסף תיקייה לאוצריא" — וייכנס כספר אישי.

        הערות:

        • DOCX עדיף על TXT — שומר כותרות ועיצוב
        • שני הפורמטים נכנסים לאינדקס החיפוש
        • ספרים עם תוכן ארוך שמחולק בקובץ Obsidian לכמה קבצים — אפשר לאחד אותם לפני ההמרה, או לייבא כמה ספרים נפרדים
        תגובה 1 תגובה אחרונה
        0
        • ס
          ס
          ספי
          כתב ב נערך לאחרונה על ידי
          #3

          ונמצאנו למדים מדבריו שכל הכותרות שהיו בMarkdown לא ישמרו...
          אם יש תשובה יותר מקצועית נשמח...

          ע"ה דכו"עע המלאךה 2 תגובות תגובה אחרונה
          0
          • א
            א
            אלי ויל
            כתב ב נערך לאחרונה על ידי
            #4

            מה עם ייצוא בתוכנה לPDF?

            תגובה 1 תגובה אחרונה
            0
            • ס ספי

              ונמצאנו למדים מדבריו שכל הכותרות שהיו בMarkdown לא ישמרו...
              אם יש תשובה יותר מקצועית נשמח...

              ע"ה דכו"עע
              ע"ה דכו"עע
              ע"ה דכו"ע
              כתב ב נערך לאחרונה על ידי
              #5

              @ספי כתב:

              ונמצאנו למדים מדבריו שכל הכותרות שהיו בMarkdown לא ישמרו...

              אני לא מכיר את pandoc, אבל ממנו זה דווקא נשמע שבייצוא לDOCX הכותרות כן יישמרו (זה גם הגיוני מאוד).

              אם חשוב לך דווקא טקסט תוכל אח"כ להמיר את זה לטקסט תואם אוצריא ע"י התוכנות שמסתובבות כאן

              תגובה 1 תגובה אחרונה
              1
              • ס ספי

                ונמצאנו למדים מדבריו שכל הכותרות שהיו בMarkdown לא ישמרו...
                אם יש תשובה יותר מקצועית נשמח...

                המלאךה
                המלאךה
                המלאך
                מפתח
                כתב ב נערך לאחרונה על ידי
                #6

                @ספי כתב:

                ונמצאנו למדים מדבריו שכל הכותרות שהיו בMarkdown לא ישמרו...
                אם יש תשובה יותר מקצועית נשמח...

                טעות.
                כל כלי ההמרה מיועדים לשמר את העיצוב.
                בלי זה אפשר סקריפט פייתון פשוט..

                תגובה 1 תגובה אחרונה
                0
                • י. פל.י
                  י. פל.י
                  י. פל.
                  כתב ב נערך לאחרונה על ידי
                  #7

                  @האדם-החושב מכין משהו, אל דאגה!

                  תגובה 1 תגובה אחרונה
                  0
                  • ס ספי

                    הייתי שמח לדעת האם אפשר להכניס ספר שנכתב בשפת מארקונד Markdown כגון בתוכנת Obsidian להכניס לאוצריא
                    האם ניתן? האם יש איזה תוכנה לכך?
                    אשמח לכל מידע בעניין!!

                    האדם החושבה
                    האדם החושבה
                    האדם החושב
                    מפתח
                    כתב ב נערך לאחרונה על ידי
                    #8

                    @ספי

                    import re
                    from pathlib import Path
                    
                    import markdown
                    from bs4 import BeautifulSoup
                    from bs4.element import NavigableString
                    
                    SUPPORTED_TAGS = {
                        "a", "abbr", "acronym", "address", "article", "aside", "audio", "b", "bdi", "bdo", "big",
                        "blockquote", "br", "caption", "cite", "code", "data", "dd", "del", "details", "dfn", "dl", "dt", "em", "figcaption", "figure", "footer", "font", "h1", "h2", "h3", "h4",
                        "h5", "h6", "header", "hr", "i", "iframe", "img", "ins", "kbd", "li", "main", "mark", "nav",
                        "noscript", "ol", "p", "pre", "q", "rp", "rt", "ruby", "s", "samp", "section", "small", "span",
                        "strike", "strong", "sub", "sup", "summary", "svg", "table", "tbody", "td", "template", "tfoot",
                        "th", "thead", "time", "tr", "tt", "u", "ul", "var", "video", "math", "mrow", "msup", "msub",
                        "mover", "munder", "msubsup", "moverunder", "mfrac", "mlongdiv", "msqrt", "mroot", "mi", "mn", "mo"
                    }
                    
                    # Void/media tags: meaningful even with no text — never delete as "empty".
                    VOID_TAGS = {
                        "br", "hr", "img", "iframe", "svg", "video", "audio", "source",
                        "input", "col", "area", "embed",
                    }
                    
                    # Tags where newlines are significant — keep line breaks as <br> instead of dropping.
                    PRE_TAGS = {"pre", "code", "textarea"}
                    
                    MD_EXTENSIONS = ["extra", "sane_lists"]
                    
                    # Block-level HTML wrappers whose inner markdown must still be parsed.
                    # python-markdown treats content inside these as raw unless markdown="1" is set.
                    _BLOCK_HTML_RE = re.compile(
                        r"<(div|section|article|aside|main|header|footer|nav|details|figure)\b([^>]*)>",
                        re.IGNORECASE,
                    )
                    
                    
                    def _enable_md_in_html(md_text: str) -> str:
                        """Add markdown="1" to block wrappers so md_in_html parses their content."""
                        def add_attr(m: "re.Match[str]") -> str:
                            attrs = m.group(2)
                            if "markdown" in attrs.lower():
                                return m.group(0)
                            return f'<{m.group(1)}{attrs} markdown="1">'
                        return _BLOCK_HTML_RE.sub(add_attr, md_text)
                    
                    
                    def _strip_unsupported(soup: BeautifulSoup) -> None:
                        """Unwrap tags not in SUPPORTED_TAGS, keeping their content."""
                        for tag in soup.find_all():
                            if tag.name not in SUPPORTED_TAGS:
                                tag.unwrap()
                    
                    
                    def _flatten_newlines(soup: BeautifulSoup) -> None:
                        """Keep every tag on one line: newlines -> space, but -> <br> inside pre/code."""
                        texts = [n for n in soup.descendants if isinstance(n, NavigableString) and "\n" in n]
                        for text in texts:
                            in_pre = any(p.name in PRE_TAGS for p in text.parents)
                            if not in_pre:
                                text.replace_with(text.replace("\n", " "))
                                continue
                            new_nodes = []
                            for i, part in enumerate(text.strip("\n").split("\n")):
                                if i > 0:
                                    new_nodes.append(soup.new_tag("br"))
                                new_nodes.append(NavigableString(part))
                            text.replace_with(*new_nodes)
                    
                    
                    def _remove_empty(soup: BeautifulSoup) -> None:
                        """Drop empty tags, but keep void/media tags and any tag wrapping one."""
                        for tag in soup.find_all():
                            if tag.name in VOID_TAGS:
                                continue
                            if not tag.get_text(strip=True) and not tag.find(VOID_TAGS):
                                tag.decompose()
                    
                    
                    def md_to_otzaria(md_text: str) -> str:
                        md_text = _enable_md_in_html(md_text)
                        html = markdown.markdown(md_text, extensions=MD_EXTENSIONS)
                        soup = BeautifulSoup(html, "html.parser")
                    
                        _strip_unsupported(soup)
                        _flatten_newlines(soup)
                        _remove_empty(soup)
                    
                        # One top-level node per line.
                        lines = []
                        for node in soup.contents:
                            if isinstance(node, NavigableString):
                                stripped = node.strip()
                                if stripped:
                                    lines.append(stripped)
                            else:
                                lines.append(str(node))
                    
                        return "\n".join(lines)
                    
                    
                    def main(md_file_path: Path | str, output_file_path: Path | str | None = None) -> None:
                        md_file_path = Path(md_file_path)
                        if output_file_path is not None:
                            output_file_path = Path(output_file_path)
                        else:
                            output_file_path = md_file_path.with_suffix(".txt")
                    
                        with md_file_path.open("r", encoding="utf-8") as f:
                            md_text = f.read()
                    
                        otzaria_text = md_to_otzaria(md_text)
                    
                        with output_file_path.open("w", encoding="utf-8") as f:
                            f.write(otzaria_text)
                    
                    
                    if __name__ == "__main__":
                        md_file = r"C:\Users\User\Downloads\README (2).md"
                        main(md_file)
                    
                    
                    יאיר דניאלי M 2 תגובות תגובה אחרונה
                    5
                    • האדם החושבה האדם החושב

                      @ספי

                      import re
                      from pathlib import Path
                      
                      import markdown
                      from bs4 import BeautifulSoup
                      from bs4.element import NavigableString
                      
                      SUPPORTED_TAGS = {
                          "a", "abbr", "acronym", "address", "article", "aside", "audio", "b", "bdi", "bdo", "big",
                          "blockquote", "br", "caption", "cite", "code", "data", "dd", "del", "details", "dfn", "dl", "dt", "em", "figcaption", "figure", "footer", "font", "h1", "h2", "h3", "h4",
                          "h5", "h6", "header", "hr", "i", "iframe", "img", "ins", "kbd", "li", "main", "mark", "nav",
                          "noscript", "ol", "p", "pre", "q", "rp", "rt", "ruby", "s", "samp", "section", "small", "span",
                          "strike", "strong", "sub", "sup", "summary", "svg", "table", "tbody", "td", "template", "tfoot",
                          "th", "thead", "time", "tr", "tt", "u", "ul", "var", "video", "math", "mrow", "msup", "msub",
                          "mover", "munder", "msubsup", "moverunder", "mfrac", "mlongdiv", "msqrt", "mroot", "mi", "mn", "mo"
                      }
                      
                      # Void/media tags: meaningful even with no text — never delete as "empty".
                      VOID_TAGS = {
                          "br", "hr", "img", "iframe", "svg", "video", "audio", "source",
                          "input", "col", "area", "embed",
                      }
                      
                      # Tags where newlines are significant — keep line breaks as <br> instead of dropping.
                      PRE_TAGS = {"pre", "code", "textarea"}
                      
                      MD_EXTENSIONS = ["extra", "sane_lists"]
                      
                      # Block-level HTML wrappers whose inner markdown must still be parsed.
                      # python-markdown treats content inside these as raw unless markdown="1" is set.
                      _BLOCK_HTML_RE = re.compile(
                          r"<(div|section|article|aside|main|header|footer|nav|details|figure)\b([^>]*)>",
                          re.IGNORECASE,
                      )
                      
                      
                      def _enable_md_in_html(md_text: str) -> str:
                          """Add markdown="1" to block wrappers so md_in_html parses their content."""
                          def add_attr(m: "re.Match[str]") -> str:
                              attrs = m.group(2)
                              if "markdown" in attrs.lower():
                                  return m.group(0)
                              return f'<{m.group(1)}{attrs} markdown="1">'
                          return _BLOCK_HTML_RE.sub(add_attr, md_text)
                      
                      
                      def _strip_unsupported(soup: BeautifulSoup) -> None:
                          """Unwrap tags not in SUPPORTED_TAGS, keeping their content."""
                          for tag in soup.find_all():
                              if tag.name not in SUPPORTED_TAGS:
                                  tag.unwrap()
                      
                      
                      def _flatten_newlines(soup: BeautifulSoup) -> None:
                          """Keep every tag on one line: newlines -> space, but -> <br> inside pre/code."""
                          texts = [n for n in soup.descendants if isinstance(n, NavigableString) and "\n" in n]
                          for text in texts:
                              in_pre = any(p.name in PRE_TAGS for p in text.parents)
                              if not in_pre:
                                  text.replace_with(text.replace("\n", " "))
                                  continue
                              new_nodes = []
                              for i, part in enumerate(text.strip("\n").split("\n")):
                                  if i > 0:
                                      new_nodes.append(soup.new_tag("br"))
                                  new_nodes.append(NavigableString(part))
                              text.replace_with(*new_nodes)
                      
                      
                      def _remove_empty(soup: BeautifulSoup) -> None:
                          """Drop empty tags, but keep void/media tags and any tag wrapping one."""
                          for tag in soup.find_all():
                              if tag.name in VOID_TAGS:
                                  continue
                              if not tag.get_text(strip=True) and not tag.find(VOID_TAGS):
                                  tag.decompose()
                      
                      
                      def md_to_otzaria(md_text: str) -> str:
                          md_text = _enable_md_in_html(md_text)
                          html = markdown.markdown(md_text, extensions=MD_EXTENSIONS)
                          soup = BeautifulSoup(html, "html.parser")
                      
                          _strip_unsupported(soup)
                          _flatten_newlines(soup)
                          _remove_empty(soup)
                      
                          # One top-level node per line.
                          lines = []
                          for node in soup.contents:
                              if isinstance(node, NavigableString):
                                  stripped = node.strip()
                                  if stripped:
                                      lines.append(stripped)
                              else:
                                  lines.append(str(node))
                      
                          return "\n".join(lines)
                      
                      
                      def main(md_file_path: Path | str, output_file_path: Path | str | None = None) -> None:
                          md_file_path = Path(md_file_path)
                          if output_file_path is not None:
                              output_file_path = Path(output_file_path)
                          else:
                              output_file_path = md_file_path.with_suffix(".txt")
                      
                          with md_file_path.open("r", encoding="utf-8") as f:
                              md_text = f.read()
                      
                          otzaria_text = md_to_otzaria(md_text)
                      
                          with output_file_path.open("w", encoding="utf-8") as f:
                              f.write(otzaria_text)
                      
                      
                      if __name__ == "__main__":
                          md_file = r"C:\Users\User\Downloads\README (2).md"
                          main(md_file)
                      
                      
                      יאיר דניאלי
                      יאיר דניאלי
                      יאיר דניאל
                      תורם לאוצריא ניהול תוספים
                      כתב ב נערך לאחרונה על ידי
                      #9

                      @האדם-החושב כתב:

                      @ספי

                      import re
                      from pathlib import Path
                      
                      import markdown
                      from bs4 import BeautifulSoup
                      from bs4.element import NavigableString
                      
                      SUPPORTED_TAGS = {
                          "a", "abbr", "acronym", "address", "article", "aside", "audio", "b", "bdi", "bdo", "big",
                          "blockquote", "br", "caption", "cite", "code", "data", "dd", "del", "details", "dfn", "dl", "dt", "em", "figcaption", "figure", "footer", "font", "h1", "h2", "h3", "h4",
                          "h5", "h6", "header", "hr", "i", "iframe", "img", "ins", "kbd", "li", "main", "mark", "nav",
                          "noscript", "ol", "p", "pre", "q", "rp", "rt", "ruby", "s", "samp", "section", "small", "span",
                          "strike", "strong", "sub", "sup", "summary", "svg", "table", "tbody", "td", "template", "tfoot",
                          "th", "thead", "time", "tr", "tt", "u", "ul", "var", "video", "math", "mrow", "msup", "msub",
                          "mover", "munder", "msubsup", "moverunder", "mfrac", "mlongdiv", "msqrt", "mroot", "mi", "mn", "mo"
                      }
                      
                      # Void/media tags: meaningful even with no text — never delete as "empty".
                      VOID_TAGS = {
                          "br", "hr", "img", "iframe", "svg", "video", "audio", "source",
                          "input", "col", "area", "embed",
                      }
                      
                      # Tags where newlines are significant — keep line breaks as <br> instead of dropping.
                      PRE_TAGS = {"pre", "code", "textarea"}
                      
                      MD_EXTENSIONS = ["extra", "sane_lists"]
                      
                      # Block-level HTML wrappers whose inner markdown must still be parsed.
                      # python-markdown treats content inside these as raw unless markdown="1" is set.
                      _BLOCK_HTML_RE = re.compile(
                          r"<(div|section|article|aside|main|header|footer|nav|details|figure)\b([^>]*)>",
                          re.IGNORECASE,
                      )
                      
                      
                      def _enable_md_in_html(md_text: str) -> str:
                          """Add markdown="1" to block wrappers so md_in_html parses their content."""
                          def add_attr(m: "re.Match[str]") -> str:
                              attrs = m.group(2)
                              if "markdown" in attrs.lower():
                                  return m.group(0)
                              return f'<{m.group(1)}{attrs} markdown="1">'
                          return _BLOCK_HTML_RE.sub(add_attr, md_text)
                      
                      
                      def _strip_unsupported(soup: BeautifulSoup) -> None:
                          """Unwrap tags not in SUPPORTED_TAGS, keeping their content."""
                          for tag in soup.find_all():
                              if tag.name not in SUPPORTED_TAGS:
                                  tag.unwrap()
                      
                      
                      def _flatten_newlines(soup: BeautifulSoup) -> None:
                          """Keep every tag on one line: newlines -> space, but -> <br> inside pre/code."""
                          texts = [n for n in soup.descendants if isinstance(n, NavigableString) and "\n" in n]
                          for text in texts:
                              in_pre = any(p.name in PRE_TAGS for p in text.parents)
                              if not in_pre:
                                  text.replace_with(text.replace("\n", " "))
                                  continue
                              new_nodes = []
                              for i, part in enumerate(text.strip("\n").split("\n")):
                                  if i > 0:
                                      new_nodes.append(soup.new_tag("br"))
                                  new_nodes.append(NavigableString(part))
                              text.replace_with(*new_nodes)
                      
                      
                      def _remove_empty(soup: BeautifulSoup) -> None:
                          """Drop empty tags, but keep void/media tags and any tag wrapping one."""
                          for tag in soup.find_all():
                              if tag.name in VOID_TAGS:
                                  continue
                              if not tag.get_text(strip=True) and not tag.find(VOID_TAGS):
                                  tag.decompose()
                      
                      
                      def md_to_otzaria(md_text: str) -> str:
                          md_text = _enable_md_in_html(md_text)
                          html = markdown.markdown(md_text, extensions=MD_EXTENSIONS)
                          soup = BeautifulSoup(html, "html.parser")
                      
                          _strip_unsupported(soup)
                          _flatten_newlines(soup)
                          _remove_empty(soup)
                      
                          # One top-level node per line.
                          lines = []
                          for node in soup.contents:
                              if isinstance(node, NavigableString):
                                  stripped = node.strip()
                                  if stripped:
                                      lines.append(stripped)
                              else:
                                  lines.append(str(node))
                      
                          return "\n".join(lines)
                      
                      
                      def main(md_file_path: Path | str, output_file_path: Path | str | None = None) -> None:
                          md_file_path = Path(md_file_path)
                          if output_file_path is not None:
                              output_file_path = Path(output_file_path)
                          else:
                              output_file_path = md_file_path.with_suffix(".txt")
                      
                          with md_file_path.open("r", encoding="utf-8") as f:
                              md_text = f.read()
                      
                          otzaria_text = md_to_otzaria(md_text)
                      
                          with output_file_path.open("w", encoding="utf-8") as f:
                              f.write(otzaria_text)
                      
                      
                      if __name__ == "__main__":
                          md_file = r"C:\Users\User\Downloads\README (2).md"
                          main(md_file)
                      
                      

                      צריך לנעוץ את הפוסט הזה.
                      @י.-פל.

                      "כִּי רָצוּ עֲבָדֶיךָ אֶת אֲבָנֶיהָ וְאֶת עֲפָרָהּ יְחֹנֵנוּ"

                      תגובה 1 תגובה אחרונה
                      0
                      • י. פל.י י. פל. סימן נושא זה כנפתר ב
                      • י. פל.י י. פל. הצמיד נושא זה ב
                      • ס ספי

                        הייתי שמח לדעת האם אפשר להכניס ספר שנכתב בשפת מארקונד Markdown כגון בתוכנת Obsidian להכניס לאוצריא
                        האם ניתן? האם יש איזה תוכנה לכך?
                        אשמח לכל מידע בעניין!!

                        יום חדש מתחילי
                        יום חדש מתחילי
                        יום חדש מתחיל
                        מנהל ספריית אוצריא
                        כתב ב נערך לאחרונה על ידי
                        #10

                        @ספי תכלס' אתה מסתדר עם הקוד, או שאתה צריך שנקמפל לך אותו ל EXE?

                        יאיר דניאלי תגובה 1 תגובה אחרונה
                        0
                        • יום חדש מתחילי יום חדש מתחיל

                          @ספי תכלס' אתה מסתדר עם הקוד, או שאתה צריך שנקמפל לך אותו ל EXE?

                          יאיר דניאלי
                          יאיר דניאלי
                          יאיר דניאל
                          תורם לאוצריא ניהול תוספים
                          כתב ב נערך לאחרונה על ידי
                          #11

                          @יום-חדש-מתחיל כתב:

                          @ספי תכלס' אתה מסתדר עם הקוד, או שאתה צריך שנקמפל לך אותו ל EXE?

                          בכל מקרה עדיף שתקמפל ותפרסם בתוכנות עזר.|
                          אני חשוב שזה יכול להיות שימושי

                          "כִּי רָצוּ עֲבָדֶיךָ אֶת אֲבָנֶיהָ וְאֶת עֲפָרָהּ יְחֹנֵנוּ"

                          תגובה 1 תגובה אחרונה
                          0
                          • ס
                            ס
                            ספי
                            כתב ב נערך לאחרונה על ידי
                            #12

                            אני הסתדרתי, ממש יישר כח
                            אני בעצם בניתי תוכנת המרה עם שלל אפשרויות טובות ומקצועיות, ורציתי לוודא שעבודתי לא לחינם, יש כאן כב איזה תוכנות חינמיות שעושות מה שאני עשיתי, אבל אני עשיתי ברמה קצת יותר מקצועית, [למרות שאני איני מבין בבניית תוכנות] עשיתי זאת לצורך מטרה מסוימת ובעז"ה אפרסם זאת לציבור היקר

                            תגובה 1 תגובה אחרונה
                            4
                            • ס ספי סימן נושא זה כנושא רגיל ב
                            • האדם החושבה האדם החושב

                              @ספי

                              import re
                              from pathlib import Path
                              
                              import markdown
                              from bs4 import BeautifulSoup
                              from bs4.element import NavigableString
                              
                              SUPPORTED_TAGS = {
                                  "a", "abbr", "acronym", "address", "article", "aside", "audio", "b", "bdi", "bdo", "big",
                                  "blockquote", "br", "caption", "cite", "code", "data", "dd", "del", "details", "dfn", "dl", "dt", "em", "figcaption", "figure", "footer", "font", "h1", "h2", "h3", "h4",
                                  "h5", "h6", "header", "hr", "i", "iframe", "img", "ins", "kbd", "li", "main", "mark", "nav",
                                  "noscript", "ol", "p", "pre", "q", "rp", "rt", "ruby", "s", "samp", "section", "small", "span",
                                  "strike", "strong", "sub", "sup", "summary", "svg", "table", "tbody", "td", "template", "tfoot",
                                  "th", "thead", "time", "tr", "tt", "u", "ul", "var", "video", "math", "mrow", "msup", "msub",
                                  "mover", "munder", "msubsup", "moverunder", "mfrac", "mlongdiv", "msqrt", "mroot", "mi", "mn", "mo"
                              }
                              
                              # Void/media tags: meaningful even with no text — never delete as "empty".
                              VOID_TAGS = {
                                  "br", "hr", "img", "iframe", "svg", "video", "audio", "source",
                                  "input", "col", "area", "embed",
                              }
                              
                              # Tags where newlines are significant — keep line breaks as <br> instead of dropping.
                              PRE_TAGS = {"pre", "code", "textarea"}
                              
                              MD_EXTENSIONS = ["extra", "sane_lists"]
                              
                              # Block-level HTML wrappers whose inner markdown must still be parsed.
                              # python-markdown treats content inside these as raw unless markdown="1" is set.
                              _BLOCK_HTML_RE = re.compile(
                                  r"<(div|section|article|aside|main|header|footer|nav|details|figure)\b([^>]*)>",
                                  re.IGNORECASE,
                              )
                              
                              
                              def _enable_md_in_html(md_text: str) -> str:
                                  """Add markdown="1" to block wrappers so md_in_html parses their content."""
                                  def add_attr(m: "re.Match[str]") -> str:
                                      attrs = m.group(2)
                                      if "markdown" in attrs.lower():
                                          return m.group(0)
                                      return f'<{m.group(1)}{attrs} markdown="1">'
                                  return _BLOCK_HTML_RE.sub(add_attr, md_text)
                              
                              
                              def _strip_unsupported(soup: BeautifulSoup) -> None:
                                  """Unwrap tags not in SUPPORTED_TAGS, keeping their content."""
                                  for tag in soup.find_all():
                                      if tag.name not in SUPPORTED_TAGS:
                                          tag.unwrap()
                              
                              
                              def _flatten_newlines(soup: BeautifulSoup) -> None:
                                  """Keep every tag on one line: newlines -> space, but -> <br> inside pre/code."""
                                  texts = [n for n in soup.descendants if isinstance(n, NavigableString) and "\n" in n]
                                  for text in texts:
                                      in_pre = any(p.name in PRE_TAGS for p in text.parents)
                                      if not in_pre:
                                          text.replace_with(text.replace("\n", " "))
                                          continue
                                      new_nodes = []
                                      for i, part in enumerate(text.strip("\n").split("\n")):
                                          if i > 0:
                                              new_nodes.append(soup.new_tag("br"))
                                          new_nodes.append(NavigableString(part))
                                      text.replace_with(*new_nodes)
                              
                              
                              def _remove_empty(soup: BeautifulSoup) -> None:
                                  """Drop empty tags, but keep void/media tags and any tag wrapping one."""
                                  for tag in soup.find_all():
                                      if tag.name in VOID_TAGS:
                                          continue
                                      if not tag.get_text(strip=True) and not tag.find(VOID_TAGS):
                                          tag.decompose()
                              
                              
                              def md_to_otzaria(md_text: str) -> str:
                                  md_text = _enable_md_in_html(md_text)
                                  html = markdown.markdown(md_text, extensions=MD_EXTENSIONS)
                                  soup = BeautifulSoup(html, "html.parser")
                              
                                  _strip_unsupported(soup)
                                  _flatten_newlines(soup)
                                  _remove_empty(soup)
                              
                                  # One top-level node per line.
                                  lines = []
                                  for node in soup.contents:
                                      if isinstance(node, NavigableString):
                                          stripped = node.strip()
                                          if stripped:
                                              lines.append(stripped)
                                      else:
                                          lines.append(str(node))
                              
                                  return "\n".join(lines)
                              
                              
                              def main(md_file_path: Path | str, output_file_path: Path | str | None = None) -> None:
                                  md_file_path = Path(md_file_path)
                                  if output_file_path is not None:
                                      output_file_path = Path(output_file_path)
                                  else:
                                      output_file_path = md_file_path.with_suffix(".txt")
                              
                                  with md_file_path.open("r", encoding="utf-8") as f:
                                      md_text = f.read()
                              
                                  otzaria_text = md_to_otzaria(md_text)
                              
                                  with output_file_path.open("w", encoding="utf-8") as f:
                                      f.write(otzaria_text)
                              
                              
                              if __name__ == "__main__":
                                  md_file = r"C:\Users\User\Downloads\README (2).md"
                                  main(md_file)
                              
                              
                              M
                              M
                              meir
                              כתב ב נערך לאחרונה על ידי meir
                              #13

                              @האדם-החושב
                              למה להמציא את הגלגל מחדש
                              יש מלא ספריות מוכנות לזה
                              לדוגמה: marked

                              npx marked file.md > output.html
                              
                              //OR
                              
                              npx marked file.md > output.txt
                              
                              האדם החושבה תגובה 1 תגובה אחרונה
                              0
                              • M meir

                                @האדם-החושב
                                למה להמציא את הגלגל מחדש
                                יש מלא ספריות מוכנות לזה
                                לדוגמה: marked

                                npx marked file.md > output.html
                                
                                //OR
                                
                                npx marked file.md > output.txt
                                
                                האדם החושבה
                                האדם החושבה
                                האדם החושב
                                מפתח
                                כתב ב נערך לאחרונה על ידי
                                #14

                                @meir הנקודה היא שאוצריא לא תומכת בכל תגי הhtml, בנוסף - אוצריא מרנדרת שורה אחרי שורה, מה שיוצר מצב שכל העץ אמור להיות בשורה בודדת.

                                M תגובה 1 תגובה אחרונה
                                1
                                • ס
                                  ס
                                  ספי
                                  כתב ב נערך לאחרונה על ידי
                                  #15

                                  הכוונה שאת השפה הזאת שאתם מכירים אני כאברך לא הכרתי, תמיד היה לי ידע במחשבים, ואף קליטה מהירה, אבל "המסכים השחורים" היו רחוקים מנגד עיני ולכן בניתי את התוכנה הזאת, ולעוד צורך גדול שאפרסם בהמשך.
                                  אגב יש לי שאלה של בור.. מדוע בעצם לא השתמשו מפתחי אוצריא להכניס את כל הספרים גם לתוכנת - Obsidian זה ממש יפה, אפשרויות חיפוש מתקדמות, קישורים, ועוד רבות כהנה וכהנה.. אני לא משתמש הרבה עם התכונה הזאת.. אבל בקלילות שלה היא מדהימה.
                                  אני הכנסתי את כל הספרים של אוצריא לObsidian
                                  מאיר- לא הבנתי..
                                  ואשמח לדעת היות ואני חדש בפורום, בעצם היום מי שרוצה להכניס ספרים לאוצריא מוורד עם סגנונות [כי מארקדאון כבר הבנו שיש סקריפטים] האם הוא צריך עבודה ידנית? [מסתבר שלא..] זה בעצם "עורך מנחם"?? ז"א לזה הוא נועד? להכנסת וורד עם סגנונות של כותרת לאוצריא?

                                  יום חדש מתחילי תגובה 1 תגובה אחרונה
                                  0
                                  • ס ספי

                                    הכוונה שאת השפה הזאת שאתם מכירים אני כאברך לא הכרתי, תמיד היה לי ידע במחשבים, ואף קליטה מהירה, אבל "המסכים השחורים" היו רחוקים מנגד עיני ולכן בניתי את התוכנה הזאת, ולעוד צורך גדול שאפרסם בהמשך.
                                    אגב יש לי שאלה של בור.. מדוע בעצם לא השתמשו מפתחי אוצריא להכניס את כל הספרים גם לתוכנת - Obsidian זה ממש יפה, אפשרויות חיפוש מתקדמות, קישורים, ועוד רבות כהנה וכהנה.. אני לא משתמש הרבה עם התכונה הזאת.. אבל בקלילות שלה היא מדהימה.
                                    אני הכנסתי את כל הספרים של אוצריא לObsidian
                                    מאיר- לא הבנתי..
                                    ואשמח לדעת היות ואני חדש בפורום, בעצם היום מי שרוצה להכניס ספרים לאוצריא מוורד עם סגנונות [כי מארקדאון כבר הבנו שיש סקריפטים] האם הוא צריך עבודה ידנית? [מסתבר שלא..] זה בעצם "עורך מנחם"?? ז"א לזה הוא נועד? להכנסת וורד עם סגנונות של כותרת לאוצריא?

                                    יום חדש מתחילי
                                    יום חדש מתחילי
                                    יום חדש מתחיל
                                    מנהל ספריית אוצריא
                                    כתב ב נערך לאחרונה על ידי
                                    #16

                                    @ספי כתב:

                                    בעצם היום מי שרוצה להכניס ספרים לאוצריא מוורד עם סגנונות

                                    יש כיום 2 אפשרויות.

                                    1. להכניס את הספר דרך ההגדרות בהכנסת ספרים אישיים. התוכנה תומכת בקריאה ובחיפוש בקבצי וורד. בגדול רוב העיצוב הבסיסי וודאי נשמר
                                      [לבקשת תמיכה בהצגת סגנונות ופונקציות נוספות שיש בוורד ואוצריא עדיין לא מציגה אותם כעת כמו שצריך יש לפנות ל @נתנאל_26].
                                    2. ע"י המרתם לקבצי טקסט עם עיצוב ע"י תגי HTML שזה בעצם המבנה של קבצי אוצריא.
                                      כרגע הצורה הרשמית והמצקצועית היא להמיר אותם דרך 'עורך מנחם'. בימים הקרובים בעז"ה אמורה להצאת תוכנת פייתון שעושה את אותה עבודה בשלש שניות בלבד. [למי שרוצה לראות בינתיים הנה היא: https://github.com/YOSEFTT/OrechMenachemPy/tree/main]

                                    אם זה קבצים שאתה רוצה לשלוח אותם לאוצריא לתועלת הכלל, ניתן להעלות דרך אתר אוצריא בלשונית 'הוספת ספר'.

                                    לגבי קבצי טקסט עם עיצוב מארקדאון, כרגע בהכנסצם בצורה ישירה לקבצים אישיים דרך ההגדרות העיצוב לא יוצג כתקנו באוצריא, כי כרגע היא לא תומכת במארקדאון. לכן צריך קודם להמיר אותם לקבצי טקסט עם תגיות HTML ע"י הקוד שהביא לך @האדם-החושב
                                    מה ש @meir כתב לך לא רלוונטי בכלל, כמו שכתב לך כבר @האדם-החושב

                                    מקווה שעניתי לך על כל שאלותיך.

                                    תגובה 1 תגובה אחרונה
                                    1
                                    • האדם החושבה האדם החושב

                                      @meir הנקודה היא שאוצריא לא תומכת בכל תגי הhtml, בנוסף - אוצריא מרנדרת שורה אחרי שורה, מה שיוצר מצב שכל העץ אמור להיות בשורה בודדת.

                                      M
                                      M
                                      meir
                                      כתב ב נערך לאחרונה על ידי
                                      #17

                                      @האדם-החושב כתב:

                                      הנקודה היא שאוצריא לא תומכת בכל תגי הhtml

                                      איזה תגים של html שמיוצגים בmd לא נתמך באוצריא?

                                      ע"ה דכו"עע האדם החושבה 2 תגובות תגובה אחרונה
                                      0
                                      • M meir

                                        @האדם-החושב כתב:

                                        הנקודה היא שאוצריא לא תומכת בכל תגי הhtml

                                        איזה תגים של html שמיוצגים בmd לא נתמך באוצריא?

                                        ע"ה דכו"עע
                                        ע"ה דכו"עע
                                        ע"ה דכו"ע
                                        כתב ב נערך לאחרונה על ידי
                                        #18

                                        @meir כתב:

                                        @האדם-החושב כתב:

                                        הנקודה היא שאוצריא לא תומכת בכל תגי הhtml

                                        איזה תגים של html שמיוצגים בmd לא נתמך באוצריא?

                                        איך שזה נראה זו הרשימה הזו בקוד למעלה:

                                        VOID_TAGS = {
                                            "br", "hr", "img", "iframe", "svg", "video", "audio", "source",
                                            "input", "col", "area", "embed",
                                        }
                                        
                                        יום חדש מתחילי תגובה 1 תגובה אחרונה
                                        0
                                        • ע"ה דכו"עע ע"ה דכו"ע

                                          @meir כתב:

                                          @האדם-החושב כתב:

                                          הנקודה היא שאוצריא לא תומכת בכל תגי הhtml

                                          איזה תגים של html שמיוצגים בmd לא נתמך באוצריא?

                                          איך שזה נראה זו הרשימה הזו בקוד למעלה:

                                          VOID_TAGS = {
                                              "br", "hr", "img", "iframe", "svg", "video", "audio", "source",
                                              "input", "col", "area", "embed",
                                          }
                                          
                                          יום חדש מתחילי
                                          יום חדש מתחילי
                                          יום חדש מתחיל
                                          מנהל ספריית אוצריא
                                          כתב ב נערך לאחרונה על ידי
                                          #19

                                          @ע-ה-דכו-ע זה לא נכון!
                                          אין לי מושג מהיכן הבאת את הרשימה הזו, אבל לכה"פ התגים: "br", "hr", "img" וודאי נתמכים באוצריא.

                                          ע"ה דכו"עע תגובה 1 תגובה אחרונה
                                          1
                                          • יום חדש מתחילי יום חדש מתחיל

                                            @ע-ה-דכו-ע זה לא נכון!
                                            אין לי מושג מהיכן הבאת את הרשימה הזו, אבל לכה"פ התגים: "br", "hr", "img" וודאי נתמכים באוצריא.

                                            ע"ה דכו"עע
                                            ע"ה דכו"עע
                                            ע"ה דכו"ע
                                            כתב ב נערך לאחרונה על ידי
                                            #20

                                            @יום-חדש-מתחיל כתב:

                                            @ע-ה-דכו-ע זה לא נכון!
                                            אין לי מושג מהיכן הבאת את הרשימה הזו, אבל לכה"פ התגים: "br", "hr", "img" וודאי נתמכים באוצריא.

                                            טוב, האמת שאתה צודק, אפילו לא עברתי על הרשימה עצמה, רק קצת עברתי מלמעלה על הקוד ש @האדם-החושב הביא כאן למעלה וזה היה נראה לי רשימה של תגיות להסרה, עכשיו אני רואה שיש שם הערה שהרשימה הזו היא של תגיות שצריכות להישאר גם אם הם לא מכילות טקסט...

                                            תגובה 1 תגובה אחרונה
                                            1

                                            שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

                                            נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

                                            בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                                            הרשמה התחברות

                                            • התחברות

                                            • אין לך חשבון עדיין? הרשמה

                                            • התחברו או הירשמו כדי לחפש.
                                            • פוסט ראשון
                                              פוסט אחרון