html.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { INTERVAL_DATA_ATTRIBUTE } from '../../components/Autoplay/constants';
  2. import { SRC_DATA_ATTRIBUTE, SRCSET_DATA_ATTRIBUTE } from '../../components/LazyLoad/constants';
  3. import { URL } from './constants';
  4. export interface BuildHtmlArgs {
  5. tag?: string;
  6. id?: string;
  7. length?: number;
  8. arrows?: boolean;
  9. progress?: boolean;
  10. autoplay?: boolean;
  11. src?: boolean | string;
  12. dataSrc?: boolean | string;
  13. dataSrcset?: boolean | string;
  14. dataInterval?: number[];
  15. json?: string;
  16. }
  17. /**
  18. * Returns an HTML string for building a slider.
  19. *
  20. * @param args - Arguments.
  21. *
  22. * @return A built HTML.
  23. */
  24. export function buildHtml(args: BuildHtmlArgs = {}): string {
  25. const {
  26. tag = 'div',
  27. id,
  28. length = 10,
  29. arrows,
  30. progress,
  31. autoplay,
  32. src = true,
  33. dataSrc,
  34. dataSrcset,
  35. dataInterval,
  36. json,
  37. } = args;
  38. return `
  39. <${ tag } class="splide"${ id ? ` id=${ id }` : '' }${ json ? ` data-splide='${ json }'` : '' }>
  40. <div class="splide__track">
  41. <ul class="splide__list">
  42. ${ generateSlides(length, src, dataSrc, dataSrcset, dataInterval) }
  43. </ul>
  44. </div>
  45. ${ arrows ? HTML_ARROWS : '' }
  46. ${ progress ? HTML_PROGRESS : '' }
  47. ${ autoplay ? HTML_AUTOPLAY : '' }
  48. </${ tag }>
  49. `;
  50. }
  51. /**
  52. * Generates slides.
  53. *
  54. * @param length - A number of slides.
  55. * @param src - Whether to add src attribute or not.
  56. * @param dataSrc - Whether to add data-splide-lazy attribute or not.
  57. * @param dataSrcset - Whether to add data-splide-lazy-srcset attribute or not.
  58. * @param dataInterval - An array with autoplay interval.
  59. *
  60. * @return A built HTML.
  61. */
  62. export function generateSlides(
  63. length: number,
  64. src?: boolean | string,
  65. dataSrc?: boolean | string,
  66. dataSrcset?: boolean | string,
  67. dataInterval: number[] = [],
  68. ): string {
  69. return Array.from<string>({ length }).reduce((html, item, index) => {
  70. const attrs: string[] = [];
  71. if (dataInterval) {
  72. const interval = dataInterval[index];
  73. if (interval) {
  74. attrs.push(`${ INTERVAL_DATA_ATTRIBUTE }="${ interval }"`);
  75. }
  76. }
  77. html += `<li class="splide__slide" ${ attrs.join(' ') }>`;
  78. const imgAttrs = [`alt="${ index }"`];
  79. if (src) {
  80. imgAttrs.push(`src="${ URL }/${ typeof src === 'string' ? src + '-' : '' }${ index }.jpg"`);
  81. }
  82. if (dataSrc) {
  83. imgAttrs.push(`${ SRC_DATA_ATTRIBUTE }="${ URL }/${ typeof dataSrc === 'string' ? dataSrc + '-' : '' }${ index }.jpg"`);
  84. }
  85. if (dataSrcset) {
  86. imgAttrs.push(
  87. `${ SRCSET_DATA_ATTRIBUTE }="${ URL }/${ typeof dataSrcset === 'string' ? dataSrcset + '-' : '' }${ index }.jpg 320w"`,
  88. );
  89. }
  90. html += `<img ${ imgAttrs.join(' ') }>`;
  91. html += `</li>`;
  92. return html;
  93. }, '');
  94. }
  95. export const HTML_ARROWS = `
  96. <div class="splide__arrows">
  97. <button class="splide__arrow splide__arrow--prev">
  98. Prev
  99. </button>
  100. <button class="splide__arrow splide__arrow--next">
  101. Next
  102. </button>
  103. </div>
  104. `;
  105. export const HTML_PROGRESS = `
  106. <div class="splide__progress">
  107. <div class="splide__progress__bar">
  108. </div>
  109. </div>
  110. `;
  111. export const HTML_AUTOPLAY = `
  112. <button class="splide__toggle">
  113. <span class="splide__toggle__play">Play</span>
  114. <span class="splide__toggle__pause">Pause</span>
  115. </button>
  116. `;