apple_cloud_notes_parser icon indicating copy to clipboard operation
apple_cloud_notes_parser copied to clipboard

HTML export issue

Open guiix-code opened this issue 4 years ago • 9 comments

I have some notes that are breaking up sentences and words into multiple bullet points.

Example in Notes:

  • List:
    • Benefits describe...

Turns into:

  • Benefit
  • s de
  • sc
  • ribe

Screenshot: screenshot

Not quite sure what the pattern is, as there doesn't seem to be anything odd in the Note.

guiix-code avatar Jun 13 '21 23:06 guiix-code

Thanks for reporting this! The HTML generation is about the jankiest code in here, I'm surprised there haven't been more issues.

Would you be willing to share the gzipped protobuff from a note that demonstrates this behavior? The SQLite query would be: SELECT ZDATA FROM ZICNOTEDATA WHERE ZNOTE=[the offending note number]. This wouldn't have any of the metadata, just the note content and markup. I have a few lists in my test data and they're not displaying this behavior so I want to figure out what is different.

threeplanetssoftware avatar Jun 14 '21 00:06 threeplanetssoftware

I don't have the raw protobuf on hand for this but this happens when you create a todo list and don't type quickly enough. The easiest way to recreate this will probably be creating list like so:

[x] foo
[ ] bar
[x] baz

then waiting and changing it like so:

[x] foo
[ ] bar go brrrr
[x] baz

List items, which may not be adjacent, should be merged together: image

The only issue is non-checklist don't seem to have any IDs (or I don't see them in the protobuf yet ;)).

kiler129 avatar Feb 17 '22 03:02 kiler129

Thanks, that is extremely helpful!

threeplanetssoftware avatar Feb 18 '22 01:02 threeplanetssoftware

I've also encountered this issue, here's the hex of the gzipped protobuf of a note:

1F8B08000000000000137592CF4BDB6018C793B4B3C99BDABE4DFD19762813217A127FD4316407C1610FB2B9C22E3B894414A491B68A4745D4E376F51F71BFD841B7FBC06DF8F3E271381DD85D4A0EF349F64DE8FB8281907E3EEFF33CDF376FAA2BD6AEA12B5CB1370C6BF29957A9D79EB052A5EE56596972A6F062D95D2F94E72A3536323C3EC49EAFB9D595B95A8D95BDD5EABCFB7F85BD5A9AAF7BD5C28C57F198CD5932184703C3A7A386462593B2C3A7A3C130AEC224604C9E0C8DE924617A3943CD03987ED4284E9B6D85A68F6BA14917542705D70D6792D3D199459EE918303CDE0183E9E0091813936631C9A24969540D700355ED30533C0D9381198B6767618661320E87791CBF4B0EE6697C4A16F22790AF507E1EAE884939721D70E3511EB94EB811384EAE0B6E142E4BAE1B2E87B7D6C9F5C0A55A727BB13B23CA756CBB8BE9F47DFFD195A56F1DFF7EF490D98CEF95FCCD85E5E9D2D6EBAB3FCD9F2F8B96A697E9CE0F6674D5A2FF458FBAB87F7BF9A68D38097E07D6C0EFC141BD4BFCB1A53EE04FD2FA0D3801BE95B8D1323FE0BF52FF7643E49D86D8BF2BADCBF99F25FE2EE5FD90D60F9AE2FA6153CCFB22F1D7A6D87FF5F697D0FFFB1E8EFAAFC1D1F9DD80A379477E303F4DAC117DF3C5DD1DFB62FA89C4A7129FF9E2EECF25BE90EA3F04A7730792DAE04C8C040000

Here's the generated HTML:

