לדלג לתוכן

משתמש:מוטי בוט/ניסוי5.js

מתוך המכלול, האנציקלופדיה היהודית

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

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
let api = new mw.ForeignApi("https://www.wikidata.org/w/api.php", {
  anonymous: true,
});

async function fetchEntityData(entityId) {
  try {
    const response = await api.get({
      action: "wbgetentities",
      ids: entityId,
      format: "json",
    });
    return response.entities[entityId];
  } catch (error) {
    console.error("Error fetching entity data:", error);
    throw error;
  }
}

async function resolveWikidataIds(ids) {
  const MAX_IDS_PER_REQUEST = 50;
  const chunks = [];

  for (let i = 0; i < ids.length; i += MAX_IDS_PER_REQUEST) {
    chunks.push(ids.slice(i, i + MAX_IDS_PER_REQUEST));
  }

  const resolvedEntities = {};

  for (const chunk of chunks) {
    try {
      const response = await api.get({
        action: "wbgetentities",
        ids: chunk.join("|"),
        format: "json",
      });
      Object.assign(resolvedEntities, response.entities);
    } catch (error) {
      console.error("Error resolving Wikidata IDs:", error);
      throw error;
    }
  }

  return resolvedEntities;
}

function extractClaims(entityData) {
  const claims = entityData.claims;
  const wikidataIds = new Set();
  const parsedClaims = {};

  for (const [property, statements] of Object.entries(claims)) {
    parsedClaims[property] = statements.map((statement) => {
      const mainsnak = statement.mainsnak;
      if (mainsnak.datavalue) {
        const value = mainsnak.datavalue.value;
        switch (mainsnak.datatype) {
          case "wikibase-item":
            wikidataIds.add(value.id);
            return { type: "wikidata-id", value: value.id };
          case "commonsMedia":
            return { type: "commonsMedia", value: value };
          case "url":
            return { type: "url", value: value };
          default:
            return { type: "other", value: value };
        }
      }
      return null;
    }).filter(Boolean);
  }

  return { parsedClaims, wikidataIds: Array.from(wikidataIds) };
}

async function getEntityInfo(entityId) {
  const entityData = await fetchEntityData(entityId);
  const { parsedClaims, wikidataIds } = extractClaims(entityData);

  if (wikidataIds.length > 0) {
    const resolvedEntities = await resolveWikidataIds(wikidataIds);
    for (const [property, statements] of Object.entries(parsedClaims)) {
      statements.forEach((statement) => {
        if (statement.type === "wikidata-id") {
          const resolvedEntity = resolvedEntities[statement.value];
          if (resolvedEntity && resolvedEntity.labels) {
            statement.label = resolvedEntity.labels.en.value;
          }
        }
      });
    }
  }

  return {
    id: entityData.id,
    labels: entityData.labels,
    descriptions: entityData.descriptions,
    claims: parsedClaims,
  };
}

getEntityInfo("Q181").then((data) => console.log(data));