Skip to content

Commit

Permalink
Resolve #962
Browse files Browse the repository at this point in the history
  • Loading branch information
the-djmaze committed Feb 16, 2023
1 parent 5216535 commit b240c26
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 67 deletions.
4 changes: 4 additions & 0 deletions dev/Styles/User/MessageView.less
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,10 @@ html.rl-bottom-preview-pane #V-MailMessageView .top-toolbar {
opacity: 0.8;
padding: 0 10px;
margin: 0;

blockquote {
opacity: 1;
}
}

&.html {
Expand Down
89 changes: 45 additions & 44 deletions snappymail/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,44 +101,46 @@ public static function BuildHtml(string $sHtml, array &$aFoundCids, array &$aFou
'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio', 'area', 'map',
'head', 'style'
);

$aRemove = array();

$sIdRight = \md5(\microtime());

$aNodes = $oBody->getElementsByTagName('*');
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) {
$sTagNameLower = \strtolower($oElement->nodeName);

if (\in_array($sTagNameLower, $aRemoveTags)) {
$aRemove[] = $oElement;
continue;
foreach ($aRemoveTags as $name) {
$aNodes = $oBody->getElementsByTagName($name);
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) {
if (isset($oElement->parentNode)) {
@$oElement->parentNode->removeChild($oElement);
}
}
}

// images
if ($oElement->hasAttribute('data-x-src-broken') || $oElement->hasAttribute('data-x-src-hidden')) {
$aRemove[] = $oElement;
continue;
$xpath = new \DomXpath($oDoc);
foreach ($xpath->query('//*[@data-x-src-broken]') as $oElement) {
if (isset($oElement->parentNode)) {
@$oElement->parentNode->removeChild($oElement);
}
if ($oElement->hasAttribute('data-x-src-cid')) {
$sCid = $oElement->getAttribute('data-x-src-cid');
$oElement->removeAttribute('data-x-src-cid');
if (!empty($sCid)) {
$aFoundCids[] = $sCid;
$oElement->setAttribute('src', 'cid:'.$sCid);
}
}

foreach ($xpath->query('//*[@data-x-src-hidden]') as $oElement) {
if (isset($oElement->parentNode)) {
@$oElement->parentNode->removeChild($oElement);
}
if ($oElement->hasAttribute('data-x-src')) {
$oElement->setAttribute('src', $oElement->getAttribute('data-x-src'));
$oElement->removeAttribute('data-x-src');
}

foreach ($xpath->query('//*[@data-x-src-cid]') as $oElement) {
$sCid = $oElement->getAttribute('data-x-src-cid');
$oElement->removeAttribute('data-x-src-cid');
if (!empty($sCid)) {
$aFoundCids[] = $sCid;
$oElement->setAttribute('src', 'cid:'.$sCid);
}
}

foreach ($xpath->query('//*[@data-x-src]') as $oElement) {
$oElement->setAttribute('src', $oElement->getAttribute('data-x-src'));
$oElement->removeAttribute('data-x-src');
}

foreach ($xpath->query('//*[@data-x-style-url]') as $oElement) {
// style attribute images
$aCid = array();
if ($oElement->hasAttribute('data-x-style-url')) {
$aCid = \array_merge($aCid, \json_decode($oElement->getAttribute('data-x-style-url'), true));
$oElement->removeAttribute('data-x-style-url');
}
$aCid = \array_merge($aCid, \json_decode($oElement->getAttribute('data-x-style-url'), true));
$oElement->removeAttribute('data-x-style-url');
if ($aCid) {
foreach ($aCid as $sCidName => $sCid) {
$sCidName = \strtolower(\preg_replace('/([A-Z])/', '-\1', $sCidName));
Expand All @@ -158,29 +160,28 @@ public static function BuildHtml(string $sHtml, array &$aFoundCids, array &$aFou
}
}
}
}

// Remove all remaining data-* attributes
// Remove all remaining data-* attributes
foreach ($xpath->query('//*[@*[starts-with(name(), "data-")]]') as $oElement) {
$sTagNameLower = \strtolower($oElement->nodeName);
if ($oElement->hasAttributes()) {
foreach ($oElement->attributes as $oAttr) {
if ('data-' === \substr(\strtolower($oAttr->nodeName), 0, 5)) {
$oElement->removeAttribute($oAttr->nodeName);
}
}
}

if ('img' === $sTagNameLower) {
$sSrc = $oElement->getAttribute('src');
if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) {
$sHash = \md5($sSrc) . '@' . $sIdRight;
$aFoundDataURL[$sHash] = $sSrc;
$oElement->setAttribute('src', 'cid:'.$sHash);
}
}
}

foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) {
if (isset($oElement->parentNode)) {
@$oElement->parentNode->removeChild($oElement);
$sIdRight = \md5(\microtime());
$aNodes = $oBody->getElementsByTagName('IMG');
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) {
$sSrc = $oElement->getAttribute('src');
if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) {
$sHash = \md5($sSrc) . '@' . $sIdRight;
$aFoundDataURL[$sHash] = $sSrc;
$oElement->setAttribute('src', 'cid:'.$sHash);
}
}

Expand Down
34 changes: 11 additions & 23 deletions vendors/squire/build/squire-raw.js
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,8 @@ const

// Recursively examine container nodes and wrap any inline children.
fixContainer = ( container, root ) => {
/*
// Live, but very slow
let children = container.childNodes;
let wrapper = null;
let i = 0, l = children.length, child, isBR;
Expand All @@ -290,16 +292,12 @@ const
if ( !isBR && isInline( child )
// && (root.__squire__._config.blockTag !== 'DIV' || (child.matches && !child.matches(phrasingElements)))
) {
if ( !wrapper ) {
wrapper = createElement( 'div' );
}
wrapper = wrapper || createElement( 'div' );
wrapper.append( child );
--i;
--l;
} else if ( isBR || wrapper ) {
if ( !wrapper ) {
wrapper = createElement( 'div' );
}
wrapper = wrapper || createElement( 'div' );
fixCursor( wrapper, root );
if ( isBR ) {
child.replaceWith( wrapper );
Expand All @@ -312,34 +310,24 @@ const
}
isContainer( child ) && fixContainer( child, root );
}
/*
// Not live
*/
let wrapper, isBR;
// Not live, and fast
[...container.children].forEach(child => {
isBR = child.nodeName === 'BR';
if ( !isBR && isInline( child )
// && (root.__squire__._config.blockTag !== 'DIV' || (child.matches && !child.matches(phrasingElements)))
) {
if ( !wrapper ) {
wrapper = createElement( 'div' );
}
wrapper = wrapper || createElement( 'div' );
wrapper.append( child );
} else if ( isBR || wrapper ) {
if ( !wrapper ) {
wrapper = createElement( 'div' );
}
wrapper = wrapper || createElement( 'div' );
fixCursor( wrapper, root );
if ( isBR ) {
child.replaceWith( wrapper );
} else {
child.before( wrapper );
}
isBR ? child.replaceWith( wrapper ) : child.before( wrapper );
wrapper = null;
}
if ( isContainer( child ) ) {
fixContainer( child, root );
}
isContainer( child ) && fixContainer( child, root );
});
*/
wrapper && container.append( fixCursor( wrapper, root ) );
return container;
},
Expand Down

0 comments on commit b240c26

Please sign in to comment.