Skip to content

Latest commit

 

History

History
128 lines (104 loc) · 4.68 KB

File metadata and controls

128 lines (104 loc) · 4.68 KB

kit:: DEPRECIATED description:: This kit never fully implemented. depreciated?:: [[Wednesday, Aug 14th, 2024]]

  • logseq.kits.setStatic(async function newKitButton(div) {
      const DEFAULT_CLASSES = "kit run inline button-style button-shape hover active";
      const ICON_DATA_ATTRIBUTE = "data-button-icon";
      const LABEL_DATA_ATTRIBUTE = "data-button-text";
      const kitPage = div.dataset.kitPage;
    
      const sanitizeAttribute = (value) =>
        value && (value.startsWith("$") || value === "''") ? "" : value;
    
      const classModifiers = sanitizeAttribute(div.dataset.buttonClass);
      let buttonText = sanitizeAttribute(div.dataset.buttonLabel);
    
      const applyStyleFilter = (defaultClasses, customClasses) => {
        const classArray = defaultClasses.split(" ");
        const customClassArray = customClasses.split(" ");
        const additionalClasses = [];
        const appliedStyleFilters = {};
    
        customClassArray.forEach((className) => {
          if (className.startsWith("-")) {
            const classToRemove = className.slice(1);
            const removeIndex = classArray.indexOf(classToRemove);
            if (removeIndex !== -1) classArray.splice(removeIndex, 1);
          } else if (className.startsWith("+")) {
            const [expressionName, argumentValue] = className.slice(1).split(":");
            appliedStyleFilters[expressionName] = argumentValue || true;
          } else {
            additionalClasses.push(className);
          }
        });
    
        return {
          classes: [...classArray, ...additionalClasses].join(" "),
          appliedStyleFilters
        };
      };
    
      const { classes: buttonClassValue, appliedStyleFilters } = 
        classModifiers ? applyStyleFilter(DEFAULT_CLASSES, classModifiers) : { classes: DEFAULT_CLASSES, appliedStyleFilters: {} };
    
      const processLabelForKits = async (label) => {
        const wordArray = label.split(" ");
        const labelPromises = wordArray.map(async (word) => {
          if (!word.startsWith("|") || !word.endsWith("|")) return word;
          const kitFunction = word.slice(1, -1);
          return logseq.kits[kitFunction] ? await logseq.kits[kitFunction]() : word;
        });
    
        return (await Promise.all(labelPromises)).join(" ");
      };
    
      buttonText = await processLabelForKits(buttonText);
    
      const processStyledLabelText = (label, styleFilters) => {
        const words = label.split(' ');
        
        const parsedFilters = Object.entries(styleFilters).reduce((acc, [key, value]) => {
          if (typeof value === 'string') {
            try {
              acc[key] = JSON.parse(value);
            } catch (e) {
              console.error(`Error parsing filter value for ${key}:`, e);
              acc[key] = value; // Use the original value if parsing fails
            }
          } else {
            acc[key] = value;
          }
          return acc;
        }, {});
    
        const processedWords = words.map((word, index) => {
          let processedWord = word;
          
          if (parsedFilters['bold-nth-word']) {
            const boldIndices = Array.isArray(parsedFilters['bold-nth-word']) 
              ? parsedFilters['bold-nth-word'] 
              : [parseInt(parsedFilters['bold-nth-word'])];
            
            if (boldIndices.includes(index + 1)) {
              processedWord = `<span class="bold">${processedWord}</span>`;
            }
          }
          
          // Add more style conditions here as needed
          
          return processedWord;
        });
    
        return processedWords.join(' ');
      };
    
      buttonText = processStyledLabelText(buttonText, appliedStyleFilters);
    
      const buttonTextDataAttribute = buttonText ? `${LABEL_DATA_ATTRIBUTE}="true"` : "";
      const buttonIcon = sanitizeAttribute(div.dataset.buttonIcon);
      const iconGlyphCodes = (glyphs) =>
        glyphs
          .split(" ")
          .map((hexCode) => `&#x${hexCode};`)
          .join(" ");
    
      const iconDataAttribute = buttonIcon && `${ICON_DATA_ATTRIBUTE}="${iconGlyphCodes(buttonIcon)}"`;
    
      const processDataAttributes = (input) => {
        if (!input) return "";
        return input
          .split(' ')
          .filter(pair => pair.includes('='))
          .map(pair => {
            const [key, ...valueParts] = pair.split('=');
            const value = valueParts.join('=').replace(/^['"]|['"]$/g, '');
            return `data-${key}="${value}"`;
          })
          .join(' ');
      };
    
      const kitArguments = sanitizeAttribute(div.dataset.arguments);
      const dataAttributes = processDataAttributes(kitArguments);
    
      div.innerHTML = `<button class="${buttonClassValue}" data-kit='runpage' data-kit-macro="kitButton" data-page-name='${kitPage}' ${iconDataAttribute} ${buttonTextDataAttribute} ${dataAttributes} type="button">${buttonText}</button>`;
    });
    • {{evalparent}}