test skadi

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » test skadi » списки всего на свете » биржа


биржа

Сообщений 1 страница 3 из 3

1

[html]
<div id="jobs-root">
<div class="m-jobs">
  <div class="wrap">
    <!-- Радиокнопки. Они стоят перед навигацией и контентом -->
    <input type="radio" name="tabs-jobs" id="t1" checked>
    <input type="radio" name="tabs-jobs" id="t2">
    <input type="radio" name="tabs-jobs" id="t3">
    <input type="radio" name="tabs-jobs" id="t4">
    <input type="radio" name="tabs-jobs" id="t5">

    <!-- Левое меню -->
    <div class="nav" aria-label="Категории">
      <label class="tab" for="t1">общественная сфера
      </label>
      <label class="tab" for="t2">образовательная сфера
      </label>
      <label class="tab" for="t3">коммерческая сфера
      </label>
      <label class="tab" for="t4">творческая сфера
      </label>
      <label class="tab" for="t5">другое
      </label>
    </div>

    <!-- Правая часть — контент вкладок -->
    <div class="panes">
      <!-- Вкладка 1 общественная сфера-->
      <section class="pane" data-pane="1">

      </section>

      <!-- Вкладка 2 образовательная сфера -->
      <section class="pane" data-pane="2">

      </section>

      <!-- Вкладка 3 коммерческая сфера-->
      <section class="pane" data-pane="3">

      </section>

      <!-- Вкладка 4 творческая сфера -->
      <section class="pane" data-pane="4">

      </section>

      <!-- Вкладка 5 ДРУГОЕ -->
      <section class="pane" data-pane="5">

      </section>
    </div>
  </div>
</div>

</div>
</div>

[/html]

0

2

Код:
<mjb><h10>old cranky cemetery</h10>
<h11>старое скрипучее кладбище</h11>
<b1>смотритель: helene nill</b1>
<b1>труп: lana del rey, jack harlow</b1>
</mjb>

0

3

Код:
window.addEventListener("DOMContentLoaded", function () {

  const FORUM_ID = 2;
  const CACHE_KEY = `jobs_cache_${FORUM_ID}`;
  const CACHE_TTL = 1000 * 60 * 60;

  const root = document.querySelector("#jobs-root");

  console.log("JOBS START");
  console.log("ROOT:", root);

  if (!root) return;

  // ======================
  // 🧼 CLEAN (кодировка костыль)
  // ======================
  function clean(str) {
    return (str || "")
      .replace(/\uFFFD/g, "")
      .replace(/�+/g, "")
      .replace(/\s+/g, " ")
      .trim();
  }

  // ======================
  // CATEGORY NORMALIZER
  // ======================
 function normalizeCategory(text) {
  const t = clean(text).toLowerCase();

  if (t.includes("обще")) return "общественная сфера";
  if (t.includes("образ")) return "образовательная сфера";
  if (t.includes("коммер") || t.includes("услуг") || t.includes("магаз")) {
    return "коммерческая сфера";
  }
  if (t.includes("твор")) return "творческая сфера";

  return "другое";
}

  // ======================
  // CACHE
  // ======================
  try {
    const cached = localStorage.getItem(CACHE_KEY);

    if (cached) {
      const parsed = JSON.parse(cached);

      if (Date.now() - parsed.time < CACHE_TTL) {
        console.log("CACHE HIT");
        render(parsed.data);
        return;
      }
    }
  } catch(e) {
    console.warn("CACHE ERROR", e);
  }

  load();

  // ======================
  // SAFE GET
  // ======================
  function get(root, cls) {
    const el = root?.querySelector(`.${cls}`);
    return clean(el?.textContent || el?.innerText || "");
  }

  // ======================
  // LOAD
  // ======================
  function load() {

    console.log("LOADING TOPICS...");

    fetch(`/api.php?method=topic.get&forum_id=${FORUM_ID}`)
      .then(r => r.json())
      .then(d => {

        const topics = d.response || [];
        console.log("TOPICS:", topics.length);

        return Promise.all(
          topics.map(t =>
            fetch(`/viewtopic.php?id=${t.id}`)
              .then(r => r.text())
          )
        );
      })
      .then(pages => {

        const jobs = {};

        pages.forEach((html, i) => {

          console.log("PAGE", i, "HAS m-ank:", html.includes("m-ank"));

          const temp = document.createElement("div");
          temp.innerHTML = html;

          const firstPost = temp.querySelector(".post");
          const userId = firstPost?.dataset?.userId || "0";

          const ank = temp.querySelector(".m-ank");


          console.log("ANK FOUND:", !!ank);

console.log("RAW JOBCAT:", ank.querySelector(".m-job")?.innerHTML);

          if (!ank) return;

          const jobCat = clean(ank.querySelector(".m-job")?.textContent);
          const jobPlace = clean(ank.querySelector(".m-job-pl")?.textContent);
          const jobTitle = clean(ank.querySelector(".m-job-t")?.textContent);
          const name = get(ank, "m-name");

          console.log("JOB DATA:", {
            jobCat,
            jobPlace,
            jobTitle,
            name
          });

          // ❗ если вообще пусто — НЕ убиваем страницу
          if (!jobCat && !jobPlace && !jobTitle) return;

          const cat = normalizeCategory(jobCat || "");
          const place = jobPlace || "без места работы";
          const title = jobTitle && jobTitle.length
            ? jobTitle
            : "без должности";

          if (!jobs[cat]) jobs[cat] = {};
          if (!jobs[cat][place]) jobs[cat][place] = {};
          if (!jobs[cat][place][title]) jobs[cat][place][title] = [];

          jobs[cat][place][title].push({
            name,
            id: userId
          });

        });

        console.log("FINAL JOBS:", jobs);

        localStorage.setItem(CACHE_KEY, JSON.stringify({
          time: Date.now(),
          data: jobs
        }));

        render(jobs);
      })
      .catch(err => console.error("API ERROR", err));
  }

  // ======================
  // RENDER
  // ======================
  function render(jobs) {

    console.log("RENDER START");

    const categories = [
      "общественная сфера",
      "образовательная сфера",
      "коммерческая сфера",
      "творческая сфера",
      "другое"
    ];

    function renderPane(cat) {

      const places = jobs[cat] || {};

      return Object.entries(places).map(([place, roles]) => {

        return `
          <mjb>
            <h10>${clean(place)}</h10>

            ${Object.entries(roles).map(([role, people]) => `
              <b1>
                ${clean(role)}:
                ${people.map(p =>
                  `<a href="/profile.php?id=${p.id}">${clean(p.name)}</a>`
                ).join(", ")}
              </b1>
            `).join("")}

          </mjb>
        `;
      }).join("");
    }

    const panes = root.querySelectorAll(".pane");

    console.log("PANES FOUND:", panes.length);

    panes.forEach((pane, i) => {
      const cat = categories[i];
      console.log("RENDER PANE:", cat);
      pane.innerHTML = renderPane(cat);
    });
  }

});

0


Вы здесь » test skadi » списки всего на свете » биржа


Рейтинг форумов | Создать форум бесплатно