Sublime Forum

ST3: ExportHtml

#44

I think it’ll be fine actually

0 Likes

#45

[code]>>> import posixpath

import ntpath
ntpath.basename(“C:\fuck\fucker”)
‘fucker’

os.path is posixpath
True
[/code]

Learn something every day

0 Likes

#46

Yup I tested it after I posted. Also added the “with” statement. Hadn’t seen that before, though I still should have done the try catch stuff. Oh well though, this is why it’s good to share code.

0 Likes

#47

Oh, wait, one more thing.

Will that helper handle nested assets? “Packages/Path/Subfolder/asset.pth”?

0 Likes

#48

It will as soon as I fix it?

edit:
the “too” at the end was wrong and bothering me.

0 Likes

#49

Haha, good answer

There’s also the bytes/unicode inconsistency on python 3 between zipfile open and normal open

0 Likes

#50

Had to go take care of some other things, so that took longer than I wanted it to. Anyways, it should now handle nested assets. Also, everything is returned as bytes now.

0 Likes

#51

I meant more this guy:

def get_package_and_asset(path): package = os.path.basename(os.path.dirname(path)) package = package.replace(".sublime-package", "") asset = os.path.basename(path) return (package, asset)

That helper doesn’t handle nested paths too well.

Your get_package_asset function should have worked with nested files before, if I’m not mistaken :smile:

0 Likes

#52

Ah I see. I will…get back on that. Ha. No I don’t think it would. I was just looking at the top level package directory, so anything nested would have been missed. I was…umm…testing you to make sure you saw the problem too? Yea let’s go with that :smiley:

0 Likes

#53

Unless you meant specifying the entire asset path, then yes it would have. In fact, maybe I should go back to that.

Edit:
So get_package_and_asset_name handles recursive files. I’ve added a parameter to get_package_asset to do the recursive search (defaults to false). I was thinking this may be useful if nested folders are allowed for settings. I think I’ve seen a post on this forum related to something like that.

0 Likes

#54

Sorry, was out getting dinner. So it will search for a given base file name anywhere in a zip/folder?

Can’t imagine when I’d want that really.

Mostly I just want ability to get things like dict(pkg='Murky', relative_path='waters/salty/green.color')

Will look over latest incarnation

0 Likes

#55

gist.github.com/skuroda/4965913 … set-py-L40

Opening explicitly in rb mode ftw

0 Likes

#56

gist.github.com/skuroda/4965913 … et-py-L125

os.walk should in essence recurse by itself I think

I know the doc for get_package_and_asset_name says “This method will return
the package name and asset name from an absolute path” but it would be nice if
it was able to handle paths as returned by things like:

>>> view.settings().get('syntax') 'Packages/Python/Python.tmLanguage'

0 Likes

#57

It should do what you want (though test it to make sure). I did some and it appears to extract the package and path properly. The recursive thing was more of a me thinking of something else when you said nested files. Though if sublime text allows for nested directories, someone may define a keymap file not at the top level. Of course, this doesn’t affect your stuff. I may go back and just take it out. If Sublime Text allows the nested structure at some point, I can re add it. With that being said, I’m done for tonight. I’ll check back tomorrow for feedback.

Ha yup. Do you know of any reason not to do that? I’ve never had a reason to open files as binary in python, so I’m not sure it’s 100% safe.

Hmm, I didn’t think it did when I test it, or maybe I just wasn’t paying attention. And yes I wasn’t paying attention. Sad…maybe that’s fatigue setting in.

Side notes:
Hmm, great how export html was only discussed on say…the first 20 posts in this thread, but it’s all related. And as a random note…apparently the Sublime Text team is at least 2 people (the latest blog post isn’t from Jon).

0 Likes

#58

someone may define a keymap file not at the top level

Ah, I see why you wanted it now

0 Likes

#59

Yes, this is a very recent thing. Jon will be mentioning more on that pretty soon I’d imagine.

0 Likes

#60

Well, for this, I think you’d probably want it to default to return unicode text, with an option to get it binary.

In any case, the main thing is that it should be consistent.

A user of get_package_asset probably just wants something consistent, whether it be ST2/ST3, some partial contents from a zip, or complete contents from a file.

In sublime 2, the open() returns str() which is essentially the bytes() from python 3.

Sublime 3, with python 3, on the other hand, returns str() which is essentially unicode() from python 2.

zipfile seems to return raw bytes in python 2/3

0 Likes

#61

[pre=#0C1021]def _find_file(abs_dir, file_name):
for root, dirnames, filenames in os.walk(abs_dir):
if file_name in filenames:
return os.path.join(root, file_name)
[/pre]

I think you can boil down the code to pretty much that, which will return None implicitly if nothing is found.

0 Likes

#62

re: testing out the function, you can set up test suites which run only on reload as so:

[pre=#0C1021]##################################### TESTS ####################################

import unittest

class GetPackageAssetTests(unittest.TestCase):
def test_get_package_and_asset_name(self):
tc = get_package_and_asset_name
aseq = self.assertEquals

    r1 = (tc("Packages/Relative/one.py"))
    r2 = (tc("/Abs/Packages/ZipPseudo.sublime-package/nested/sort.py"))
    r3 = (tc(sublime.packages_path() + "/Absolute/Nested/asset.pth"))

    aseq(r1, ('Relative',   'one.py'))
    aseq(r2, ('ZipPseudo',  'nested/sort.py'))
    aseq(r3, ('Absolute',   'Nested/asset.pth'))

################ ONLY LOAD TESTS WHEN DEVELOPING NOT ON START UP ###############

try: times_module_has_been_reloaded += 1
except NameError: times_module_has_been_reloaded = 0 #reloaded

if times_module_has_been_reloaded:
target = name
suite = unittest.TestLoader().loadTestsFromName(target)

unittest.TextTestRunner(stream = sys.stdout,  verbosity=0).run(suite)

print ("running tests", target)
print ('\nReloads: %s' % times_module_has_been_reloaded)

################################################################################
[/pre]

0 Likes

#63

[quote=“castles_made_of_sand”]
I think you can boil down the code to pretty much that, which will return None implicitly if nothing is found.[/quote]

Nothing wrong with simplifying…but I can’t stand implicit Nones. It makes it so clear that that is actually the intent to actually return a None for clarity sake. I know this is stylistic and all…just saying…

0 Likes