123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- import { INTERVAL_DATA_ATTRIBUTE } from '../../components/Autoplay/constants';
- import { SRC_DATA_ATTRIBUTE, SRCSET_DATA_ATTRIBUTE } from '../../components/LazyLoad/constants';
- import { URL } from './constants';
- export interface BuildHtmlArgs {
- tag?: string;
- id?: string;
- length?: number;
- arrows?: boolean;
- progress?: boolean;
- autoplay?: boolean;
- src?: boolean | string;
- dataSrc?: boolean | string;
- dataSrcset?: boolean | string;
- dataInterval?: number[];
- json?: string;
- }
- /**
- * Returns an HTML string for building a slider.
- *
- * @param args - Arguments.
- *
- * @return A built HTML.
- */
- export function buildHtml(args: BuildHtmlArgs = {}): string {
- const {
- tag = 'div',
- id,
- length = 10,
- arrows,
- progress,
- autoplay,
- src = true,
- dataSrc,
- dataSrcset,
- dataInterval,
- json,
- } = args;
- return `
- <${ tag } class="splide"${ id ? ` id=${ id }` : '' }${ json ? ` data-splide='${ json }'` : '' }>
- <div class="splide__track">
- <ul class="splide__list">
- ${ generateSlides(length, src, dataSrc, dataSrcset, dataInterval) }
- </ul>
- </div>
- ${ arrows ? HTML_ARROWS : '' }
- ${ progress ? HTML_PROGRESS : '' }
- ${ autoplay ? HTML_AUTOPLAY : '' }
- </${ tag }>
- `;
- }
- /**
- * Generates slides.
- *
- * @param length - A number of slides.
- * @param src - Whether to add src attribute or not.
- * @param dataSrc - Whether to add data-splide-lazy attribute or not.
- * @param dataSrcset - Whether to add data-splide-lazy-srcset attribute or not.
- * @param dataInterval - An array with autoplay interval.
- *
- * @return A built HTML.
- */
- export function generateSlides(
- length: number,
- src?: boolean | string,
- dataSrc?: boolean | string,
- dataSrcset?: boolean | string,
- dataInterval: number[] = [],
- ): string {
- return Array.from<string>({ length }).reduce((html, item, index) => {
- const attrs: string[] = [];
- if (dataInterval) {
- const interval = dataInterval[index];
- if (interval) {
- attrs.push(`${ INTERVAL_DATA_ATTRIBUTE }="${ interval }"`);
- }
- }
- html += `<li class="splide__slide" ${ attrs.join(' ') }>`;
- const imgAttrs = [`alt="${ index }"`];
- if (src) {
- imgAttrs.push(`src="${ URL }/${ typeof src === 'string' ? src + '-' : '' }${ index }.jpg"`);
- }
- if (dataSrc) {
- imgAttrs.push(`${ SRC_DATA_ATTRIBUTE }="${ URL }/${ typeof dataSrc === 'string' ? dataSrc + '-' : '' }${ index }.jpg"`);
- }
- if (dataSrcset) {
- imgAttrs.push(
- `${ SRCSET_DATA_ATTRIBUTE }="${ URL }/${ typeof dataSrcset === 'string' ? dataSrcset + '-' : '' }${ index }.jpg 320w"`,
- );
- }
- html += `<img ${ imgAttrs.join(' ') }>`;
- html += `</li>`;
- return html;
- }, '');
- }
- export const HTML_ARROWS = `
- <div class="splide__arrows">
- <button class="splide__arrow splide__arrow--prev">
- Prev
- </button>
- <button class="splide__arrow splide__arrow--next">
- Next
- </button>
- </div>
- `;
- export const HTML_PROGRESS = `
- <div class="splide__progress">
- <div class="splide__progress__bar">
- </div>
- </div>
- `;
- export const HTML_AUTOPLAY = `
- <button class="splide__toggle">
- <span class="splide__toggle__play">Play</span>
- <span class="splide__toggle__pause">Pause</span>
- </button>
- `;
|