Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. // ============================================================================
  2. // Card element generating functions
  3. // ============================================================================
  4. function card_element_title(card_data) {
  5. var title = card_data.title || "";
  6. return '<div class="title">' + title + '</div>';
  7. }
  8. function card_element_icon(card_data) {
  9. var icon = card_data.icon_front || card_data.icon;
  10. var result = "";
  11. if (icon) {
  12. result += '<div class="title-icon-container">';
  13. result += ' <div class="title-icon icon-' + icon + '">';
  14. result += ' </div>';
  15. result += '</div>';
  16. }
  17. return result;
  18. }
  19. function card_element_subtitle(params, card_data) {
  20. var subtitle = params[0] || "";
  21. return '<div class="subtitle">' + subtitle + '</div>';
  22. }
  23. function card_element_ruler(params, card_data) {
  24. return '<div class="ruler"></div>';
  25. }
  26. function card_element_property(params, card_data) {
  27. var result = "";
  28. result += '<div class="property-line">';
  29. result += ' <h4 class="property-name">' + params[0] + '</h4>';
  30. result += ' <p class="property-text">' + params[1] + '</p>';
  31. result += '</div>';
  32. return result;
  33. }
  34. function card_element_description(params, card_data) {
  35. var result = "";
  36. result += '<div class="description-line">';
  37. result += ' <h4 class="description-name">' + params[0] + '</h4>';
  38. result += ' <p class="description-text">' + params[1] + '</p>';
  39. result += '</div>';
  40. return result;
  41. }
  42. function card_element_text(params, card_data) {
  43. var result = "";
  44. result += '<div class="description-line">';
  45. result += ' <p class="description-text">' + params[0] + '</p>';
  46. result += '</div>';
  47. return result;
  48. }
  49. function card_element_section(params, card_data) {
  50. var color = card_data.color_front || card_data.color;
  51. var section = params[0] || "";
  52. return '<h3 style="color:' + color + '">' + section + '</h3>';
  53. }
  54. function card_element_fill(params, card_data) {
  55. var flex = params[0] || "1";
  56. return '<div class="fill" style="flex:' + flex + '"></div>';
  57. }
  58. function card_element_unknown(params, card_data) {
  59. return '<div>' + params.join('<br />') + '</div>';
  60. }
  61. var card_element_generators = {
  62. subtitle: card_element_subtitle,
  63. property: card_element_property,
  64. rule: card_element_ruler,
  65. description: card_element_description,
  66. text: card_element_text,
  67. fill: card_element_fill
  68. };
  69. // ============================================================================
  70. // Card generating functions
  71. // ============================================================================
  72. function card_generate_contents(contents, card_data) {
  73. var result = "";
  74. result += '<div class="content-container">';
  75. result += contents.map(function (value) {
  76. var parts = value.split("|").map(function (str) { return str.trim(); });
  77. var element_name = parts[0];
  78. var element_params = parts.splice(1);
  79. var element_generator = card_element_generators[element_name];
  80. if (element_generator) {
  81. return element_generator(element_params, card_data);
  82. } else {
  83. return card_element_unknown(element_params, card_data);
  84. }
  85. }).join("\n");
  86. result += '</div>';
  87. return result;
  88. }
  89. function card_repeat(card, count) {
  90. var result = [];
  91. for (var i = 0; i < count; ++i) {
  92. result.push(card);
  93. }
  94. return result;
  95. }
  96. function card_generate_color_style(color) {
  97. return 'style="color:' + color + '; border-color:' + color + '; background-color:' + color + '"';
  98. }
  99. function card_generate_color_gradient_style(color) {
  100. return 'style="background: radial-gradient(ellipse at center, white 20%, ' + color + ' 120%)"';
  101. }
  102. function card_generate_front(data) {
  103. var color = data.color_front || data.color || "black";
  104. var style_color = card_generate_color_style(color);
  105. var icon = data.icon_front || data.icon || "";
  106. var count = data.count || 1;
  107. var result = "";
  108. result += '<div class="card" ' + style_color + '>';
  109. result += card_element_icon(data);
  110. result += card_element_title(data);
  111. result += card_generate_contents(data.contents, data);
  112. result += '</div>';
  113. return card_repeat(result, count);
  114. }
  115. function card_generate_back(data) {
  116. var color = data.color_back || data.color || "black";
  117. var style_color = card_generate_color_style(color);
  118. var style_gradient = card_generate_color_gradient_style(color);
  119. var icon = data.icon_back || data.icon || "ace";
  120. var count = data.count || 1;
  121. var result = "";
  122. result += '<div class="card" ' + style_color + '>';
  123. result += ' <div class="card-back" ' + style_gradient + '>';
  124. result += ' <div class="card-back-inner">';
  125. result += ' <div class="back-icon icon-' + icon + '" ' + style_color + '></div>';
  126. result += ' </div>';
  127. result += ' </div>';
  128. result += '</div>';
  129. return card_repeat(result, count);
  130. }
  131. function card_generate_empty(count) {
  132. var style_color = card_generate_color_style("white");
  133. var result = "";
  134. result += '<div class="card" ' + style_color + '>';
  135. result += '</div>';
  136. return card_repeat(result, count);
  137. }
  138. // ============================================================================
  139. // Functions that generate pages of cards
  140. // ============================================================================
  141. function card_pages_split(data, rows, cols) {
  142. var cards_per_page = rows * cols;
  143. var result = [];
  144. for (var i = 0; i < data.length; i += cards_per_page) {
  145. var page = data.slice(i, i + cards_per_page);
  146. result.push(page);
  147. }
  148. return result;
  149. }
  150. function card_pages_merge(front_pages, back_pages) {
  151. var result = [];
  152. for (var i = 0; i < front_pages.length; ++i) {
  153. result.push(front_pages[i]);
  154. result.push(back_pages[i]);
  155. }
  156. return result;
  157. }
  158. function cards_pages_flip_left_right(cards, rows, cols) {
  159. var result = [];
  160. for (var r = 0; r < rows; ++r) {
  161. for (var c = 0; c < cols; ++c) {
  162. var i = r*cols + (cols-1-c);
  163. result.push(cards[i]);
  164. }
  165. }
  166. return result;
  167. }
  168. function card_pages_add_padding(cards, rows, cols) {
  169. var cards_per_page = rows * cols;
  170. var last_page_cards = cards.length % cards_per_page;
  171. if (last_page_cards !== 0) {
  172. return cards.concat(card_generate_empty(cards_per_page - last_page_cards));
  173. } else {
  174. return cards;
  175. }
  176. }
  177. function card_pages_wrap(pages) {
  178. var size = "A4";
  179. var result = "";
  180. for (var i = 0; i < pages.length; ++i) {
  181. result += '<page size="' + size + '">\n';
  182. result += pages[i].join("\n");
  183. result += '</page>\n';
  184. }
  185. return result;
  186. }
  187. function card_pages_generate_html(card_data) {
  188. var rows = 3;
  189. var cols = 3;
  190. // Generate the HTML for each card
  191. var front_cards = [];
  192. var back_cards = [];
  193. card_data.forEach(function (data) {
  194. front_cards = front_cards.concat(card_generate_front(data));
  195. back_cards = back_cards.concat(card_generate_back(data));
  196. });
  197. // Add padding cards so that the last page is full of cards
  198. front_cards = card_pages_add_padding(front_cards, rows, cols);
  199. back_cards = card_pages_add_padding(back_cards, rows, cols);
  200. // Split cards to pages
  201. var front_pages = card_pages_split(front_cards, rows, cols);
  202. var back_pages = card_pages_split(back_cards, rows, cols);
  203. // Shuffle back cards so that they line up with their corresponding front cards
  204. back_pages = back_pages.map(function (page) {
  205. return cards_pages_flip_left_right(page, rows, cols);
  206. });
  207. // Interleave front and back pages so that we can print double-sided
  208. var pages = card_pages_merge(front_pages, back_pages);
  209. // Wrap all pages in a <page> element
  210. return card_pages_wrap(pages);
  211. }
  212. function card_pages_insert_into(card_data, container) {
  213. // Clear the previous content of the document
  214. while (container.hasChildNodes()) {
  215. container.removeChild(container.lastChild);
  216. }
  217. // Insert the HTML
  218. var html = card_pages_generate_html(card_data);
  219. container.innerHTML = html;
  220. }