mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Recent changes have added special cases for line breaks within URLs and email addresses. Such breaks are undesirable when they can be avoided, but at other times are needed to avoid huge gaps, or indeed to make the line fit at all. This patch assigns a penalty for such breaks, equal to the hyphenation penalty. The mechanism is currently very simple, but would be easy to fine-tune based on more detailed information about break quality. Bug: 20126487 Bug: 20566159 Change-Id: I0d3323897737a2850f1e734fa17b96b065eabd9c
74 lines
1.9 KiB
C++
74 lines
1.9 KiB
C++
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/**
|
|
* A wrapper around ICU's line break iterator, that gives customized line
|
|
* break opportunities, as well as identifying words for the purpose of
|
|
* hyphenation.
|
|
*/
|
|
|
|
#ifndef MINIKIN_WORD_BREAKER_H
|
|
#define MINIKIN_WORD_BREAKER_H
|
|
|
|
#include "unicode/brkiter.h"
|
|
#include <memory>
|
|
|
|
namespace android {
|
|
|
|
class WordBreaker {
|
|
public:
|
|
~WordBreaker() {
|
|
finish();
|
|
}
|
|
|
|
void setLocale(const icu::Locale& locale);
|
|
|
|
void setText(const uint16_t* data, size_t size);
|
|
|
|
// Advance iterator to next word break. Return offset, or -1 if EOT
|
|
ssize_t next();
|
|
|
|
// Current offset of iterator, equal to 0 at BOT or last return from next()
|
|
ssize_t current() const;
|
|
|
|
// After calling next(), wordStart() and wordEnd() are offsets defining the previous
|
|
// word. If wordEnd <= wordStart, it's not a word for the purpose of hyphenation.
|
|
ssize_t wordStart() const;
|
|
|
|
ssize_t wordEnd() const;
|
|
|
|
int breakBadness() const;
|
|
|
|
void finish();
|
|
|
|
private:
|
|
std::unique_ptr<icu::BreakIterator> mBreakIterator;
|
|
UText mUText = UTEXT_INITIALIZER;
|
|
const uint16_t* mText = nullptr;
|
|
size_t mTextSize;
|
|
ssize_t mLast;
|
|
ssize_t mCurrent;
|
|
bool mIteratorWasReset;
|
|
|
|
// state for the email address / url detector
|
|
ssize_t mScanOffset;
|
|
bool mInEmailOrUrl;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif // MINIKIN_WORD_BREAKER_H
|