Tinyrack

Code Block

스크롤 가능한 모노스페이스 표면에 여러 줄 코드를 표시해요.

선택적 테마 대응 구문 강조와 명시적 줄바꿈으로 여러 줄 코드를 표시해요.

핵심 속성

속성기본값
language설정한 하이라이터가 처리하는 언어 식별자일반 텍스트
하이라이터highlighter 속성, TRCodeHighlighterProvider, 없음없음
구문 테마밝기별로 애플리케이션 하이라이터가 정의일반 텍스트 색상
wraptrue, falsefalse

설치

패키지를 추가한 뒤 공개 라이브러리를 가져오세요.

flutter pub add tinyrack_ui
import 'package:tinyrack_ui/tinyrack_ui.dart';

애플리케이션에서 사용하는 구문 엔진을 TRCodeHighlighter에 맞춘 뒤 코드 블록 상위에 제공하세요. 지원 언어, 토큰 스타일, 밝고 어두운 색상은 하이라이터가 관리하고, null을 반환하면 미지원 언어로 처리해요.

import 'package:material_ui/material_ui.dart';
import 'package:tinyrack_ui/tinyrack_ui.dart';

final dartKeywords = RegExp(r'\b(class|const|final|return|void)\b');

Future<TRCodeHighlightResult?> appCodeHighlighter(
  TRCodeHighlightRequest request,
) async {
  if (request.language != 'dart') return null;
  final keywordColor = request.brightness == Brightness.dark
      ? Colors.lightBlueAccent
      : Colors.blue;
  final spans = <TextSpan>[];
  var offset = 0;

  for (final match in dartKeywords.allMatches(request.code)) {
    if (match.start > offset) {
      spans.add(TextSpan(text: request.code.substring(offset, match.start)));
    }
    spans.add(
      TextSpan(
        text: match.group(0),
        style: TextStyle(color: keywordColor),
      ),
    );
    offset = match.end;
  }
  if (offset < request.code.length) {
    spans.add(TextSpan(text: request.code.substring(offset)));
  }
  return TRCodeHighlightResult(span: TextSpan(children: spans));
}

void main() {
  runApp(
    TRCodeHighlighterProvider(
      highlighter: appCodeHighlighter,
      child: const App(),
    ),
  );
}

class App extends StatelessWidget {
  const App({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: TinyrackTheme.light(),
      darkTheme: TinyrackTheme.dark(),
      home: const Scaffold(
        body: TRCodeBlock(
          code: 'final status = "healthy";',
          language: 'dart',
        ),
      ),
    );
  }
}

플레이그라운드

사용법

import 'package:material_ui/material_ui.dart';
import 'package:tinyrack_ui/tinyrack_ui.dart';

const TRCodeBlock(
  code: "final status = 'healthy';",
  language: 'dart',
)

예시

강조된 Dart 고유 링크

하이라이터를 설정한 뒤 language를 전달하면 테마에 맞는 구문 색상을 표시해요.

표시 모드 고유 링크

일반 텍스트에는 language를 생략하고, 강조에는 하이라이터가 지원하는 식별자를 선택하며, 폭이 좁은 레이아웃에서는 wrap을 켜세요.

블록별 재정의 고유 링크

블록 하나에 프로바이더와 다른 지원 언어나 토큰 색상이 필요하면 highlighter를 직접 전달하세요.

끝쪽 액션 고유 링크

trailing을 전달하면 코드를 가리지 않는 오른쪽 위 모서리에 액션을 고정해요. 줄바꿈하지 않는 블록은 포인터가 가장자리를 넘어 드래그하는 동안 가로로 이동하므로, 긴 줄의 끝까지 선택할 수 있어요.

API

하이라이터 미설정, 미지원 언어, 예외 상황에서도 원본 소스를 계속 표시해요. 블록이나 프로바이더의 onHighlightFailure로 결과를 처리하세요.

속성타입기본값설명
codeString필수표시할 소스 텍스트예요.
languageString?null하이라이터에 전달할 언어 식별자예요. 일반 텍스트에는 생략하세요.
highlighterTRCodeHighlighter?프로바이더 값이 블록에 한해 프로바이더를 대체해요.
onHighlightFailureValueChanged<TRCodeHighlightFailure>?프로바이더 값noHighlighter, unsupportedLanguage, highlightFailed를 받아요.
wrapboolfalse가로 스크롤 대신 긴 줄을 줄바꿈해요.