<div class='note-content'>
<h1>Fonts:</h1><ul><li>I</li></ul><ul><li>nter</li></ul><ul><li></li></ul><ul><li>IBM</li></ul><ul><li> Pl</li></ul><ul><li>ex</li></ul><ul><li> </li></ul><ul><li>S</li></ul><ul><li>ans</li></ul><ul><li></li></ul><ul><li>3</li></ul><ul><li>2</li></ul><ul><li>70</li></ul><ul><li></li></ul><ul><li>Ov</li></ul><ul><li>erp</li></ul><ul><li>ass</li></ul><ul><li></li></ul><ul><li>So</li></ul><ul><li>ur</li></ul><ul><li>ce </li></ul><ul><li>Sans</li></ul><ul><li></li></ul>
<ul><li>Vi</li></ul><ul><li>c</li></ul><ul><li>t</li></ul><ul><li>o</li></ul><ul><li>r M</li></ul><ul><li>ono</li></ul><ul><li></li></ul></div> <!-- Close the 'note-content' div -->

Here's a copy-paste directly from Notes:

Fonts:
- Inter
- IBM Plex Sans
- 3270
- Overpass
- Source Sans

- Victor Mono

Here's the output from the CSV (looks good):

[...],"Fonts:
Inter
IBM Plex Sans
3270
Overpass
Source Sans

Victor Mono
",[...]

I'm on MacOS 10.13.6, the note may have come from a phone running iOS 14.2

weslord avatar Mar 11 '22 21:03 weslord

Thank you so much for your patience. I cleaned up the HTML generation and think it works much better now. Commit 033cee1 has this merged into it, please see if it works better for you. I now see list items that have embedded newlines correctly taking up multiple lines and do not have all the duplicated tags in between anymore.

threeplanetssoftware avatar Jul 16 '22 10:07 threeplanetssoftware

It's looking a lot better. I think all of the single-level lists are working properly, but I'm seeing a lot of tab ( ) characters randomly inserted in the text of the deeper levels of nested lists. Much easier to simply filter tabs out after the fact, though, for my use case.

- meat
- fish
- berries
  - salmon berry 
  - strawberry
  - blueberry
- grains, breads, roots and carbs

...ends up looking like (this made-up example)...

- meat
- fish
- berries
  - salmon	berry
  - 	strawbe	rry
  - blu	eber	ry
- grains, breads, roots and carbs

I will get you an actual example with a hexdump when I have a little more time.

weslord avatar Jul 16 '22 21:07 weslord

Thanks for flagging, my indent tests didn't involve checkboxes. I'm pretty sure this will end up be related to this line: https://github.com/threeplanetssoftware/apple_cloud_notes_parser/blob/033cee1b6879fdf6eac18f34f8212770610a6ee0/lib/AppleNote.rb#L609

I'm ginning up more sample notes that mix the different list styles with indentation.

threeplanetssoftware avatar Jul 17 '22 00:07 threeplanetssoftware

Yes, that is the offending line. I need to change the CSS to properly indent multiple levels of lists, but can push a change that'll remove the tabs from them now, if you'd prefer not to wait.

Edit: There's no cost to pushing the fix, so I've removed indents from lists and checkboxes while I fix the CSS to properly display them.

threeplanetssoftware avatar Jul 18 '22 11:07 threeplanetssoftware

Here's some example data from a note with nested lists where for some reason 033cee1 generated excessive internal tabs.

Hex of the gzipped protobuf:

