• דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    • הרשמה
    • התחברות

    🚀 הכירו את הטי"ל V1.0: המהפכה התורנית בקו שלכם כבר כאן!

    מתוזמן נעוץ נעול הועבר הסברים מסודרים ממשתמשים
    1 פוסטים 1 כותבים 14 צפיות 1 עוקבים
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • תגובה כנושא
    התחברו כדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • L מנותק
      lavitoren הטי"ל
      נערך לאחרונה על ידי lavitoren הטי"ל

      בפניכם יצירת השנה

      שלום לכל חברי קהילת "ימות המשיח" היקרים!

      מי מאיתנו לא חלם להפוך את הקו הטלפוני שלו לספריה תורנית אדירה? מי לא רצה להקים שלוחת ש"ס מלאה, תנ"ך לפי פרקים, או שולחן ערוך מפורט?

      עד היום, זה אמר דבר אחד: שבועות של עבודה ידנית סיזיפית. פתיחת אלפי שלוחות, הגדרת קבצי ext.ini אחד-אחד, חישוב ספרות (digits), ריפוד אפסים (001, 01) ובניית היררכיה מסובכת.
      היום, כל זה נגמר.

      אני שמח להגיש לכם את "הטי"ל V1.0" (הכלי הטלפוני ליצירת ספריות) – כלי עוצמתי, יוקרתי ובלתי נתפס שיעשה עבורכם את כל העבודה השחורה בכמה דקות של "קסם" טכנולוגי.

      מה הטי"ל יודע לעשות? (תחזיקו חזק):

      ✅ ש"ס בבלי וירושלמי: הקמת כל המסכתות והדפים (כולל פיצול לעמוד א' וב'!) בלחיצת כפתור.

      ✅ חמישה חומשי תורה: מבנה גאוני של חומש -> פרשיות השבוע -> 8 עליות (מראשון עד מפטיר).

      ✅ תנ"ך מלא: כ"ד ספרים מחולקים לפרקים בצורה מושלמת.

      ✅ שולחן ערוך ורמב"ם: הקמת כל הסימנים וההלכות, כולל אפשרות לפיצול אוטומטי לסעיפים.

      ✅ משניות: כל ששת סדרי משנה עם חלוקה לפרקים ותתי-משניות.

      למה זה הכלי הכי חזק שראיתם?

      💎 ממשק Premium: עיצוב Dark-Mode יוקרתי שמרגיש כמו תוכנת עריכה מקצועית.

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

      💎 שליטה מוחלטת: אתם בוחרים אם השלוחה תהיה להשמעה (playfile) או להקלטה (record).

      💎 מנגנון הגנה: כפתור עצירה מיידי למקרה שהתחרטתם באמצע.

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

      מוגש באהבה לכל העוסקים במלאכת הקוד!

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

      טיפ קטן ממני: כשאתם רואים את הלוג (Log) רץ בשידור חי ומקים דף אחרי דף, סימן אחרי סימן – פשוט שבו לאחור עם כוס קפה ותראו איך הטכנולוגיה עובדת בשביל התורה.
      תהנו!

      להלן הקוד המצורף עם הוראות הכנה"

      <!DOCTYPE html>
      <html lang="he" dir="rtl">
      <head>
          <meta charset="UTF-8">
          <title>הטי"ל - הכלי הטלפוני ליצירת ספריות v1.3</title>
          <style>
              :root {
                  --bg-dark: #121212;
                  --surface: #1e1e1e;
                  --surface-light: #2d2d2d;
                  --primary: #3b82f6;
                  --primary-hover: #2563eb;
                  --accent: #f59e0b;
                  --danger: #ef4444;
                  --text-main: #e2e8f0;
                  --text-dim: #94a3b8;
                  --border: #334155;
                  --success: #10b981;
              }
      
              body { 
                  font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; 
                  background-color: var(--bg-dark); 
                  color: var(--text-main); 
                  margin: 0; 
                  padding: 20px; 
                  line-height: 1.5;
                  text-align: right;
              }
      
              .wrapper { max-width: 1200px; margin: 0 auto; }
      
              header { 
                  border-bottom: 1px solid var(--border); 
                  padding-bottom: 20px; 
                  margin-bottom: 30px; 
                  display: flex; 
                  justify-content: space-between; 
                  align-items: center; 
              }
      
              h1 { margin: 0; font-size: 22px; font-weight: 800; color: var(--accent); letter-spacing: -0.5px; }
              .version { font-size: 14px; background: var(--border); padding: 4px 10px; border-radius: 4px; color: #fff; margin-right: 10px; }
      
              .dashboard { display: grid; grid-template-columns: 350px 1fr; gap: 20px; }
      
              .card { 
                  background: var(--surface); 
                  border: 1px solid var(--border); 
                  border-radius: 12px; 
                  padding: 20px; 
                  box-shadow: 0 4px 20px rgba(0,0,0,0.5);
              }
      
              .lib-selector { 
                  display: grid; 
                  grid-template-columns: 1fr; 
                  gap: 10px; 
                  margin-bottom: 20px; 
              }
      
              .lib-btn { 
                  background: var(--surface-light); 
                  border: 1px solid var(--border); 
                  color: var(--text-main); 
                  padding: 12px; 
                  border-radius: 8px; 
                  cursor: pointer; 
                  text-align: right; 
                  font-weight: 600; 
                  transition: all 0.2s;
                  display: flex;
                  align-items: center;
                  gap: 10px;
                  font-size: 15px;
              }
      
              .lib-btn:hover { border-color: var(--primary); background: #252525; }
              .lib-btn.active { background: var(--primary); border-color: var(--primary); color: white; }
      
              .form-group { margin-bottom: 15px; }
              label { display: block; font-size: 13px; color: var(--text-dim); margin-bottom: 6px; font-weight: 600; }
              
              input, select { 
                  width: 100%; 
                  background: var(--bg-dark); 
                  border: 1px solid var(--border); 
                  border-radius: 6px; 
                  padding: 10px; 
                  color: white; 
                  box-sizing: border-box;
                  outline: none;
                  font-family: inherit;
              }
      
              input:focus { border-color: var(--primary); }
      
              .options-panel { 
                  background: #1a202c; 
                  border-right: 4px solid var(--accent); 
                  padding: 15px; 
                  border-radius: 6px; 
                  margin-bottom: 20px; 
              }
      
              .scroll-area { 
                  height: 500px; 
                  overflow-y: auto; 
                  border: 1px solid var(--border); 
                  background: var(--bg-dark); 
                  padding: 10px; 
                  border-radius: 8px; 
                  display: grid; 
                  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); 
                  gap: 8px; 
              }
      
              .masechet-item { 
                  background: var(--surface-light); 
                  padding: 8px; 
                  border-radius: 4px; 
                  display: flex; 
                  align-items: center; 
                  gap: 8px; 
                  font-size: 13px;
              }
              .masechet-item input { width: auto; cursor: pointer; }
      
              .seder-title { 
                  grid-column: 1 / -1; 
                  background: var(--border); 
                  padding: 4px 10px; 
                  font-size: 12px; 
                  font-weight: 800; 
                  color: var(--accent); 
                  margin-top: 10px;
                  border-radius: 4px;
                  display: flex;
                  justify-content: space-between;
                  align-items: center;
              }
      
              .seder-checkbox {
                  width: auto !important;
                  margin: 0;
                  cursor: pointer;
              }
      
              .btn-run { 
                  background: var(--primary); color: white; border: none; padding: 15px; border-radius: 8px; 
                  font-weight: 800; cursor: pointer; width: 100%; font-size: 17px; box-shadow: 0 4px 10px rgba(59, 130, 246, 0.3);
              }
              .btn-stop { background: var(--danger); color: white; border: none; padding: 15px; border-radius: 8px; font-weight: 800; cursor: pointer; width: 100%; display: none; font-size: 17px; }
      
              .progress-wrapper { margin-top: 20px; }
              .progress-bar-bg { background: var(--surface-light); height: 14px; border-radius: 7px; overflow: hidden; }
              .progress-bar-fill { background: linear-gradient(90deg, var(--success), #34d399); height: 100%; width: 0%; transition: width 0.3s; }
              .progress-status { font-size: 12px; color: var(--text-dim); margin-top: 8px; display: flex; justify-content: space-between; }
      
              .log-container { 
                  margin-top: 20px; background: #000; color: #00ff00; font-family: 'Consolas', monospace; 
                  font-size: 12px; padding: 15px; border-radius: 8px; height: 220px; overflow-y: auto; border: 1px solid var(--border);
                  direction: ltr; text-align: left;
              }
      
              ::-webkit-scrollbar { width: 8px; }
              ::-webkit-scrollbar-track { background: var(--bg-dark); }
              ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
          </style>
      </head>
      <body>
      
      <div class="wrapper">
          <header>
              <h1>פתיחת ספריה תורנית מטורפת עצומת מימדים לקו שלכם <span class="version">הטי"ל V1.3</span></h1>
              <div id="connectionStatus" style="color: var(--success); font-size: 13px;">● מוכן לביצוע</div>
          </header>
      
          <div class="dashboard">
              <div class="card">
                  <label>סוג תוכן להקמה</label>
                  <div class="lib-selector">
                      <button class="lib-btn active" onclick="loadLibrary('bavli', this)">📖 ש"ס בבלי</button>
                      <button class="lib-btn" onclick="loadLibrary('yerushalmi', this)">🕍 ש"ס ירושלמי</button>
                      <button class="lib-btn" onclick="loadLibrary('torah', this)">📜 תורה (חומשים ופרשיות)</button>
                      <button class="lib-btn" onclick="loadLibrary('chagim', this)">🎉 חגים ומועדים</button>
                      <button class="lib-btn" onclick="loadLibrary('tanakh', this)">📚 תנ"ך (כ"ד ספרים)</button>
                      <button class="lib-btn" onclick="loadLibrary('mishnah', this)">🗳️ משניות</button>
                      <button class="lib-btn" onclick="loadLibrary('rambam', this)">⚖️ רמב"ם (היד החזקה)</button>
                      <button class="lib-btn" onclick="loadLibrary('shulchan', this)">🖋️ שולחן ערוך</button>
                  </div>
      
                  <div class="form-group">
                      <label>סוג שלוחת הקצה (היחידה הקטנה ביותר)</label>
                      <select id="endFolderType">
                          <option value="playfile">השמעת קבצים (playfile)</option>
                          <option value="record">הקלטת הודעות (record)</option>
                      </select>
                  </div>
      
                  <div class="form-group" id="groupHierarchical" style="display:none;">
                      <input type="checkbox" id="hierarchicalSedarim" style="width:auto; margin-left:10px;"> 
                      <label style="display:inline; color: white;" for="hierarchicalSedarim">הקם לפי סדרים (יוצר תת-תיקיות לפי סדרים)</label>
                  </div>
      
                  <div class="form-group">
                      <label>טוקן גישה API</label>
                      <input type="text" id="token" placeholder="0770000000:123456">
                  </div>
      
                  <div class="form-group">
                      <label>נתיב יעד (תיקייה בקו)</label>
                      <input type="text" id="targetPath" placeholder="למשל: 1/5">
                  </div>
      
                  <div class="form-group">
                      <label>מספר שלוחה להתחלה</label>
                      <input type="number" id="startNum" value="1">
                  </div>
      
                  <button class="btn-run" id="startBtn" onclick="process()">🚀 התחל הקמה</button>
                  <button class="btn-stop" id="cancelBtn" onclick="abort()">🛑 עצור פעולה</button>
      
                  <div class="progress-wrapper" id="progWrapper" style="display:none;">
                      <div class="progress-bar-bg"><div class="progress-bar-fill" id="progBar"></div></div>
                      <div class="progress-status"><span id="progText">0%</span><span id="progCounts">0 / 0</span></div>
                  </div>
              </div>
      
              <div class="card">
                  <div id="optionsPanel" class="options-panel">
                      <div id="shasOptions">
                          <input type="checkbox" id="splitAmudim" style="width:auto; margin-left:10px;"> 
                          <label style="display:inline; color: white;" for="splitAmudim">פצל דפים לעמוד א' וב'</label>
                      </div>
                      <div id="torahOptions" style="display:none;">
                          <input type="checkbox" id="noAliyot" style="width:auto; margin-left:10px;"> 
                          <label style="display:inline; color: white;" for="noAliyot">ללא עליות לתורה (פרשה היא השמעת קבצים ישירה)</label>
                      </div>
                      <div id="mishnahOptions" style="display:none;">
                          <label style="color: white;">כמות תתי-שלוחות (משניות/הלכות/פסוקים):</label>
                          <input type="number" id="mishCount" value="0" style="width:100px;">
                      </div>
                      <div id="shulchanOptions" style="display:none;">
                          <label style="color: white;">כמות סעיפים בכל סימן (0 לסימנים בלבד):</label>
                          <input type="number" id="seifimCount" value="0" style="width:100px;">
                      </div>
                  </div>
      
                  <div style="display:flex; justify-content: space-between; margin-bottom: 15px;">
                      <label>בחירת ספרים / מסכתות</label>
                      <div>
                          <button onclick="selectAll(true)" style="background:none; border:1px solid var(--border); color:var(--text-dim); cursor:pointer; padding:2px 10px; border-radius:4px; font-size:11px;">בחר הכל</button>
                          <button onclick="selectAll(false)" style="background:none; border:1px solid var(--border); color:var(--text-dim); cursor:pointer; padding:2px 10px; border-radius:4px; font-size:11px; margin-right:5px;">נקה הכל</button>
                      </div>
                  </div>
      
                  <div class="scroll-area" id="masechtotList"></div>
                  <div class="log-container" id="logBox">ממתין לפקודה...</div>
              </div>
          </div>
      </div>
      
      <script>
          let isAborted = false;
          let currentLib = 'bavli';
      
          const fullDb = {
              torah: [{ seder: "חמישה חומשי תורה", items: [
                  { n: "בראשית", p: ["בראשית", "נח", "לך לך", "וירא", "חיי שרה", "תולדות", "ויצא", "וישלח", "וישב", "מקץ", "ויגש", "ויחי"] },
                  { n: "שמות", p: ["שמות", "וארא", "בא", "בשלח", "יתרו", "משפטים", "תרומה", "תצוה", "כי תשא", "ויקהל", "פקודי"] },
                  { n: "ויקרא", p: ["ויקרא", "צו", "שמיני", "תזריע", "מצורע", "אחרי מות", "קדושים", "אמור", "בהר", "בחקותי"] },
                  { n: "במדבר", p: ["במדבר", "נשא", "בהעלותך", "שלח", "קרח", "חקת", "בלק", "פינחס", "מטות", "מסעי"] },
                  { n: "דברים", p: ["דברים", "ואתחנן", "עקב", "ראה", "שופטים", "כי תצא", "כי תבוא", "נצבים", "וילך", "האזינו", "וזאת הברכה"] }
              ]}],
              chagim: [
                  { seder: "1. ימים נוראים וחגי תשרי", items: [
                      { n: "ראש השנה", p: ["ערב ראש השנה", "תפילות ראש השנה", "תקיעת שופר", "סימני ראש השנה"] },
                      { n: "עשרת ימי תשובה", p: ["סליחות", "שבת תשובה", "כפרות"] },
                      { n: "יום הכיפורים", p: ["ערב יום הכיפורים", "תפילת כל נדרי", "נעילה", "מוצאי יום הכיפורים"] },
                      { n: "סוכות", p: ["בניית סוכה", "ארבעת המינים", "הושענא רבא", "שמיני עצרת ושמחת תורה"] }
                  ]},
                  { seder: "2. חגים מדרבנן", items: [
                      { n: "חנוכה", p: ["הדלקת נרות", "מעוז צור", "ענייני חנוכה", "סביבון"] },
                      { n: "פורים", p: ["תענית אסתר", "קריאת המגילה", "משלוח מנות ומתנות לאביונים", "סעודת פורים"] }
                  ]},
                  { seder: "3. חגי ניסן וספירת העומר", items: [
                      { n: "פסח", p: ["בדיקת חמץ וביעורו", "הערב הסדר", "הגדה של פסח", "שביעי של פסח ואיסרו חג"] },
                      { n: "ספירת העומר ול\"ג בעומר", p: ["דיני ספירת העומר", "ימי העומר", "ל\"ג בעומר ומנהגיו"] },
                      { n: "שבועות", p: ["ערב שבועות", "תיקון ליל שבועות", "מגילת רות"] }
                  ]},
                  { seder: "4. בין המצרים ותעניות השנה", items: [
                      { n: "תעניות השנה", p: ["צום גדליה", "עשרה בטבת", "תענית אסתר", "שבעה עשר בתמוז"] },
                      { n: "בין המצרים ותשעה באב", p: ["שלושת השבועות", "תשעה באב ותיקון חצות", "קינות ומגילת איכה"] }
                  ]}
              ],
              tanakh: [{ seder: "תורה", items: [{ n: "בראשית", c: 50 }, { n: "שמות", c: 40 }, { n: "ויקרא", c: 27 }, { n: "במדבר", c: 36 }, { n: "דברים", c: 34 }]}, { seder: "נביאים", items: [{ n: "יהושע", c: 24 }, { n: "שופטים", c: 21 }, { n: "שמואל א", c: 31 }, { n: "שמואל ב", c: 24 }, { n: "מלכים א", c: 22 }, { n: "מלכים ב", c: 25 }, { n: "ישעיהו", c: 66 }, { n: "ירמיהו", c: 52 }, { n: "יחזקאל", c: 48 }, { n: "תרי עשר", c: 67 }]}, { seder: "כתובים", items: [{ n: "תהילים", c: 150 }, { n: "משלי", c: 31 }, { n: "איוב", c: 42 }, { n: "שיר השירים", c: 8 }, { n: "רות", c: 4 }, { n: "איכה", c: 5 }, { n: "קהלת", c: 12 }, { n: "אסתר", c: 10 }, { n: "דניאל", c: 12 }, { n: "עזרא", c: 10 }, { n: "נחמיה", c: 13 }, { n: "דברי הימים א", c: 29 }, { n: "דברי הימים ב", c: 36 }]}],
              mishnah: [{ seder: "סדר זרעים", items: [{ n: "ברכות", c: 9 }, { n: "פאה", c: 8 }, { n: "דמאי", c: 7 }, { n: "כלאיים", c: 9 }, { n: "שביעית", c: 10 }, { n: "תרומות", c: 11 }, { n: "מעשרות", c: 5 }, { n: "מעשר שני", c: 5 }, { n: "חלה", c: 4 }, { n: "ערלה", c: 3 }, { n: "ביכורים", c: 3 }]}, { seder: "סדר מועד", items: [{ n: "שבת", c: 24 }, { n: "עירובין", c: 10 }, { n: "פסחים", c: 10 }, { n: "שקלים", c: 8 }, { n: "יומא", c: 8 }, { n: "סוכה", c: 5 }, { n: "ביצה", c: 5 }, { n: "ראש השנה", c: 4 }, { n: "תענית", c: 4 }, { n: "מגילה", c: 4 }, { n: "מועד קטן", c: 3 }, { n: "חגיגה", c: 3 }]}, { seder: "סדר נשים", items: [{ n: "יבמות", c: 16 }, { n: "כתובות", c: 13 }, { n: "נדרים", c: 11 }, { n: "נזיר", c: 9 }, { n: "סוטה", c: 9 }, { n: "גיטין", c: 9 }, { n: "קידושין", c: 4 }]}, { seder: "סדר נזיקין", items: [{ n: "בבא קמא", c: 10 }, { n: "בבא מציעא", c: 10 }, { n: "בבא בתרא", c: 10 }, { n: "סנהדרין", c: 11 }, { n: "מכות", c: 3 }, { n: "שבועות", c: 8 }, { n: "עדיות", c: 8 }, { n: "עבודה זרה", c: 5 }, { n: "אבות", c: 6 }, { n: "הוריות", c: 3 }]}, { seder: "סדר קדשים", items: [{ n: "זבחים", c: 14 }, { n: "מנחות", c: 13 }, { n: "חולין", c: 12 }, { n: "בכורות", c: 9 }, { n: "ערכין", c: 9 }, { n: "תמורה", c: 7 }, { n: "כריתות", c: 6 }, { n: "מעילה", c: 6 }, { n: "תמיד", c: 7 }, { n: "מידות", c: 5 }, { n: "קינים", c: 3 }]}, { seder: "סדר טהרות", items: [{ n: "כלים", c: 30 }, { n: "אהלות", c: 18 }, { n: "נגעים", c: 14 }, { n: "פרה", c: 12 }, { n: "טהרות", c: 10 }, { n: "מקואות", c: 10 }, { n: "נידה", c: 10 }, { n: "מכשירין", c: 6 }, { n: "זבים", c: 5 }, { n: "טבול יום", c: 4 }, { n: "ידיים", c: 4 }, { n: "עוקצין", c: 3 }]}],
              bavli: [{ seder: "ש\"ס בבלי", items: [{ n: "ברכות", c: 64 }, { n: "שבת", c: 157 }, { n: "עירובין", c: 105 }, { n: "פסחים", c: 121 }, { n: "שקלים", c: 22 }, { n: "יומא", c: 88 }, { n: "סוכה", c: 56 }, { n: "ביצה", c: 40 }, { n: "ראש השנה", c: 35 }, { n: "תענית", c: 31 }, { n: "מגילה", c: 32 }, { n: "מועד קטן", c: 29 }, { n: "חגיגה", c: 27 }, { n: "יבמות", c: 122 }, { n: "כתובות", c: 112 }, { n: "נדרים", c: 91 }, { n: "נזיר", c: 66 }, { n: "סוטה", c: 49 }, { n: "גיטין", c: 90 }, { n: "קידושין", c: 82 }, { n: "בבא קמא", c: 119 }, { n: "בבא מציעא", c: 119 }, { n: "בבא בתרא", c: 176 }, { n: "סנהדרין", c: 113 }, { n: "מכות", c: 24 }, { n: "שבועות", c: 49 }, { n: "עבודה זרה", c: 76 }, { n: "הוריות", c: 14 }, { n: "זבחים", c: 120 }, { n: "מנחות", c: 110 }, { n: "חולין", c: 142 }, { n: "בכורות", c: 61 }, { n: "ערכין", c: 34 }, { n: "תמורה", c: 34 }, { n: "כריתות", c: 28 }, { n: "מעילה", c: 22 }, { n: "תמיד", c: 33, s: 25 }, { n: "מידות", c: 37, s: 34 }, { n: "קינים", c: 25, s: 22 }, { n: "נידה", c: 73 }]}],
              yerushalmi: [{ seder: "ש\"ס ירושלמי", items: [{ n: "ברכות", c: 68 }, { n: "פאה", c: 37 }, { n: "דמאי", c: 34 }, { n: "כלאיים", c: 44 }, { n: "שביעית", c: 31 }, { n: "תרומות", c: 59 }, { n: "מעשרות", c: 26 }, { n: "מעשר שני", c: 33 }, { n: "חלה", c: 28 }, { n: "ערלה", c: 20 }, { n: "ביכורים", c: 13 }, { n: "שבת", c: 92 }, { n: "עירובין", c: 65 }, { n: "פסחים", c: 71 }, { n: "יומא", c: 42 }, { n: "שקלים", c: 33 }, { n: "סוכה", c: 26 }, { n: "ראש השנה", c: 22 }, { n: "ביצה", c: 22 }, { n: "תענית", c: 26 }, { n: "מגילה", c: 34 }, { n: "חגיגה", c: 22 }, { n: "מועד קטן", c: 19 }, { n: "יבמות", c: 85 }, { n: "סוטה", c: 47 }, { n: "כתובות", c: 72 }, { n: "נדרים", c: 40 }, { n: "גיטין", c: 54 }, { n: "נזיר", c: 44 }, { n: "קידושין", c: 48 }, { n: "בבא קמא", c: 44 }, { n: "בבא מציעא", c: 37 }, { n: "בבא בתרא", c: 34 }, { n: "סנהדרין", c: 68 }, { n: "מכות", c: 9 }, { n: "שבועות", c: 44 }, { n: "עבודה זרה", c: 37 }, { n: "הוריות", c: 19 }, { n: "נידה", c: 13 }]}],
              rambam: [{ seder: "רמב\"ם", items: [{ n: "מדע", c: 46 }, { n: "אהבה", c: 46 }, { n: "זמנים", c: 97 }, { n: "נשים", c: 51 }, { n: "קדושה", c: 54 }, { n: "הפלאה", c: 43 }, { n: "זרעים", c: 84 }, { n: "עבודה", c: 97 }, { n: "קרבנות", c: 45 }, { n: "טהרה", c: 172 }, { n: "נזיקין", c: 61 }, { n: "קניין", c: 74 }, { n: "משפטים", c: 75 }, { n: "שופטים", c: 81 }]}],
              shulchan: [{ seder: "שולחן ערוך", items: [{ n: "אורח חיים", c: 697 }, { n: "יורה דעה", c: 403 }, { n: "אבן העזר", c: 178 }, { n: "חושן משפט", c: 427 }]}]
          };
      
          function toHebrew(num) {
              if (num <= 0) return "";
              let str = "";
              const hundreds = ["", "ק", "ר", "ש", "ת"];
              const tens = ["", "י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ"];
              const realOnes = ["", "א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט"];
              if (num >= 100) { str += hundreds[Math.floor(num / 100)]; num %= 100; }
              if (num === 15) return str + "טו";
              if (num === 16) return str + "טז";
              str += tens[Math.floor(num / 10)];
              str += realOnes[num % 10];
              return str;
          }
      
          function selectAll(val) { document.querySelectorAll('#masechtotList input[type="checkbox"]').forEach(i => i.checked = val); }
      
          function toggleSeder(sourceCheckbox, sederName) {
              const checkboxes = document.querySelectorAll(`.masechet-item[data-seder="${sederName}"] input[type="checkbox"]`);
              checkboxes.forEach(cb => cb.checked = sourceCheckbox.checked);
          }
      
          function loadLibrary(libKey, btn) {
              currentLib = libKey;
              document.querySelectorAll('.lib-btn').forEach(b => b.classList.remove('active'));
              if(btn) btn.classList.add('active');
              
              document.getElementById('shasOptions').style.display = (libKey.includes('shas') || libKey.includes('bavli') || libKey.includes('yerushalmi')) ? 'block' : 'none';
              document.getElementById('torahOptions').style.display = (libKey === 'torah') ? 'block' : 'none';
              document.getElementById('mishnahOptions').style.display = (libKey === 'mishnah' || libKey === 'rambam' || libKey === 'tanakh') ? 'block' : 'none';
              document.getElementById('shulchanOptions').style.display = (libKey === 'shulchan') ? 'block' : 'none';
      
              const showHierarchical = (libKey === 'mishnah' || libKey === 'bavli' || libKey === 'yerushalmi');
              document.getElementById('groupHierarchical').style.display = showHierarchical ? 'block' : 'none';
              if(!showHierarchical) document.getElementById('hierarchicalSedarim').checked = false;
      
              const listDiv = document.getElementById('masechtotList');
              listDiv.innerHTML = "";
              let unitLabel = libKey.includes('shas') || libKey.includes('bavli') || libKey.includes('yerushalmi') ? "דפים" : (libKey === 'shulchan' ? "סימנים" : (libKey === 'torah' ? "פרשיות" : (libKey === 'chagim' ? "נושאים" : "פרקים")));
      
              fullDb[libKey].forEach(s => {
                  const title = document.createElement('div');
                  title.className = 'seder-title';
                  title.innerHTML = `<span>${s.seder}</span> <input type="checkbox" class="seder-checkbox" title="בחר הכל בסדר זה" onclick="toggleSeder(this, '${s.seder}')">`;
                  listDiv.appendChild(title);
                  
                  s.items.forEach(m => {
                      const item = document.createElement('div');
                      item.className = 'masechet-item';
                      item.setAttribute('data-seder', s.seder);
                      let countLabel = m.p ? m.p.length : m.c;
                      item.innerHTML = `<input type="checkbox" value="${m.n}" data-seder-name="${s.seder}" data-c="${m.c||0}" data-p='${JSON.stringify(m.p||[])}' data-s="${m.s||(libKey.includes('shas')?2:1)}"> <span>${m.n} (${countLabel} ${unitLabel})</span>`;
                      listDiv.appendChild(item);
                  });
              });
          }
      
          function abort() { isAborted = true; }
      
          async function process() {
              isAborted = false;
              const token = document.getElementById('token').value.trim();
              const startFolder = parseInt(document.getElementById('startNum').value);
              const endType = document.getElementById('endFolderType').value;
              const targetPath = document.getElementById('targetPath').value.trim().replace(/^\/|\/$/g, "");
              const hierarchical = document.getElementById('hierarchicalSedarim').checked;
              const selected = Array.from(document.querySelectorAll('#masechtotList .masechet-item input[type="checkbox"]:checked'));
      
              if(!token || selected.length === 0) return alert("הזן טוקן ובחר פריטים!");
      
              document.getElementById('startBtn').style.display = "none";
              document.getElementById('cancelBtn').style.display = "block";
              document.getElementById('progWrapper').style.display = "block";
              const log = document.getElementById('logBox');
              log.innerHTML = "🏁 מתחיל בתהליך...";
      
              let tasks = [];
              
              if (hierarchical) {
                  let sedarimMap = {};
                  selected.forEach(input => {
                      const sederName = input.dataset.sederName;
                      if (!sedarimMap[sederName]) sedarimMap[sederName] = [];
                      sedarimMap[sederName].push(input);
                  });
      
                  let sederKeys = Object.keys(sedarimMap);
                  let sederCounter = startFolder;
      
                  sederKeys.forEach((sederName, si) => {
                      const sederItems = sedarimMap[sederName];
                      const autoSederDigits = sederKeys.length >= 10 ? 2 : 1;
                      const sederFolderNum = String(sederCounter).padStart(autoSederDigits, '0');
                      const sederPath = targetPath ? `${targetPath}/${sederFolderNum}` : sederFolderNum;
      
                      tasks.push({ p: sederPath, t: sederName, b: `type=menu\ntitle=${sederName}\ndigits=${sederItems.length >= 10 ? 2 : 1}` });
      
                      let itemCounter = 1;
                      sederItems.forEach(input => {
                          const name = input.value;
                          const subItems = JSON.parse(input.dataset.p);
                          const count = parseInt(input.dataset.c);
                          const start = parseInt(input.dataset.s);
                          
                          const totalSubCount = subItems.length > 0 ? subItems.length : (count - start + 1);
                          const autoDigits = totalSubCount >= 10 ? 2 : 1;
      
                          const rootF = String(itemCounter).padStart(sederItems.length >= 10 ? 2 : 1, '0');
                          const rootP = `${sederPath}/${rootF}`;
      
                          tasks.push({ p: rootP, t: name, b: `type=menu\ntitle=${name}\ndigits=${autoDigits}` });
      
                          for (let i = start; i <= count; i++) {
                              const sf = String(i).padStart(autoDigits, '0');
                              const sp = `${rootP}/${sf}`;
                              const heb = toHebrew(i);
                              let title = (currentLib.includes('shas') || currentLib.includes('bavli') || currentLib.includes('yerushalmi')) ? `דף ${heb}` : `פרק ${heb}`;
                              
                              const splitS = document.getElementById('splitAmudim').checked && (currentLib.includes('shas') || currentLib.includes('bavli') || currentLib.includes('yerushalmi'));
                              const mishCount = parseInt(document.getElementById('mishCount').value);
                              let hasSub = splitS || (currentLib === 'mishnah' && mishCount > 0);
                              
                              tasks.push({ p: sp, t: title, b: `type=${hasSub?'menu':endType}\ntitle=${title}${hasSub ? '\ndigits='+(splitS ? 1 : 2) : ''}` });
      
                              if(splitS) {
                                  tasks.push({ p: `${sp}/1`, t: "עמוד א", b: `type=${endType}\ntitle=עמוד א` });
                                  tasks.push({ p: `${sp}/2`, t: "עמוד ב", b: `type=${endType}\ntitle=עמוד ב` });
                              }
                              if(currentLib === 'mishnah' && mishCount > 0) {
                                  for(let m=1; m<=mishCount; m++) tasks.push({ p: `${sp}/${String(m).padStart(m >= 10 ? 2 : 1, '0')}`, t: `משנה ${toHebrew(m)}`, b: `type=${endType}\ntitle=משנה ${toHebrew(m)}` });
                              }
                          }
                          itemCounter++;
                      });
                      sederCounter++;
                  });
      
              } else {
                  let counter = startFolder;
                  selected.forEach(input => {
                      const name = input.value;
                      const subItems = JSON.parse(input.dataset.p);
                      const count = parseInt(input.dataset.c);
                      const start = parseInt(input.dataset.s);
                      
                      const totalSubCount = subItems.length > 0 ? subItems.length : (count - start + 1);
                      const autoDigits = totalSubCount >= 10 ? 2 : 1;
      
                      const rootF = String(counter).padStart(selected.length > 9 ? 2 : 1, '0');
                      const rootP = targetPath ? `${targetPath}/${rootF}` : rootF;
      
                      tasks.push({ p: rootP, t: name, b: `type=menu\ntitle=${name}\ndigits=${autoDigits}` });
      
                      if (currentLib === 'torah') {
                          const noAliyotChecked = document.getElementById('noAliyot').checked;
                          subItems.forEach((pn, pi) => {
                              const pf = String(pi + 1).padStart(autoDigits, '0');
                              const pp = `${rootP}/${pf}`;
                              
                              if (noAliyotChecked) {
                                  tasks.push({ p: pp, t: `פרשת ${pn}`, b: `type=${endType}\ntitle=פרשת ${pn}` });
                              } else {
                                  tasks.push({ p: pp, t: `פרשת ${pn}`, b: `type=menu\ntitle=פרשת ${pn}\ndigits=1` });
                                  ["ראשון","שני","שלישי","רביעי","חמישי","שישי","שביעי","מפטיר"].forEach((aly, ai) => {
                                      tasks.push({ p: `${pp}/${ai+1}`, t: `עליה ${aly}`, b: `type=${endType}\ntitle=עליה ${aly}` });
                                  });
                              }
                          });
                      } else if (currentLib === 'chagim') {
                          subItems.forEach((subName, si) => {
                              const sf = String(si + 1).padStart(autoDigits, '0');
                              const sp = `${rootP}/${sf}`;
                              tasks.push({ p: sp, t: subName, b: `type=${endType}\ntitle=${subName}` });
                          });
                      } else {
                          for (let i = start; i <= count; i++) {
                              const sf = String(i).padStart(autoDigits, '0');
                              const sp = `${rootP}/${sf}`;
                              const heb = toHebrew(i);
                              let title = (currentLib.includes('shas') || currentLib.includes('bavli') || currentLib.includes('yerushalmi')) ? `דף ${heb}` : (currentLib === 'shulchan' ? `סימן ${heb}` : `פרק ${heb}`);
                              
                              const splitS = document.getElementById('splitAmudim').checked && (currentLib.includes('shas') || currentLib.includes('bavli') || currentLib.includes('yerushalmi'));
                              const seifim = parseInt(document.getElementById('seifimCount').value);
                              const mishCount = parseInt(document.getElementById('mishCount').value);
                              
                              let hasSub = splitS || (currentLib === 'shulchan' && seifim > 0) || (['mishnah','rambam','tanakh'].includes(currentLib) && mishCount > 0);
                              
                              tasks.push({ p: sp, t: title, b: `type=${hasSub?'menu':endType}\ntitle=${title}${hasSub ? '\ndigits='+(splitS ? 1 : 2) : ''}` });
      
                              if(splitS) {
                                  tasks.push({ p: `${sp}/1`, t: "עמוד א", b: `type=${endType}\ntitle=עמוד א` });
                                  tasks.push({ p: `${sp}/2`, t: "עמוד ב", b: `type=${endType}\ntitle=עמוד ב` });
                              }
                              if(currentLib === 'shulchan' && seifim > 0) {
                                  for(let s=1; s<=seifim; s++) tasks.push({ p: `${sp}/${String(s).padStart(s >= 10 ? 2 : 1, '0')}`, t: `סעיף ${toHebrew(s)}`, b: `type=${endType}\ntitle=סעיף ${toHebrew(s)}` });
                              }
                              if(['mishnah','rambam','tanakh'].includes(currentLib) && mishCount > 0) {
                                  let subL = currentLib === 'mishnah' ? "משנה" : (currentLib === 'rambam' ? "הלכה" : "פסוק");
                                  for(let m=1; m<=mishCount; m++) tasks.push({ p: `${sp}/${String(m).padStart(m >= 10 ? 2 : 1, '0')}`, t: `${subL} ${toHebrew(m)}`, b: `type=${endType}\ntitle=${subL} ${toHebrew(m)}` });
                              }
                          }
                      }
                      counter++;
                  });
              }
      
              for (let i = 0; i < tasks.length; i++) {
                  if (isAborted) break;
                  const ok = await upload(token, tasks[i].p, tasks[i].b);
                  if(ok) log.innerHTML += `<div>✓ SUCCESS: ${tasks[i].p}</div>`;
                  else log.innerHTML += `<div style="color:red">✗ FAILED: ${tasks[i].p}</div>`;
                  let pct = Math.round(((i + 1) / tasks.length) * 100);
                  document.getElementById('progBar').style.width = pct + "%";
                  document.getElementById('progText').innerText = pct + "%";
                  document.getElementById('progCounts').innerText = `${i+1} / ${tasks.length}`;
                  log.scrollTop = log.scrollHeight;
              }
      
              document.getElementById('startBtn').style.display = "block";
              document.getElementById('cancelBtn').style.display = "none";
          }
      
          async function upload(token, path, body) {
              const fd = new FormData();
              fd.append('token', token);
              fd.append('path', `ivr2:${path}/ext.ini`);
              fd.append('qqfile', new Blob([body], { type: 'text/plain;charset=utf-8' }), 'ext.ini');
              try {
                  const r = await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, { method: 'POST', body: fd });
                  const d = await r.json();
                  return d && (d.responseStatus === "OK" || d.status === "OK");
              } catch(e) { return false; }
          }
      
          loadLibrary('bavli');
      </script>
      
      </body>
      </html>>
      

      כדי שכולם יוכלו להשתמש בכלי המטורף הזה בקלות, הנה הוראות ההכנה וההפעלה צעד אחר צעד, כתובות בצורה ברורה ופשוטה (בדיוק מה שצריך להדביק בפורום או לשלוח לחברים):

      📋 הוראות הכנה והפעלה ל"הטי"ל V1.0"

      כדי להפוך את הקוד שקיבלתם לתוכנה חיה שעובדת אצלכם במחשב, בצעו את הפעולות הבאות:

      שלב 1: יצירת הקובץ

      העתיקו את כל הקוד (מהמילה <!DOCTYPE html> ועד הסוף).
      פתחו במחשב את התוכנה "פנקס רשימות" (Notepad).
      הדביקו את הקוד בתוך פנקס הרשימות.
      לחצו על תפריט קובץ (File) -> שמור בשם (Save As).

      זה השלב הכי חשוב:

      תחת "שם הקובץ", כתבו: hatil.html (חובה להוסיף את הסיומת .html).
      תחת "שמור כסוג" (Save as type), בחרו ב-"כל הקבצים" (All Files).
      לחצו על שמור.

      שלב 2: פתיחת התוכנה

      גשו לתיקייה שבה שמרתם את הקובץ.
      לחצו עליו פעמיים (הוא אמור להיפתח בדפדפן כרום או אדג' שלכם).
      מזל טוב! אתם בתוך ממשק ה-Premium של הטי"ל.

      שלב 3: הגדרות והקמה (איך יוצרים את הספריה?)

      טוקן (API Token): הכניסו את הטוקן שלכם מימות המשיח (המספר של הקו, נקודתיים, והסיסמה האישית. למשל: 0771234567:123456).
      נתיב יעד: אם אתם רוצים שהספריה תיפתח בתוך שלוחה קיימת, כתבו את מספרה (למשל: 1/5). אם תשאירו ריק, הספריה תיפתח בשורש של הקו.
      בחירת תוכן: לחצו על הכפתורים בצד ימין (ש"ס, תורה, שו"ע וכו'). הרשימה תתעדכן אוטומטית.
      סימון: סמנו ב-V את המסכתות או הספרים שאתם רוצים להקים (אפשר להשתמש בכפתור "בחר הכל").
      סוג שלוחה: בחרו אם אתם רוצים שהשלוחות יהיו "השמעת קבצים" או "הקלטה".

      שלב 4: שיגור!

      לחצו על הכפתור הכחול והגדול: "🚀 התחל הקמה".
      בצד שמאל למטה ייפתח לכם ה-Log (יומן הפעולות). אתם תראו בזמן אמת איך המערכת מקימה שלוחה אחרי שלוחה בשיא המהירות.
      בסיום, תקבלו הודעה ירוקה: "הקמת הספריה הושלמה בהצלחה!".
      💡 טיפ חשוב:
      אם בחרתם להקים ספריה ענקית (כמו כל הש"ס), זה יכול לקחת כמה דקות בגלל הכמות האדירה של השלוחות. אל תסגרו את הדף עד לסיום הפעולה.
      בהצלחה ובהנאה!

      תגובות כאן

      תגובה 1 תגובה אחרונה תגובה ציטוט 2

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

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

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

      הרשמה התחברות
      • פוסט ראשון
        פוסט אחרון