2017-10-27 20:33:53 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2004-04-13 01:53:22 +04:00
|
|
|
|
2006-03-30 09:56:38 +04:00
|
|
|
/* implementation of quotes for the CSS 'content' property */
|
|
|
|
|
2004-04-13 01:53:22 +04:00
|
|
|
#include "nsQuoteList.h"
|
|
|
|
#include "nsReadableUtils.h"
|
2013-10-02 01:00:38 +04:00
|
|
|
#include "nsIContent.h"
|
2018-03-19 22:18:07 +03:00
|
|
|
#include "mozilla/ErrorResult.h"
|
2018-03-29 01:01:46 +03:00
|
|
|
#include "mozilla/dom/Text.h"
|
2018-03-19 22:18:07 +03:00
|
|
|
|
|
|
|
using namespace mozilla;
|
2004-04-13 01:53:22 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool
|
2008-08-18 05:16:42 +04:00
|
|
|
nsQuoteNode::InitTextFrame(nsGenConList* aList, nsIFrame* aPseudoFrame,
|
|
|
|
nsIFrame* aTextFrame)
|
|
|
|
{
|
|
|
|
nsGenConNode::InitTextFrame(aList, aPseudoFrame, aTextFrame);
|
|
|
|
|
|
|
|
nsQuoteList* quoteList = static_cast<nsQuoteList*>(aList);
|
2011-09-29 10:19:26 +04:00
|
|
|
bool dirty = false;
|
2008-08-18 05:16:42 +04:00
|
|
|
quoteList->Insert(this);
|
|
|
|
if (quoteList->IsLast(this))
|
|
|
|
quoteList->Calc(this);
|
|
|
|
else
|
2011-10-17 18:59:28 +04:00
|
|
|
dirty = true;
|
2008-08-18 05:16:42 +04:00
|
|
|
|
|
|
|
// Don't set up text for 'no-open-quote' and 'no-close-quote'.
|
|
|
|
if (IsRealQuote()) {
|
2018-03-29 01:01:46 +03:00
|
|
|
aTextFrame->GetContent()->AsText()->SetText(*Text(), false);
|
2008-08-18 05:16:42 +04:00
|
|
|
}
|
|
|
|
return dirty;
|
|
|
|
}
|
|
|
|
|
2004-04-13 01:53:22 +04:00
|
|
|
const nsString*
|
2005-04-02 03:07:00 +04:00
|
|
|
nsQuoteNode::Text()
|
2004-04-13 01:53:22 +04:00
|
|
|
{
|
2018-06-30 16:05:15 +03:00
|
|
|
NS_ASSERTION(mType == StyleContentType::OpenQuote ||
|
|
|
|
mType == StyleContentType::CloseQuote,
|
2004-04-13 01:53:22 +04:00
|
|
|
"should only be called when mText should be non-null");
|
2016-04-12 08:52:40 +03:00
|
|
|
const nsStyleQuoteValues::QuotePairArray& quotePairs =
|
2016-04-12 08:52:40 +03:00
|
|
|
mPseudoFrame->StyleList()->GetQuotePairs();
|
2016-04-12 08:52:40 +03:00
|
|
|
int32_t quotesCount = quotePairs.Length(); // 0 if 'quotes:none'
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t quoteDepth = Depth();
|
2004-04-13 01:53:22 +04:00
|
|
|
|
|
|
|
// Reuse the last pair when the depth is greater than the number of
|
|
|
|
// pairs of quotes. (Also make 'quotes: none' and close-quote from
|
|
|
|
// a depth of 0 equivalent for the next test.)
|
|
|
|
if (quoteDepth >= quotesCount)
|
|
|
|
quoteDepth = quotesCount - 1;
|
|
|
|
|
2016-04-12 08:52:40 +03:00
|
|
|
const nsString* result;
|
2004-04-13 01:53:22 +04:00
|
|
|
if (quoteDepth == -1) {
|
|
|
|
// close-quote from a depth of 0 or 'quotes: none' (we want a node
|
|
|
|
// with the empty string so dynamic changes are easier to handle)
|
2016-04-12 08:52:40 +03:00
|
|
|
result = &EmptyString();
|
2004-04-13 01:53:22 +04:00
|
|
|
} else {
|
2018-06-30 16:05:15 +03:00
|
|
|
result = StyleContentType::OpenQuote == mType
|
2016-04-12 08:52:40 +03:00
|
|
|
? "ePairs[quoteDepth].first
|
|
|
|
: "ePairs[quoteDepth].second;
|
2004-04-13 01:53:22 +04:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-04-02 03:07:00 +04:00
|
|
|
nsQuoteList::Calc(nsQuoteNode* aNode)
|
2004-04-13 01:53:22 +04:00
|
|
|
{
|
2005-04-02 03:07:00 +04:00
|
|
|
if (aNode == FirstNode()) {
|
2004-04-13 01:53:22 +04:00
|
|
|
aNode->mDepthBefore = 0;
|
|
|
|
} else {
|
|
|
|
aNode->mDepthBefore = Prev(aNode)->DepthAfter();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsQuoteList::RecalcAll()
|
|
|
|
{
|
2016-10-27 13:07:52 +03:00
|
|
|
for (nsQuoteNode* node = FirstNode(); node; node = Next(node)) {
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t oldDepth = node->mDepthBefore;
|
2004-04-13 01:53:22 +04:00
|
|
|
Calc(node);
|
|
|
|
|
2008-08-18 05:16:42 +04:00
|
|
|
if (node->mDepthBefore != oldDepth && node->mText && node->IsRealQuote())
|
2018-03-19 22:18:07 +03:00
|
|
|
node->mText->SetData(*node->Text(), IgnoreErrors());
|
2016-10-27 13:07:52 +03:00
|
|
|
}
|
2004-04-13 01:53:22 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
void
|
|
|
|
nsQuoteList::PrintChain()
|
|
|
|
{
|
|
|
|
printf("Chain: \n");
|
2016-10-27 13:07:52 +03:00
|
|
|
for (nsQuoteNode* node = FirstNode(); node; node = Next(node)) {
|
2007-07-08 11:08:04 +04:00
|
|
|
printf(" %p %d - ", static_cast<void*>(node), node->mDepthBefore);
|
2004-04-13 01:53:22 +04:00
|
|
|
switch(node->mType) {
|
2018-06-30 16:05:15 +03:00
|
|
|
case StyleContentType::OpenQuote:
|
2004-04-13 01:53:22 +04:00
|
|
|
printf("open");
|
|
|
|
break;
|
2018-06-30 16:05:15 +03:00
|
|
|
case StyleContentType::NoOpenQuote:
|
2004-04-13 01:53:22 +04:00
|
|
|
printf("noOpen");
|
|
|
|
break;
|
2018-06-30 16:05:15 +03:00
|
|
|
case StyleContentType::CloseQuote:
|
2004-04-13 01:53:22 +04:00
|
|
|
printf("close");
|
|
|
|
break;
|
2018-06-30 16:05:15 +03:00
|
|
|
case StyleContentType::NoCloseQuote:
|
2004-04-13 01:53:22 +04:00
|
|
|
printf("noClose");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
printf("unknown!!!");
|
|
|
|
}
|
|
|
|
printf(" %d - %d,", node->Depth(), node->DepthAfter());
|
|
|
|
if (node->mText) {
|
|
|
|
nsAutoString data;
|
|
|
|
node->mText->GetData(data);
|
2006-02-03 17:18:39 +03:00
|
|
|
printf(" \"%s\",", NS_ConvertUTF16toUTF8(data).get());
|
2004-04-13 01:53:22 +04:00
|
|
|
}
|
|
|
|
printf("\n");
|
2016-10-27 13:07:52 +03:00
|
|
|
}
|
2004-04-13 01:53:22 +04:00
|
|
|
}
|
|
|
|
#endif
|