123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- function getBlockElements() {
- const blockDiv = document.createElement("div");
- const descButton = document.createElement('button');
- descButton.textContent = 'Add Description';
- const imgButton = document.createElement('button');
- imgButton.textContent = 'Add Image';
- const h = document.createElement("H2");
- const input = document.createElement("INPUT");
- input.setAttribute("type", "text");
- const inputButton = document.createElement('button')
- inputButton.textContent = 'Title新增/修改';
- contentDiv.append(blockDiv);
- blockDiv.appendChild(h);
- blockDiv.appendChild(input);
- blockDiv.appendChild(inputButton);
- blockDiv.appendChild(descButton);
- blockDiv.appendChild(imgButton);
- return {
- blockDiv: blockDiv,
- h: h,
- titleInput: input,
- inputButton: inputButton,
- descButton: descButton,
- imgButton: imgButton
- };
- }
- function getdescElements(blockDiv){
- const descDiv = document.createElement("div");
- const p = document.createElement("p");
- const descTextArea = document.createElement("TEXTAREA");
- descTextArea.setAttribute("type", "text");
- const descInputButton = document.createElement('button')
- descInputButton.textContent = 'Description新增/修改';
- descDiv.appendChild(p);
- descDiv.appendChild(descTextArea);
- descDiv.appendChild(descInputButton);
- blockDiv.appendChild(descDiv);
- return {
- p: p,
- descTextArea: descTextArea,
- descInputButton: descInputButton
- };
- }
- function getImgElements(blockDiv) {
- const imgDiv = document.createElement("div");
- const img = document.createElement("img");
- const imgInput = document.createElement("INPUT");
- const widthInput = document.createElement("INPUT");
- const heightInput = document.createElement("INPUT");
- const imgInputButton = document.createElement('button');
- imgInputButton.textContent = 'Image新增/修改';
- imgDiv.appendChild(img);
- imgDiv.appendChild(imgInput);
- imgDiv.appendChild(widthInput);
- imgDiv.appendChild(heightInput);
- imgDiv.appendChild(imgInputButton);
- blockDiv.appendChild(imgDiv);
- return {
- img: img,
- imgInput: imgInput,
- widthInput: widthInput,
- heightInput: heightInput,
- imgInputButton: imgInputButton
- };
- }
- function addDataToBlockArray(dataObject, blockArray, blockIndex, dataIndex) {
- if ('data' in blockArray[blockIndex]) {
- blockArray[blockIndex].data[dataIndex] = dataObject
- } else {
- blockArray[blockIndex].data = [dataObject];
- }
- return blockArray;
- }
- function parseMd(content) {
- const parseTitle = line => {
- var title = '';
- title = line.replace('## **', '');
- title = title.replace('**', '');
- return title;
- };
-
- const parseAmpImg = line => {
- if (line.includes('alt')) {
- const altParameter = line.replace(/alt=|"/g, '');
- return {alt: altParameter};
- } else if (line.includes('src')) {
- const srcParameter = line.replace(/src=|"/g, '');
- return {src: srcParameter};
- } else if (line.includes('height')) {
- const heightParameter = line.replace(/height=|"/g, '');
- return {height: heightParameter};
- } else if (line.includes('width')) {
- const widthParameter = line.replace(/width=|"/g, '');
- return {width: widthParameter};
- } else if (line.includes('layout')) {
- const layoutParameter = line.replace(/layout=|"|>/g, '');
- }
- }
- var blockArray = [{title: ''}];
- var blockCount = 0;
- var preDataIndex;
- var parseBlockDiv, preBlockindex;
- var preImg, preImgObject;
- var preImgObject = {'image': {}}
- var isNotFrontMatterCount = 0;
- var isAmpImgRange = false;
- for (const line of content.split('\n')) {
- if (isNotFrontMatterCount < 2) {
- if (line.includes('---')) {
- isNotFrontMatterCount += 1;
- }
- continue;
- }
- if (isAmpImgRange === true) {
- imgParamObject = parseAmpImg(line);
- preImgObject.image = {...preImgObject.image, ...imgParamObject};
- const key = _.get(_.keys(imgParamObject), 0);
- preImg.setAttribute(key, _.get(imgParamObject, `${key}`));
- continue;
- }
- if (line.includes('##')) {
- var preDataIndex = 0;
- preBlockindex = blockCount;
- blockCount = blockCount + 1;
- const {blockDiv, h, titleInput, inputButton, descButton, imgButton} = getBlockElements();
- parseBlockDiv = blockDiv;
- const title = parseTitle(line);
- const text = title;
- blockArray[preBlockindex].title = text;
- h.textContent = text;
- inputButton.onclick = function() {
- const text = titleInput.value;
- blockArray[preBlockindex].title = text;
- h.textContent = text;
- }
- } else if (line.includes('<amp-img')) {
- if (line.includes('</amp-img>')) {
- blockArray = addDataToBlockArray(preImgObject, blockArray, preBlockindex, ownDataIndex)
- isAmpImgRange = false;
- continue;
- }
- const ownDataIndex = preDataIndex;
- preDataIndex += 1;
- isAmpImgRange = true;
- const {img, imgInput, widthInput, heightInput, imgInputButton} = getImgElements(parseBlockDiv);
- preImg = img;
- imgInputButton.onclick = function() {
- preImg.setAttribute('src', imgInput.value);
- preImg.setAttribute('width', widthInput.value);
- preImg.setAttribute('height', heightInput.value);
- preImg.setAttribute('alt', 'image field');
- const imgObject = {image: {src: imgInput.value,
- height: heightInput.value,
- width: widthInput.value,
- alt: 'image field',
- layout: 'responsive'}};
- blockArray = addDataToBlockArray(imgObject, blockArray, preBlockindex, ownDataIndex)
- }
- } else {
- const ownDataIndex = preDataIndex;
- preDataIndex += 1;
- const {p, descTextArea, descInputButton} = getdescElements(parseBlockDiv);
- const text = line;
- p.textContent = text;
- blockArray = addDataToBlockArray({description: {text: text}}, blockArray, preBlockindex, ownDataIndex)
- descInputButton.onclick = function () {
- const text = descTextArea.value;
- p.textContent = text;
- addDataToBlockArray({description: {text: text}}, blockArray, preBlockindex, ownDataIndex)
- }
- }
- }
- return {blockArray: blockArray, blockCount: blockCount}
- }
- const content = `---
- title: "公仔與爵士鼓"
- date: 2021-02-23T13:18:22+08:00
- draft: false
- type: "collection"
- url: "/collection/doll_and_drum_set"
- image: "https://image-cdn-flare.qdm.cloud/q57568769580e2/image/data/2020/11/09/7f6087c94211080bfe2edfb0180891a7.jpg"
- description: "很喜歡現代風格居家設計,利用大理石紋路牆面作為客廳的......"
- ---
- ## **空間主人|公仔控 \- 陳氏夫妻檔**\n\
- \n\
- 初次見到陳先生,其實在心裡偷偷覺得,他好像有點嚴肅、不太笑,跟我們打個招呼後,就趕著出門上課了,但實際上多相處後才發現,「外冷內熱」比較貼近真實的他。
- <amp-img
- alt="小寶優居"
- src="https://image-cdn-flare.qdm.cloud/q57568769580e2/image/data/2020/11/10/7200f7c668635a2ef399723c5410ca90.jpg"
- height="340"
- width="604"
- layout="responsive">
- </amp-img>
- `
- const contentDiv = document.getElementsByClassName('ui segment')[0];
- const titleButton = document.getElementById('title_button');
- const submitButton = document.getElementById('submit_button');
- var {blockArray, blockCount} = parseMd(content);
- var dataIndex;
- titleButton.onclick = function() {
- dataIndex = 0;
- const blockIndex = blockCount;
- blockCount = blockCount + 1;
- const {blockDiv, h, titleInput, inputButton, descButton, imgButton} = getBlockElements();
- inputButton.onclick = function() {
- const text = titleInput.value;
- if (blockIndex < blockArray.length) {
- blockArray[blockIndex].title = text;
- h.textContent = text;
- } else {
- blockArray[blockIndex] = {title: text};
- h.textContent = text;
- }
- }
- descButton.onclick = function() {
- const ownDataIndex = dataIndex;
- dataIndex += 1;
- const {p, descTextArea, descInputButton} = getdescElements(blockDiv);
- descInputButton.onclick = function() {
- const text = descTextArea.value;
- p.textContent = text;
- addDataToBlockArray({description: {text: text}}, blockArray, blockIndex, ownDataIndex)
- }
- }
- imgButton.onclick = function() {
- const ownDataIndex = dataIndex;
- dataIndex += 1;
- const {img, imgInput, widthInput, heightInput, imgInputButton} = getImgElements(blockDiv);
- imgInputButton.onclick = function() {
- img.setAttribute('src', imgInput.value);
- img.setAttribute('width', widthInput.value);
- img.setAttribute('height', heightInput.value);
- img.setAttribute('alt', 'image field');
- const imgObject = {image: {src: imgInput.value,
- height: heightInput.value,
- width: widthInput.value,
- alt: 'image field',
- layout: 'responsive'}};
- blockArray = addDataToBlockArray(imgObject, blockArray, blockIndex, ownDataIndex)
- }
- }
- }
- submitButton.onclick = function() {
- var mdContent = '';
- for (var idx=0; idx<blockArray.length; idx++) {
- mdContent += `## **${_.get(blockArray[idx], 'title', '')}**\n`
- for (var data of _.get(blockArray[idx], 'data', [])) {
- if (_.get(_.keys(data), 0) === 'description') {
- mdContent += _.get(data, 'description.text', '') + '\n';
- } else if (_.get(_.keys(data), 0) === 'image') {
- ampImgForm = `<amp-img\
- \n alt="${_.get(data, 'image.alt', '小寶優居')}"\
- \n src="${_.get(data, 'image.src', '')}"\
- \n height="${_.get(data, 'image.height', 300)}"\
- \n width="${_.get(data, 'image.width', 400)}"\
- \n layout="${_.get(data, 'image.layout', 'responsive')}>"\
- \n</amp-img>`;
- mdContent += ampImgForm;
- }
- }
- }
- console.log(mdContent);
- console.log(blockArray);
- }
|