Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
2e7d267
feat: asset picker for interface SerializeField
memorydream Aug 6, 2026
b69995d
feat: impl common markdown subset for TMP
memorydream Aug 6, 2026
aeb6831
add test scene
memorydream Aug 6, 2026
1c1d0fc
disable quote block
memorydream Aug 7, 2026
f5f507a
fix: add missing LineBreakInlineRenderer
memorydream Aug 11, 2026
1298fb9
fix: order list render pos offset
memorydream Aug 11, 2026
b89fc92
fix: remove "<>" pre Heading line
memorydream Aug 11, 2026
b6233f9
feat: 完成 LinkInline,现在样式和需要的信息完整了
memorydream Aug 11, 2026
12dd135
fix: code inline shouldn't parse inline tag
memorydream Aug 11, 2026
5311a62
remove raw impl license
memorydream Aug 11, 2026
fad55e8
feat: impl quote block
memorydream Aug 11, 2026
9c45df1
add reset callback to TextMeshProMarkdownConfigBehaviour
memorydream Aug 11, 2026
e57052f
feat: 模拟 md block 元素常见渲染的底部外边距
memorydream Aug 12, 2026
23026c5
fix: AtInline should use AtColor
memorydream Aug 12, 2026
b487b15
replace MutilLine with TextArea
memorydream Aug 12, 2026
c5bce59
fix: 引用块现在应该符合预期,但是方式非常 hack
memorydream Aug 12, 2026
6bda1e6
fix: list should use FinishBlock
memorydream Aug 12, 2026
c97b855
update
memorydream Aug 12, 2026
8a708a4
fix: 正确转换到 tmp 的转义反斜杠
memorydream Aug 12, 2026
af40997
refactor: 重做引用块的渲染方式,现在更接近常见的渲染效果了
memorydream Aug 13, 2026
bc66fa8
feat: add finish block behavior
memorydream Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
673 changes: 673 additions & 0 deletions Cyan-Stars/Assets/Scenes/MarkdownTest.unity

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions Cyan-Stars/Assets/Scenes/MarkdownTest.unity.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Cyan-Stars/Assets/Scripts/Libraries/IpolUnityEx.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Cyan-Stars/Assets/Scripts/Libraries/IpolUnityEx/Editor.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "IPOL.UnityEx.Editor",
"rootNamespace": "IPOL.UnityEx.Editor",
"references": [
"GUID:4988cf9794f41d64c884876ab6574b89",
"GUID:d1aaf193c9c425bf18d52ed9d5dbd031"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": true,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
using System;
using System.Linq;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using UnityObject = UnityEngine.Object;

namespace Ipol.UnityEx.Editor
{
[CustomPropertyDrawer(typeof(ObjectRef<>))]
public class ObjectRefEditor : PropertyDrawer
{
private const string ValueName = ObjectRef<object>.ValueFieldName;

public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
var value = property.FindPropertyRelative(ValueName);
var foldout = new Foldout { value = property.isExpanded };
var objectField = new ObjectField(property.displayName)
{
objectType = GetObjectType(),
allowSceneObjects = true
};
ModifyObjectFieldStyle(objectField);
var content = new VisualElement();

objectField.BindProperty(value);
AddObjectFieldToFoldoutHeader(foldout, objectField);
foldout.Add(content);

foldout.RegisterValueChangedCallback(change => property.isExpanded = change.newValue);
objectField.RegisterValueChangedCallback(change => PopulateProperties(content, change.newValue));
PopulateProperties(content, value.objectReferenceValue);

return foldout;
}

private static void ModifyObjectFieldStyle(ObjectField objectField)
{
objectField.AddToClassList("unity-base-field__aligned");
objectField.style.flexGrow = 1;
objectField.style.marginLeft = 1;
objectField.style.marginRight = 1;

var label = objectField.labelElement;
label.style.marginLeft = 0;
}

private static void AddObjectFieldToFoldoutHeader(Foldout foldout, ObjectField objectField)
{
var toggle = foldout.Q<Toggle>(className: Foldout.toggleUssClassName);
toggle.Children().First().style.flexGrow = 0;
toggle.Add(objectField);

objectField.RegisterCallback<PointerDownEvent>(change => change.StopPropagation());
}

private static void PopulateProperties(VisualElement content, UnityObject referencedObject)
{
content.Unbind();
content.Clear();

if (referencedObject == null)
return;

var serializedObject = new SerializedObject(referencedObject);
var iterator = serializedObject.GetIterator();
var enterChildren = true;

while (iterator.NextVisible(enterChildren))
{
enterChildren = false;

if (iterator.propertyPath != "m_Script")
content.Add(new PropertyField { bindingPath = iterator.propertyPath });
}

content.Bind(serializedObject);
}

private Type GetObjectType()
{
return fieldInfo.FieldType.IsGenericType
? fieldInfo.FieldType.GetGenericArguments()[0]
: typeof(UnityObject);
}

}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Cyan-Stars/Assets/Scripts/Libraries/IpolUnityEx/Runtime.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Ipol.UnityEx.Editor")]

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "IPOL.UnityEx.Runtime",
"rootNamespace": "IPOL.UnityEx",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": true,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using UnityEngine;

namespace Ipol.UnityEx
{
[System.Serializable]
public class ObjectRef<T> where T : class
{
internal const string ValueFieldName = nameof(value);

[SerializeField] private Object value;

public T Value => value as T;
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Cyan-Stars/Assets/Scripts/Libraries/MarkdownRenderer.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "CyanStars.MarkdownRenderer.Editor",
"rootNamespace": "CyanStars.MarkdownRenderer.Editor",
"references": [
"GUID:4988cf9794f41d64c884876ab6574b89",
"GUID:f86fff73e27070d2b9a01de1a73ed02f"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine.UIElements;

namespace CyanStars.MarkdownRenderer.Editor
{
[CustomPropertyDrawer(typeof(TextMeshProMarkdownConfig))]
public class TextMeshProMarkdownConfigDrawer : PropertyDrawer
{
public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
var content = new VisualElement();
var endProperty = property.GetEndProperty();

if (!property.NextVisible(true))
{
return content;
}

do
{
content.Add(new PropertyField(property));
}
while (property.NextVisible(false) && !SerializedProperty.EqualContents(property, endProperty));

return content;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "CyanStars.MarkdownRenderer",
"rootNamespace": "",
"references": [
"GUID:6055be8ebefd69e48b49212b09b47b2f",
"GUID:d1aaf193c9c425bf18d52ed9d5dbd031"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": true,
"precompiledReferences": [
"Markdig.dll"
],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System.Collections.Generic;
using Markdig.Syntax.Inlines;

namespace CyanStars.MarkdownRenderer
{
public static class ContainerInlineExtensions
{
public static IEnumerable<Inline> FindDescendants<T1, T2>(this ContainerInline container)
where T1 : Inline
where T2 : Inline
{
Stack<Inline> stack = new Stack<Inline>();
for (Inline child = container.LastChild; child != null; child = child.PreviousSibling)
{
stack.Push(child);
}

while (stack.Count > 0)
{
Inline child = stack.Pop();
if (child is T1 val1)
{
yield return val1;
}
else if (child is T2 val2)
{
yield return val2;
}

if (child is ContainerInline containerInline)
{
for (child = containerInline.LastChild; child != null; child = child.PreviousSibling)
{
stack.Push(child);
}
}
}
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading