/* コンポーネント内はthisでプロパティを取得したい場合はアロー関数を使わない dataはOK */ const joint_setting = { //共通コンポーネントを登録 components : { 'mhs-header' : httpVueLoader( 'https://vaiden.info/header/mhs-header.vue.php' ) , 'mhs-footer' : httpVueLoader( 'https://vaiden.info/footer/mhs-footer.vue.php' ) , 'mhs-modal' : httpVueLoader( 'https://vaiden.info/mhs-modal.vue' ) , } , mounted : function() { }, created : function() { } , methods : { //クエリパラメータを取得する getParam : function( name , url ) { if(! url ) url = window.location.href; name = name.replace( /[\[\]]/g , "\\$&" ); var regex = new RegExp( "[?&]" + name + "(=([^&#]*)|&|#|$)" ) , results = regex.exec( url ); if(! results ) return null; if(! results[2] ) return ''; return decodeURIComponent( results[2].replace( /\+/g , " " ) ); }, //カテゴリスラッグからカテゴリリストを検索してカテゴリ名を取得する getCategoryBySlug: function( slug ) { if( slug == '' ) return; let category_name = null; const A_cat = []; this.categoryLists.forEach( function( obj , index ) { //含まれていたら配列に追加 if( slug == obj.value ) A_cat.push( obj.text ); }); if( A_cat.length ) category_name = A_cat.join( ' / ' ); return category_name; }, //エスケープした文字列を復元する convert_html : function( obj ) { //※オブジェクトの場合は参照コピーとなるため元データの上書きされる //blocksがなければ終了 if(! obj.hasOwnProperty( 'blocks' ) ) return obj; //スコープの関係で関数をコピー const return_html = this.return_html; Object.keys( obj.blocks ).forEach( function( key ) { //段落タイプであれば if( obj.blocks[ key ].type == 'paragraph' && obj.blocks[ key ].hasOwnProperty( 'data' ) && obj.blocks[ key ].data.hasOwnProperty( 'text' ) ) { //空であれば空文字に置き換え if( obj.blocks[ key ].data.text == '' || obj.blocks[ key ].data.text == ' ' ) { obj.blocks[ key ].data.text = ' '; } else { obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( /\[BR\]/g , "
" ); obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( /\[ENT\]/g , "
" ); obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( /<br>/g , "\n" ); //HTMLを復元する obj.blocks[ key ].data.text = return_html( obj.blocks[ key ].data.text ); } } //見出しタイプであれば else if( obj.blocks[ key ].type == 'header' && obj.blocks[ key ].hasOwnProperty( 'data' ) && obj.blocks[ key ].data.hasOwnProperty( 'text' ) ) { // obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( / /g , " " ); // obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( / /g , " " ); obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( /\[BR\]/g , "
" ); } //イメージタイプであれば else if( obj.blocks[ key ].type == 'image' && obj.blocks[ key ].hasOwnProperty( 'data' ) && obj.blocks[ key ].data.hasOwnProperty( 'caption' ) ) { obj.blocks[ key ].data.caption = obj.blocks[ key ].data.caption.replace( /\[BR\]/g , "
" ); } //引用タイプであれば else if( obj.blocks[ key ].type == 'quote' && obj.blocks[ key ].hasOwnProperty( 'data' ) && obj.blocks[ key ].data.hasOwnProperty( 'text' ) ) { obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( /\[BR\]/g , "
" ); obj.blocks[ key ].data.text = obj.blocks[ key ].data.text.replace( /\[ENT\]/g , "
" ); if( obj.blocks[ key ].data.hasOwnProperty( 'caption' ) ) { obj.blocks[ key ].data.caption = obj.blocks[ key ].data.caption.replace( /\[BR\]/g , "
" ); obj.blocks[ key ].data.caption = obj.blocks[ key ].data.caption.replace( /\[ENT\]/g , "
" ); } } //コードタイプであれば else if( obj.blocks[ key ].type == 'code' && obj.blocks[ key ].hasOwnProperty( 'data' ) && obj.blocks[ key ].data.hasOwnProperty( 'code' ) ) { //HTMLタグを元に戻す obj.blocks[ key ].data.code = obj.blocks[ key ].data.code.replace( /</g , '<' ); obj.blocks[ key ].data.code = obj.blocks[ key ].data.code.replace( />/g , '>' ); //二重引用符を元に戻す obj.blocks[ key ].data.code = obj.blocks[ key ].data.code.replace( /quot;/g , '"' ); obj.blocks[ key ].data.code = obj.blocks[ key ].data.code.replace( /\[ENT\]/g , "\n" ); obj.blocks[ key ].data.code = obj.blocks[ key ].data.code.replace( /\&/g , '&' ); } //区切り線タイプであれば else if( obj.blocks[ key ].type == 'divider' && obj.blocks[ key ].hasOwnProperty( 'data' ) && obj.blocks[ key ].data.hasOwnProperty( 'divider' ) ) { //HTMLタグを元に戻す obj.blocks[ key ].data.divider = obj.blocks[ key ].data.divider.replace( /</g , '<' ); obj.blocks[ key ].data.divider = obj.blocks[ key ].data.divider.replace( />/g , '>' ); //二重引用符を元に戻す obj.blocks[ key ].data.divider = obj.blocks[ key ].data.divider.replace( /quot;/g , '"' ); } }); return obj; } , //エスケープしたHTMLを復元する return_html : function( html ) { /* const str = '<a href="https://yahoo.co.jp/">リンク</a>'; const str2 = '<span style="background-image:https://yahoo.co.jp/">スパン</span>'; //aタグをエスケープするが、属性にURLらしきものが入っている場合はスルーする res = str.replace( /<(a\s?)(?!.*\/\/)(.*?)>/g , '<$1$2 target="_blank">' ); //spanタグをエスケープするが、属性にURLらしきものが入っている場合はスルーする res2 = str.replace( /<(span\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); */ //<a href="https://yahoo.co.jp/" style="background-image: https://yahoo.co.jp/;">スタイル付きリンク</a> //スタイル付きリンク //アンカーのスタイル属性とクラス属性を削除する html = html.replace( /<(a\s?.*?)(?:style|class)\s*?=\s*["'].*?["'](.*?)>/img , '<$1$2>' ); //' //アンカー html = html.replace( /<(a\s?)(?!.*style.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/a>/g , '' ); //エスケープしたアンカーを元に戻す html = html.replace( /\[a\]/g , '<a' ); html = html.replace( /\[\/a\]/g , '</a>' ); //斜体(属性にURLらしきものが入っていないこと) html = html.replace( /<(i\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/i>/g , '' ); //太字(属性にURLらしきものが入っていないこと) html = html.replace( /<(b\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/b>/g , '' ); //下線(属性にURLらしきものが入っていないこと) html = html.replace( /<(u\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/u>/g , '' ); //span(属性にURLらしきものが入っていないこと) html = html.replace( /<(span\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/span>/g , '' ); //文字色(属性にURLらしきものが入っていないこと) html = html.replace( /<(font\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/font>/g , '' ); //mark(属性にURLらしきものが入っていないこと) html = html.replace( /<(mark\s?)(?!.*\/\/)(.*?)>/g , '<$1$2>' ); html = html.replace( /<\/mark>/g , '' ); return html; } , //本文を装飾する decorate_body : function( str ) { //鉤括弧を太字に str = str.replace( /\「(.*?)\」/g , '「$1」' ); //二重鉤括弧を太字に str = str.replace( /\『(.*?)\』/g , '『$1』' ); //角括弧を太字に str = str.replace( /\[(.*?)\]/g , '[$1]' ); //墨付括弧を太字に str = str.replace( /\【(.*?)\】/g , '【$1】' ); //リンクを太字に str = str.replace( //g , '' ); return str; } , //本文の文字列をカウントする count_body : function( obj ) { //オブジェクトをコピーしてから使う let obj_ = Object.assign( {} , JSON.parse( JSON.stringify( obj ) ) ); //エスケープした文字列を復元する obj_ = this.convert_html( obj_ ); let count = 0; Object.keys( obj_.blocks ).forEach( function( key ) { //段落タイプであれば if( obj_.blocks[ key ].type == 'paragraph' && obj_.blocks[ key ].hasOwnProperty( 'data' ) && obj_.blocks[ key ].data.hasOwnProperty( 'text' ) ) { //HTMLタグを除去する str = obj_.blocks[ key ].data.text.replace( /<("[^"]*"|'[^']*'|[^'">])*>/g , '' ); // を削除する str = str.replace( / /g , '' ); //文字数をカウントする count = count + str.length; } //見出しタイプであれば else if( obj_.blocks[ key ].type == 'header' && obj_.blocks[ key ].hasOwnProperty( 'data' ) && obj_.blocks[ key ].data.hasOwnProperty( 'text' ) ) { //HTMLタグを除去する str = obj_.blocks[ key ].data.text.replace( /<("[^"]*"|'[^']*'|[^'">])*>/g , '' ); // を削除する str = str.replace( / /g , '' ); //文字数をカウントする count = count + str.length; } //引用タイプであれば else if( obj_.blocks[ key ].type == 'quote' && obj_.blocks[ key ].hasOwnProperty( 'data' ) && obj_.blocks[ key ].data.hasOwnProperty( 'text' ) ) { //HTMLタグを除去する str = obj_.blocks[ key ].data.text.replace( /<("[^"]*"|'[^']*'|[^'">])*>/g , '' ); // を削除する str = str.replace( / /g , '' ); //文字数をカウントする count = count + str.length; if( obj_.blocks[ key ].data.hasOwnProperty( 'caption' ) ) { //HTMLタグを除去する str = obj_.blocks[ key ].data.caption.replace( /<("[^"]*"|'[^']*'|[^'">])*>/g , '' ); // を削除する str = str.replace( / /g , '' ); //文字数をカウントする count = count + str.length; } } //コードタイプであれば else if( obj_.blocks[ key ].type == 'code' && obj_.blocks[ key ].hasOwnProperty( 'data' ) && obj_.blocks[ key ].data.hasOwnProperty( 'code' ) ) { //HTMLタグを除去する str = obj_.blocks[ key ].data.code.replace( /<("[^"]*"|'[^']*'|[^'">])*>/g , '' ); // を削除する str = str.replace( / /g , '' ); //文字数をカウントする count = count + str.length; } }); return count; } , } , computed : { } , data : ()=> ({ ep_url : 'https://vaiden.info/mhs-vaiden.php' , bs_url : 'https://vaiden.info' , sign_in_url : 'https://vaiden.info/sign_in/' , mypage_url : 'https://vaiden.info/mypage/' , account_url : 'https://vaiden.info/dashboard/?tab=2' , categoryLists : [ { text : '暴露・裏話・うわさ' , value : 'scandal' , icon : 'mdi-ear-hearing' , color : 'red accent-4' }, { text : 'ブログ・ソーシャルメディア' , value : 'blog' , icon : 'mdi-web' , color : 'amber darken-3' }, { text : '生成AI・人工知能・LLM' , value : 'ai' , icon : 'mdi-brain' , color : 'blue-grey lighten-1' }, { text : 'IT・プログラミング・ツール' , value : 'it' , icon : 'mdi-hammer-wrench' , color : 'teal darken-1' }, { text : 'SEO・集客' , value : 'seo' , icon : 'mdi-home-analytics' , color : 'light-blue darken-2' }, { text : 'マーケティング・セールス' , value : 'marketing' , icon : 'mdi-shopping-outline' , color : 'deep-orange' }, { text : '副業・アフィリエイト' , value : 'affiliate' , icon : 'mdi-account-multiple-plus-outline' , color : 'indigo lighten-1' }, { text : '恋愛・悩み相談' , value : 'love' , icon : 'mdi-head-heart-outline' , color : 'pink accent-3' }, { text : '占い・未来予知' , value : 'fortune' , icon : 'mdi-account-search-outline' , color : 'purple darken-4' }, { text : '健康・美容・ダイエット' , value : 'beauty' , icon : 'mdi-face-woman-shimmer-outline' , color : 'light-green darken-3' }, { text : 'マネー・株式・FX・仮想通貨' , value : 'money' , icon : 'mdi-currency-usd' , color : 'pink accent-3' }, { text : 'YouTube・動画' , value : 'movie' , icon : 'mdi-youtube' , color : 'red accent-4' }, { text : 'メタバース・VR・MR' , value : 'vr' , icon : 'mdi-virtual-reality' , color : 'amber darken-2' }, { text : '音楽・ナレーション' , value : 'music' , icon : 'mdi-account-music-outline' , color : 'pink lighten-1' }, { text : 'Webサイト制作・Webデザイン' , value : 'web-design' , icon : 'mdi-earth-plus' , color : 'cyan accent-4' }, { text : 'デザイン・ロゴ・テンプレート' , value : 'design' , icon : 'mdi-palette' , color : 'lime darken-1' }, { text : '写真・イラスト・CG' , value : 'image' , icon : 'mdi-camera' , color : 'blue-grey darken-1' }, { text : 'ライティング' , value : 'writing' , icon : 'mdi-pencil-outline' , color : 'brown darken-1' }, { text : 'メルカリ・通販・物販' , value : 'sales' , icon : 'mdi-store-check-outline' , color : '#ff333f' }, { text : '学習法・受験・資格' , value : 'learning' , icon : 'mdi-book-open-variant' , color : 'light-blue darken-3' }, { text : '就職・転職' , value : 'career' , icon : 'mdi-card-account-details-outline' , color : 'grey darken-1' }, { text : '独立・起業・開業' , value : 'start-up' , icon : 'mdi-domain' , color : 'red darken-4' }, { text : '自己啓発・ビジネス' , value : 'business' , icon : 'mdi-brain' , color : 'yellow darken-3' }, { text : '小説・ドキュメンタリー' , value : 'novel' , icon : 'mdi-fountain-pen-tip' , color : 'blue-grey darken-3' }, { text : '怪談・都市伝説・超常現象' , value : 'occult' , icon : 'mdi-alien-outline' , color : 'deep-purple darken-3' }, { text : 'マンガ・アニメ・ゲーム' , value : 'cartoon' , icon : 'mdi-one-up' , color : 'teal accent-4' }, { text : 'その他' , value : 'other' , icon : 'mdi-help-circle-outline' , color : 'brown darken-4' }, { text : '未選択' , value : null }, ] , }), }