Greasy Fork

Greasy Fork is available in English.

Tweetdeck media zoom

タブレット専用にモーダルの画像を広げて表示

当前为 2020-11-17 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Tweetdeck media zoom
// @namespace    http://tampermonkey.net/
// @version      0.2.0
// @description  タブレット専用にモーダルの画像を広げて表示
// @author       y_kahou
// @match        https://tweetdeck.twitter.com
// @grant        none
// @noframes
// @require      http://code.jquery.com/jquery-3.5.1.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js
// ==/UserScript==

var $ = window.jQuery;

function __css__() {/*
.med-origlink { display: none; }
.med-flaglink { display: none; }
.med-embeditem {
    top: 0;
    bottom: 0;
}
.med-tweet {
    background: rgb(0, 0, 0, 0.8);
    right: 0px;
    left: 0px;
    transition: 0.5s;
}
.hide {
    opacity: 0;
}

.js-med-tweet .item-box {
    padding-left: 100px;
    padding-right: 100px;
}
.js-med-tweet .account-link {
    flex: none;
}
.js-med-tweet .account-link > .nbfc{
    display: inline-block;
}
.js-med-tweet time {
    position: absolute;
    right: 100px;
}
*/}
function addStyle() {
    var css = (__css__).toString()
        .match(/[^]*\/\*([^]*)\*\/\}$/)[1]
        .replace(/\{\*/g, '/*')
        .replace(/\*\}/g, '*/');
        
    var font = $('html').css('font-family')
    css += `pre { white-space: pre-wrap; font-family: ${font}; }`
    
    $('head').append(`<style id="mystyle" type="text/css">${css}</style>`)
}
(function() {
    'use strict';
    addStyle();
    
    var controll = function(modal) {
        
        // モーダルのツイート文も改行されたものにする
        var tweet = $('p', modal)[0]
        $(tweet).replaceWith(`<pre>${$(tweet).html()}</pre>`);
        
        // 画像タップは動作無しに、ダブルタップでオリジナル表示
        if ($('.media-img', modal).length) {
            var img = $('.med-link', modal)
            img.on('touchstart', function(e){
                e.preventDefault();
            })
            var h_img = new Hammer(img[0]);
            h_img.on("doubletap", function(e) {
                img[0].click();
            });
        }
        
        // 動画は画面タップで再生停止
        var video = $('video', modal) 
        if (video.length) {
            var h_video = new Hammer(video[0]);
            h_video.on('tap', function(e) {
                if (video[0].paused) video[0].play();
                else video[0].pause();
            })
        }
        
        // 余白シングルタップでツイート文表示切替
        var edge = $('.l-table', modal)
        var h_edge = new Hammer(edge[0]);
        h_edge.on("tap", function(e) {
            $('.med-tweet').toggleClass('hide')
        });
        h_edge.get('swipe').set({direction: Hammer.DIRECTION_ALL});
        h_edge.on("swipeup swipedown swipeleft swiperight", function(e) {
            switch(e.type) {
            case 'swipeup': case 'swipedown':
                $(modal).empty().hide();
                break;
            case 'swipeleft':
                $('.mdl-media-next', modal)[0].click();
                break;
            case 'swiperight':
                $('.mdl-media-prev', modal)[0].click();
                break;
            }
        });
        
        // 完全表示されるまでpointer-eventsをnoneのままにする
        var tweet = $('.med-tweet', modal)
        tweet.on('transitionend', function(e) {
            var pe = $(e.target).hasClass('hide') ? 'none' : 'auto'
            tweet.css({'pointer-events': pe})
        })
        
        // ツイート文の左右端余白タップでツイート文非表示(一応クリックでも可)
        $('.med-tweet', modal).on('touchstart click', function(e) {
            var tgl = false
            var x = (e.type == 'click') ? e.pageX : e.touches[0].pageX
            var y = (e.type == 'click') ? e.pageY : e.touches[0].pageY
        
            // 左余白座標
            var of = $(this).offset()
            var rect = {
                top    : of.top,
                left   : of.left,
                right  : of.left + 100,
                hit: (x, y) => (rect.top <= y && y <= rect.bottom && rect.left <= x && x <= rect.right)
            }
            rect.bottom = of.top + $(this).height()
            tgl |= rect.hit(x, y)
        
            // 右余白座標
            rect.right = rect.left + $(this).width()
            rect.left = rect.right - 100;
            tgl |= rect.hit(x, y)
        
            if (tgl) {
                $('.med-tweet').toggleClass('hide')
                e.preventDefault();
            }
        })
    }
    var iv = setInterval(function() {
        var modal = $('#open-modal')[0];
        if (modal) {
            clearInterval(iv);
            
            $(modal).on('DOMSubtreeModified propertychange', function(e) {
                
                // modalの変更検知で最後の方に追加される.media-img OR videoが生成されたら1回だけ動かす
                if ($('.media-img, video', modal)[0] && !$(modal).children('div').data('done')) {
                    $(modal).children('div').data('done', true)
                    controll(modal);
                }
            })
        }
    }, 500)
})();