mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
LibSyntax+Userland: Make LibSyntax not depend on LibGUI
This moves some stuff around to make LibGUI depend on LibSyntax instead of the other way around, as not every application that wishes to do syntax highlighting is necessarily a LibGUI (or even a GUI) application.
This commit is contained in:
committed by
Tim Flynn
parent
2495302991
commit
ba4db899d4
Notes:
sideshowbarker
2024-07-17 18:46:57 +09:00
Author: https://github.com/alimpfard Commit: https://github.com/SerenityOS/serenity/commit/ba4db899d4 Pull-request: https://github.com/SerenityOS/serenity/pull/20828 Reviewed-by: https://github.com/AtkinsSJ ✅ Reviewed-by: https://github.com/BertalanD ✅ Reviewed-by: https://github.com/trflynn89 ✅
80
Userland/Libraries/LibSyntax/TextRange.h
Normal file
80
Userland/Libraries/LibSyntax/TextRange.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
||||
* Copyright (c) 2022-2023, the SerenityOS developers.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LibSyntax/TextPosition.h>
|
||||
|
||||
namespace Syntax {
|
||||
|
||||
class TextRange {
|
||||
public:
|
||||
TextRange() = default;
|
||||
TextRange(TextPosition const& start, TextPosition const& end)
|
||||
: m_start(start)
|
||||
, m_end(end)
|
||||
{
|
||||
}
|
||||
|
||||
bool is_valid() const { return m_start.is_valid() && m_end.is_valid() && m_start != m_end; }
|
||||
void clear()
|
||||
{
|
||||
m_start = {};
|
||||
m_end = {};
|
||||
}
|
||||
|
||||
TextPosition& start() { return m_start; }
|
||||
TextPosition& end() { return m_end; }
|
||||
TextPosition const& start() const { return m_start; }
|
||||
TextPosition const& end() const { return m_end; }
|
||||
|
||||
size_t line_count() const { return normalized_end().line() - normalized_start().line() + 1; }
|
||||
|
||||
TextRange normalized() const { return TextRange(normalized_start(), normalized_end()); }
|
||||
|
||||
void set_start(TextPosition const& position) { m_start = position; }
|
||||
void set_end(TextPosition const& position) { m_end = position; }
|
||||
|
||||
void set(TextPosition const& start, TextPosition const& end)
|
||||
{
|
||||
m_start = start;
|
||||
m_end = end;
|
||||
}
|
||||
|
||||
bool operator==(TextRange const& other) const
|
||||
{
|
||||
return m_start == other.m_start && m_end == other.m_end;
|
||||
}
|
||||
|
||||
bool contains(TextPosition const& position) const
|
||||
{
|
||||
if (position.line() <= m_start.line() && (position.line() != m_start.line() || position.column() < m_start.column()))
|
||||
return false;
|
||||
if (position.line() >= m_end.line() && (position.line() != m_end.line() || position.column() > m_end.column()))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
TextPosition normalized_start() const { return m_start < m_end ? m_start : m_end; }
|
||||
TextPosition normalized_end() const { return m_start < m_end ? m_end : m_start; }
|
||||
|
||||
TextPosition m_start {};
|
||||
TextPosition m_end {};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
template<>
|
||||
struct AK::Formatter<Syntax::TextRange> : AK::Formatter<FormatString> {
|
||||
ErrorOr<void> format(FormatBuilder& builder, Syntax::TextRange const& value)
|
||||
{
|
||||
if (value.is_valid())
|
||||
return Formatter<FormatString>::format(builder, "{}-{}"sv, value.start(), value.end());
|
||||
return builder.put_string("TextRange(Invalid)"sv);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user