HTML export issue
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:

Not quite sure what the pattern is, as there doesn't seem to be anything odd in the Note.
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.
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:

The only issue is non-checklist don't seem to have any IDs (or I don't see them in the protobuf yet ;)).
Thanks, that is extremely helpful!
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
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.
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.
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.
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.
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.
This will be solved when #69 lands.