1F8B0800000000000013659A776053D7D9C691BC64D9D8D7F23676AB8CB64E0249D3A6499BA62569F2657CFD461A92A66D46ABD82252636C2A2B21A4CB9861F6DE1BC21EC666EFBDB1C1018C6D6698211062F60CD0738EDFE7E8954EFE08DC9F9EF3AE33EE7BEFC5D1CA55DEC7E66865B5CAB9DDDBE6AA8D7DC3DBD11BF0161778DDA5C1C0C705C18F03DE52A7F3CD2E25EE82224F69A9BBA4A33B0089F34589BCA5CF3A3B7D5C14F4772EF2BA3B7BC42F41CF87DEB6EE8E2501B7BFD8E70DF8831E2196A0A8505C157FD8D65D12F8D053ECFFCC13F497143B8BFCC51F95B6757B8ABBB62BF407BC05127A8ADABA8B4B8ADB712198CFEF0D7802053E7F8124059EE2E292A03B18F07CE20D947ADD1D3D81A070EA6EE72EF577EA5CD4D5ED71FBBA76F606A417E7EBDE80CFD35964512C7EF016170A7B85DE52612310E8EA2EF4043DEDDD6FFABC6E4F41D782227F4128D352B7C8CB1DF407458A726C5BF153675119916BA84EC8B05419299609B9556EEE6089324EDEA429CFC7C1924E222B914251D72764A0FE02615D04E1EFA87C061F77BF54E2EEE275179588A484A02420CA1814A176F67CE02FF207FDC292C8D3DBDEFDA2A7580A3D8585C2A5FB44D9787F71A1F7D3136513943F77D0E70986C215C188048BBC9E8E6DDDFE8E725C6189BBD8EB2DA4F45FE08149639DBC810FBDD298BFD8FDD66BEEFC427F69E7224F4BB5DC9E5269C41F14766452EECE811251EA6057B94CA49F96F92C09747DE471E7DB320E51FDCEDEE252692CE8F3CBCA8BECBAC86A8948BAC80445AD3A793E92C65A26A15D69B0ABA8BA9E0A2990A65592EDDDAF95B6241814732CBDCA828B252666C55F54248CE87AFA3D4191A40850CCA698A1974A44FD44E022D7A037D0DED9C12B5C1695963CEB7ED3F3C1CB1D9CB2A89D44F98A9433B5BEDBB1D5EC7EE9855764F61E7747BF88AEB46B69D0DBC9DDC51FF4891403852DF3EECCB19CD1726F89DDA5FECCB7E5A438631C366B4F9E6513C826903D275588ECD6F3566C8EFCE9B0CD6DCB8F22F88A951882D104DF1563358C513EECD67BCAA05D188C251F7579560AF98853C86E9DC8D32A873026D1718D84B178056D8036059DE4F67D2B41B93D22DD2610EC60C58760628E4BC197C9648260AD89B5B26214730A96442C8658BC60C99487534768918B044AF7907491424313855FF9A743301709D3ADC742C254827ECB1E826994F4C1284191743AC1A62856890CF2F39115AD58A2609964B2C4FA6DC864168D5E6963A3B373D2145C65A3F228690E4937DB28EFD602B621E90E9BF5FD903497A4676D56949226099847F0BC8D8292AEBE47E39B6D56EBD0F8EF93F43B9B5855529A2CA09B60B99D8CCAF10FD0F89EA2F4A1F10F123D12C58BFF10191864A75C5D023E4C7030AC5A02FE80E0303B2BF40F098EE0C37F4470A4DD8A533045C07C8213A07C50C04728A689761ED3A3249D0469AA808F9174B25D544A4BDB92741A824A13B01DC11976367F8F139C89A0A4F20982953CA71F93A72A1163C8D39324DD0BA3E902FE84A4FBC2A43F25E9354833047C8AE0753B9BE99FD1F8DB61F93F4DF472946585E83398D5683A4014FD39CA126DB50DD15F10AD8DA61348D167891E0CB3F04BA267A3F9B67A8EE8A5681ED9AF88DE0CB3FB6BA2E5317C6ADA13AD88E1769F27DA3FC64A0FD117884E8BE12BFE374497C6584921FA22765798B79788EE89B19243F4BF881E8BE1F1BE4C53713486AD8F5708D6023E2BE0AB047773E56BD8F380BF10F0BF096EE7CADF12DC1243FBE8E702FE0FC16AC06704FC5F828B31FC6901FF8FE012C09F09F8FF04A7C4B01DFF3AC13E31B48E9F12F07704FBF190DE20D88BC30E04EF4513FCA9806F12EC16C3E05B04EF4793A39F08F87B2C6D0C7F52C0B709DE00FCB1807F207819F00901FF48F04A3465F4B8807F22780ECA7602BE43F002BC4BF82EC18BD12CA3F7083673F83E0E5B0C6F2BE09F099E896647C05F08EE037C4C400FC1FA683AEBA5F2038235DC5101C121808F0A5848705434DDE724F4121CCA6D76C4A11ECDA6F8435ACA47C38E6F1F49EFE0A87948403F497B8549FF8AFB07A499027E44D2BBF254D4D2226C9B30039D88F608A3C544BF0CA32538ACC268670AA1224AF41D48EC6F241D1AC5F76880A4A3A3D871594AD2F151FCC616C4711F45374629FD98A4F3A2A8C551D24F48BA8CF7055D48BA3C8A1F339F92742BAC6609D815B31DC566E6331C3D51962334FEEF246D80AB6C01FF41D2C6B0B2FC93E8E918D1DD69FA2FA2DD62B9F6DF39E92D9310CB9D95D9080F8DE595E9063C354C5D0E5C1966BA3BF0E8D65CDD0378466BEBED10EE09DC33C96A13C2BD80AB92782415C09393D4A92D1290B837F0B4247E4BEA03BC32C97285705FE0DD493CEE7EC05F24F13B4D7FE02349FCA63200785F8B5A6C13890702D727F1E407011F4FE32E07039F4FE30DEA10E029E95C3D14787ABAF540080FD3E9A4F3E487039F48E7B7C811C0F7C2D4238107667097A3808765F0BBE4683DC519BCB51803BC34C3CA0EE1B1C0B332D4D6B45B73241E67A3955999214A855D301EE2411934C3B3A57802C4A332D8969B08715F886749F124886FA4539326C593418FA733135360E2604BADC5FA9426A6021F4AA798A74BFC39F0D67435BD62C5493C4D6F9074B1A1E55F3E97783A3C8E4C6707D50C3D3169EA11408C92E299C0E792C419AE8B370BF862122FF56CE0DEC9FCC49D033C26D9FA5E08CF055E9E6C3D1CC2F380CF265B4F85F07CE049166F822A81AB2D2B2F841700EF0DC355C0972CBECEAA81CB52F86E5A083C3C851B5904BC2A85EFA6C5C04D29D63321BC442F56175FC34B8147B8D4E4105E66A3937541489DBFDC261EEE5403E5524FC8F2617305D82E176EAEF92BC1F6E8B59BBF0AAC512FD1FCD5F0DD9041AB6B9EF4BD06BEBF71119E6BCB5F0B6D9D8B4E949152BB0EDA7A973AC4ECD67C5BFE7AC00B2E755F527003E06D172D4E0137028E4CB5B200370156A7D2F04A5BFE66C0ADA9EAFEA1E016C02F53AD34C0AD8065696A6E15DC0638208DE214703BE08C34B54C15DC01589946D90BB853879446D90BB80B7031B68A8035808D0CD6023665846CEEC68C1C93C754CB8CEC01BB1A627560FD32715EE47F01362E53CFFA5EB03999562EB17D60DB32C531DBC2F6839DC9C4BECFAF073B98457D5BABFC037A8F64D2F1B552CE7803A4D732B5B411AC7F96D8932DAC096C4996F510B1836027B3AC47881D021B986DB9891D06ABCAD6F68EE854B2D196E41FD58B3F5B1CE92DEC984E2F5B4C7F0BFB12AC3C472FFEE360DF65A3A3CA3F01D63D47B3933AB71CB1445BD829B08D39562AB1D3384EEB73D8017E46DFFB73A8881B6411BF8281EA1C71D0B418380BB62114E4D7600D21760EEC508EF524B1F37A3DE4A2C1CFFF06AEFBB721D7DBA4EB0B900E6EA397CEB76023DBE883A5196C691B2B83D845B0D36DF4C17209795F6883F520BC5C86F248487905EC7A1B5DDDAB603521CFD7F4CCB4D10BFE3A588F5CADBB0136215717E72692DE904B3BAD4E267D0BD28921E96D6CCAA9B9B4FBF7D8F2EF00CECDA58D2EE077806B19BC0B4FCB00774B4FF7A05DC1B4F701D7202A01CBEC5844B9A2256F89A91B58DF3C9D7A39D8D03CBD5FBBDBC9F9843C3258AFBA583B5E35E5B15B7A4FD021FC95692F98ADCB15AD6D8BD90AB0B23CD1D7B6B0DE70353B8F8ED383AA7B05DE9047AB4BE1BEC05B1058A3EA5E81B7E6D1A9A8D4FD8197C07683EA5E816FE652C3B25F75AFC07750C57DAA7B05FE2E9722D9ABBA57647D2397653D04F45A2E7B121E0A7A3E1779CBD61586D787664DB6AE10AFE22646403C3F57354876AB5675AEC00B61A34675AEC08B10F32ED5B9EA5A63F1EC549D2BF024D46387EA5C11C8885CF64C380EB43BCF7BBCAE741B8A63AB6A5C219ED9066B5036AE108F80788B6A5C810FE610DE24F164D868CC61F59802F1018837AACE15E2B55CFC39C4B3205EAF1A57E0AA303C1D36D6F3937606E8EC1CD656CF84893E30B14EF5AD10F7E561CC86F87236B5286B55DB0AF1ED6C269E0B7A8AD37930B1339BFCAD514D2B7065364DEC6AD5B4C2C6BA6CF690B100E2FE10AF523DABAE731673580DF1B82CD5B28A8347B5AC7A2565A92754C28BF4BACB22D3CB55CB0AD3B3B2584597E89594C54EF6A5A0E55CBB0C86EFA15958260D2F073E9C49E5582AF10AD83892C92CAFD48704C44BA47815F0E44CDA598B255E0D3C34935259A49A57989E9EC95E36AD857878269DF50B55F70ADC23933656B5C4EB61A32293BD97D900DA9CC1E846983884D6AE4A9AD8047C340C6F868D2BFC41718B2E07A75B410F73BA4D6F42185E200D6F87787F1A0B6E875E8D6846274BF14E88F7A531CBBB20DE9846AB7F9214D7E825837E78A2C4B5B0B1268DD57937C40B209E20C57B20AEE20EEB40E773FA853EECD0948F9726F642DC9F8BF7417C35956E20E3A4783F70432A2D99B112D7EB8AA6B2221D8078752A6D9531AACF85B83295BD066B84B81CCF26A3A5B809E201A96C411F04BDE9623BF6104CEC75D1A21B214D1C86F82B172BE8117D3F75D193FE70293EAA4F463CA20D93F898BEDBE0214DE12F61BADAC56A771C7434A727F44E81E521D2C449E0C1087AB0C4A7806B52483D48E2D3C0B5C003253E03BC2985A665806A8611C8EE14D6B59C05DD9EC226EB6B98A84EA10CFB4B13E78057C2A1C2E76163510ABB277CA3278BD30BA0772D568E6F61B8D9227FFDA4E16688EF596C662FEA53DEA222F595E24B3A3F8B657219E2F110F791E22B7A8D26E3F145D0ABA0CB925970D760625032D5B3B734711DE2E1C96C25DD80B82C99F6558514DFD4671DB77C4B9F75498CDE06DD93C4B2BE035ACBB5DFE995914433D253BABBABABDC9ADDF1EEE923BE35ADF2EE527C5FEF9F78B25C2C685914D15BF1347D9D04ED065AE664CD5039E88258165B77D039A0BF96CD33E85CAEED093A3E96ECFE4A36CFA0F36259252A40FBC7B2187A8396736D1FD0EBF89AF59C6C9F416FC6D039F24BD93D831EC76BF67CD93C839EC27BFA1FC9DE19F42B687F285B67D0B35164F707B27306BDC4BF140C063D01FAB06C9C414F72EDD0287AB0391C45B37C50F4CD51349B5FC7D2BF2238AAFA6658A8427DDBCBBE19E26ABCA657E291105FE5451B057A19F415D935832E8CA5F5FE1BD934832EE316C682AE4010523B0E7425E80BB267065D154BE7D2F3B26546C05BF1B941053C11F8462CBD9F577812F0DD58FAF0A3F064E08A387AEBA7F014E07E71DCC854E0D171DCC8E7C093E2E8E5ABC2D38097C5D15B7185A7036F8CE3B33203B83E8EBECB283C13788C8BBE17293C0B2599E962DB7736C467E2A8F91BAAFA66E073717C6AE702378765330FF876987A3EF0FDB0925402777770230B800739E8E5B0C255C0531D566E0857EBA974D017018517029F74D0CB618517015F71D02B70851703DF72D0770F8597008F8FE7E92C05AE8BA7EF1E0A2FD3158CA70F4A0A2F47B94FE3002C92DD33E80E1C801FC9EE1974423C3DC3FE5536CF303C2B2C8CD5C055F1F4E550E1357A8DC4F3AAAE05BE1866641DF06027CF653D70A593976F03F026279FC88DC0DB9C7C596E023EE0E4EB6F3370CF041EE0167DE238F992DFAA579A936FD56D7AED24F048B6A380379C746094CA165A4FAF93CFCC4EBD5313784976010F4FA00F1F0AD7004F08C3B5C073C28CEC069E9FC017F11EE07509F4EF7014AE03DE95C8B3F9421730911BD9AB2B95C8CBBD0FB84F6B1EC97E9D656BFA1EA2703D70DFD674EA974B7C00F872223D6D74538D3470AFD6D44229DC08DC1B46CA54278D59B8934877B57FCB4E1AB45B6B3AE2253D047A2F91B5E887F5A649A476EB5FB29106AD4DA493EB9FB28F06AD4F6477B56308ED7802DF1D5FEA132A819FB7C761A32FB77102E26FC2A6FC24F080445EE853B07125816C74956D34C457C356FB193D2B6136BE021E18B610CEEA933C91DF6ABE86C7C1A8D2DF651FADD76F223FE3CEEBC32CCCF437C02B12E90BB6C217607A6A22BD39FE87ECA44197F33235834E4C64BDF145DD4841FB99ECA3415727D006FD54F6D1A06B1398DD2BBA9983B68B6CA341A725B006ED1AE83858F84476D1BAF103FD5876D13AB2045A4641D944835EC0BF020DC8261AF45B278BECB66EDB9CAC3BBF035A87F6F56FB28906DDE2643DCC5DDDAD38A999EB2C7B68D0E94EF6087A5FC7EB64F52D8B26DA0BB444B6D0A07DB9B772D0ABF1CC4277D02BF12CB71EA097E299859EA0DBB9B617E8AA78CAD82F5B68D00D5CDB1B740EA84FB6D0A073E3A9921FCA161A7426B45ED94283CEE676FB838E032D942D34E858AE1D087AD341B440B6D0A0CD0EAACE07B285063D06EA912D34E85A58F88B6CA141D739D87A18063A1116FE2C5B68D0CD0EFEEA19B48F832AF9BEECA041BB71ED28D03B716C3647835E8B63318C013D0FED7BB28306DD05ED3BB28306DD1B47DE241D0FBA3F8E327E5776D0A075A07F920D34E817A07F94FDB35E2571D4EBFC41B6CFA00BE26817BE2DBB675D3358F8BD6C9E410780BE257B67D08171D42DBD295B67BD03A0ED203B67D0EE71749B794336CEA0B762A93ABF937DB3DE59716CEDCC02DD8D2789D765DB0CDAC41F38E7801EC473CB4BB269063D8C47CB1765CF0C7A0254DA9D0F7A96DBAD8CA6C3FA7AD883D68216B1CD3A99A7DCB5FCD3F9AAE89C0CA7C3D1CABA2FFE4BB65AE5E8BF3FF89C33D7697518FDCA03EF94BDBA6C48C5F9BF279EAE99E18A729CCE13FF3B6693BF8E79ED4EB78E45AFBED6FD9DF3CDB7EADF785AFC7052FE7AD4F66892C3E68A76B4CAB2F9D6ADBF3D38565CBBE8BA86AEF5EF158747F2EB51EBE4EF89E2DA2EAE46D6B4A8A3C5AF5E713D91AE63E97A125DC7D0F564BAB6D3F59488F1D36A42DEE5F5F488EB0D07E4B5E58872C5CA6BB7CDB79548B426DB88D834D96190CA9A169240C4EE9B45244693D944EC9ACC31C862832C2112ABC952C3F2B29AF098EDBEE535E111DA7D6B0DCD3A83AC37BC6F307C6D34C8A69AF01ADA7D9B0DEFDB0C5FDB0D5F3B0CCD4E22899AD41A96771B6471AD51C3DA48CD5283ACAA8DCC6BB541D6D44666BAB6D6A8AAE17D7D6D64169B0CEF9B0D5F5B0C5F5B0D5FDB8C51DB89C469B2CBF0556744B89F48BC264D86E6A4E1EB94A1396DFA32F6D7C903E1EBD9E63B65ECB8D3C6A83306F9EA40783C36DF59C3CED7C63E3D67D8396F68BE3D109E97CDD76C58BE6178EFD61069A77B43A49D1E0D91767A3644DAE965900AC3726F43D3C7B0DCD718D5CF8867A0316A5043E4EC0C6E085F1B36DF70C3CE58838C33221C6FC433C120B31B2267E79811E19786AFE30699676431DFF055699025869DA5463CCB0CB2DCB0B3C2B0B3D218B5CA20FB8D98EB8DDC0F18BE1A0C3B8D869D26C3CE41831C32C861C3D7B786E56663D44563D4654373C5A8CF554373CD583F370C72D388E79661F9B611CF1D739F36467AEFD118E9ABA7A1E9D518E9ABC2D0F46E8C9C9D3E06E9DB18194F7FC3CE004333B031BCDF109D8E316ABA11E10CC3CE4C83CC3246CD362CCF31EA33D7C86B9E6167BE61A7D2200B1A23E7B4CAF0556DC4BCD0205B8C783618F16C34466D36345B0D3BDB8C51DB8D51BB8CBC6A0C526BE4B5DBD0EC313475463C078D8A1D32461D36C811C3D75E23AF7DC6A8FD86F77A63D401839C36C895083B76DFED085F76DF9DC6C84EE6BB884CEDBEBB06B96790FB06296B8A24DD9A22E3296F8AEC64561964B531AA7B53F84AB0FB7A18A37A1ADE2B883835E9D314598DA1061966F81A6EF81A618C1AD9143EEF76DF28220E4D6618762619994E36EC4C3146CD32BCCF36621E6DD819D31439EF630DCD38C3D71C23C2B986AF7906996FD8596078AF3234D58666A1A1D9D6F3FE60FE9CB983AEA3E8FA385DE339F5045DE339F674C4F5B15EE1F60E445C37445C37465C9F53D77C2F37137168729148689F7E5E713FE2649B462474024CAF881C358348E8DE34DBB073A95724B94C84F50986E62A91444DAE1B79DD30468DA988D48C35B218A7883394C57F00BD7A5F9088440000

Copy-paste directly from Apple Notes:

Reference structures

- Two class of reference
    - Classes:
        - multiple parentage, for inheritance, foldering, organization
        - links, any-directional, non-organizational, non-hierarchical, cannot traverse farther - simply a hyperlink
    - Perhaps only end nodes carry data? The acyclic references are title only, represent structure, folders? Then any links to data nodes are automatically/implicitly different. Do we lose important capabilities here? Can we add an “index” node that represents the leaf, if we do need data? Automatically “merge” in UI (display data as if it were a property of the directory).
        - What happens in this case when we want to make a cyclic-style reference to the index? Is that type of linking still a differentiated process? Does it matter?
- See also: TabFS
    - Can model the multi-inheritance DAG as a file system with hard links

Latest commit produces html with a nice-looking flat list with no internal tabs, but loses the nesting.

weslord avatar Jul 19 '22 19:07 weslord

This will be solved when #69 lands.

threeplanetssoftware avatar Apr 22 '23 02:04 threeplanetssoftware