le>

+ 4 - 0
chapter_02/birthday.py

@@ -0,0 +1,4 @@
1
+age = 23
2
+message = "Happy " + str(age) + "rd Birthday!"
3
+
4
+print(message)

+ 2 - 0
chapter_02/comment.py

@@ -0,0 +1,2 @@
1
+# Say hello to everyone.
2
+print("Hello Python people!")

+ 5 - 0
chapter_02/hello_world.py

@@ -0,0 +1,5 @@
1
+message = "Hello Python world!"
2
+print(message)
3
+
4
+message = "Hello Python Crash Course world!"
5
+print(message)

+ 6 - 0
chapter_02/name.py

@@ -0,0 +1,6 @@
1
+first_name = "ada"
2
+last_name = "lovelace"
3
+full_name = first_name + " " + last_name
4
+
5
+message = "Hello, " + full_name.title() + "!"
6
+print(message)

+ 4 - 0
chapter_03/bicycles.py

@@ -0,0 +1,4 @@
1
+bicycles = ['trek', 'cannondale', 'redline', 'specialized']
2
+message = "My first bicycle was a " + bicycles[0].title() + "."
3
+
4
+print(message)

+ 13 - 0
chapter_03/cars.py

@@ -0,0 +1,13 @@
1
+cars = ['bmw', 'audi', 'toyota', 'subaru']
2
+
3
+print("Here is the original list:")
4
+print(cars)
5
+
6
+print("\nHere is the sorted list:")
7
+print(sorted(cars))
8
+
9
+print("\nHere is the reverse alphabetical list:")
10
+print(sorted(cars, reverse=True))
11
+
12
+print("\nHere is the original list again:")
13
+print(cars)

+ 7 - 0
chapter_03/motorcycles.py

@@ -0,0 +1,7 @@
1
+motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati'] 
2
+print(motorcycles)
3
+
4
+too_expensive = 'ducati'
5
+motorcycles.remove(too_expensive)
6
+print(motorcycles)
7
+print("\nA " + too_expensive.title() + " is too expensive for me.")

+ 9 - 0
chapter_04/dimensions.py

@@ -0,0 +1,9 @@
1
+dimensions = (200, 50)
2
+print("Original dimensions:")
3
+for dimension in dimensions:
4
+    print(dimension)
5
+    
6
+dimensions = (400, 100)
7
+print("\nModified dimensions:")
8
+for dimension in dimensions:
9
+    print(dimension)

+ 2 - 0
chapter_04/even_numbers.py

@@ -0,0 +1,2 @@
1
+even_numbers = list(range(2,11,2)) 
2
+print(even_numbers)

+ 11 - 0
chapter_04/foods.py

@@ -0,0 +1,11 @@
1
+my_foods = ['pizza', 'falafel', 'carrot cake'] 
2
+friend_foods = my_foods[:] 
3
+
4
+my_foods.append('cannoli') 
5
+friend_foods.append('ice cream') 
6
+
7
+print("My favorite foods are:")
8
+print(my_foods)
9
+
10
+print("\nMy friend's favorite foods are:")
11
+print(friend_foods)

+ 6 - 0
chapter_04/magicians.py

@@ -0,0 +1,6 @@
1
+magicians = ['alice', 'david', 'carolina'] 
2
+for magician in magicians: 
3
+    print(magician.title() + ", that was a great trick!")  
4
+    print("I can't wait to see your next trick, " + magician.title() + ".\n") 
5
+    
6
+print("Thank you everyone, that was a great magic show!")

+ 2 - 0
chapter_04/numbers.py

@@ -0,0 +1,2 @@
1
+numbers = list(range(1,6)) 
2
+print(numbers) 

+ 5 - 0
chapter_04/players.py

@@ -0,0 +1,5 @@
1
+players = ['charles', 'martina', 'michael', 'florence', 'eli'] 
2
+
3
+print("Here are the first three players on my team:")
4
+for player in players[:3]:
5
+    print(player.title())

+ 6 - 0
chapter_04/squares.py

@@ -0,0 +1,6 @@
1
+squares = []
2
+for value in range(1,11):
3
+    square = value**2
4
+    squares.append(square)
5
+    
6
+print(squares)

+ 12 - 0
chapter_05/amusement_park.py

@@ -0,0 +1,12 @@
1
+age = 12
2
+
3
+if age < 4:
4
+    price = 0
5
+elif age < 18:
6
+    price = 5
7
+elif age < 65:
8
+    price = 10
9
+elif age >= 65:
10
+    price = 5
11
+
12
+print("Your admission cost is $" + str(price) + ".")

+ 5 - 0
chapter_05/banned_users.py

@@ -0,0 +1,5 @@
1
+banned_users = ['andrew', 'carolina', 'david']
2
+user = 'marie'
3
+
4
+if user not in banned_users:
5
+    print(user.title() + ", you can post a response if you wish.")

+ 7 - 0
chapter_05/cars.py

@@ -0,0 +1,7 @@
1
+cars = ['audi', 'bmw', 'subaru', 'toyota']
2
+
3
+for car in cars:
4
+    if car == 'bmw':
5
+        print(car.upper())
6
+    else:
7
+        print(car.title())

+ 4 - 0
chapter_05/magic_number.py

@@ -0,0 +1,4 @@
1
+answer = 17
2
+
3
+if answer != 42:
4
+    print("That is not the correct answer. Please try again!")

+ 12 - 0
chapter_05/toppings.py

@@ -0,0 +1,12 @@
1
+available_toppings = ['mushrooms', 'olives', 'green peppers',
2
+                      'pepperoni', 'pineapple', 'extra cheese']
3
+
4
+requested_toppings = ['mushrooms', 'french fries', 'extra cheese']
5
+
6
+for requested_topping in requested_toppings:
7
+    if requested_topping in available_toppings:
8
+        print("Adding " + requested_topping + ".")
9
+    else:
10
+        print("Sorry, we don't have " + requested_topping + ".")
11
+        
12
+print("\nFinished making your pizza!")

+ 7 - 0
chapter_05/voting.py

@@ -0,0 +1,7 @@
1
+age = 17
2
+if age >= 18:
3
+    print("You are old enough to vote!")
4
+    print("Have you registered to vote yet?")
5
+else:
6
+    print("Sorry, you are too young to vote.")
7
+    print("Please register to vote as soon as you turn 18!")

+ 17 - 0
chapter_06/alien.py

@@ -0,0 +1,17 @@
1
+alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}
2
+print("Original position: " + str(alien_0['x_position']))
3
+
4
+# Move the alien to the right.
5
+# Figure out how far to move the alien based on its speed.
6
+if alien_0['speed'] == 'slow':
7
+    x_increment = 1
8
+elif alien_0['speed'] == 'medium':
9
+    x_increment = 2
10
+else:
11
+    # This must be a fast alien.
12
+    x_increment = 3
13
+
14
+# The new position is the old position plus the increment.
15
+alien_0['x_position'] = alien_0['x_position'] + x_increment
16
+
17
+print("New position: " + str(alien_0['x_position']))

+ 22 - 0
chapter_06/aliens.py

@@ -0,0 +1,22 @@
1
+# Make an empty list for storing aliens.
2
+aliens = []
3
+
4
+# Make 30 green aliens.
5
+for alien_number in range (0,30):
6
+    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
7
+    aliens.append(new_alien)
8
+    
9
+for alien in aliens[0:3]:
10
+    if alien['color'] == 'green':
11
+        alien['color'] = 'yellow'
12
+        alien['speed'] = 'medium'
13
+        alien['points'] = 10
14
+    elif alien['color'] == 'yellow':
15
+        alien['color'] = 'red'
16
+        alien['speed'] = 'fast'
17
+        alien['points'] = 15
18
+        
19
+# Show the first 5 aliens:
20
+for alien in aliens[0:5]:
21
+    print(alien)
22
+print("...")

+ 10 - 0
chapter_06/favorite_languages.py

@@ -0,0 +1,10 @@
1
+favorite_languages = {
2
+    'jen': 'python',
3
+    'sarah': 'c',
4
+    'edward': 'ruby',
5
+    'phil': 'python',
6
+    }
7
+
8
+for name, language in favorite_languages.items():
9
+    print(name.title() + "'s favorite language is " +
10
+        language.title() + ".")

+ 15 - 0
chapter_06/many_users.py

@@ -0,0 +1,15 @@
1
+users = {'aeinstein': {'first': 'albert',
2
+                       'last': 'einstein',
3
+                       'location': 'princeton'},
4
+         'mcurie': {'first': 'marie',
5
+                    'last': 'curie',
6
+                    'location': 'paris'},
7
+         }
8
+
9
+for username, user_info in users.items():
10
+    print("\nUsername: " + username)
11
+    full_name = user_info['first'] + " " + user_info['last']
12
+    location = user_info['location']
13
+
14
+    print("\tFull name: " + full_name.title())
15
+    print("\tLocation: " + location.title())

+ 12 - 0
chapter_06/pizza.py

@@ -0,0 +1,12 @@
1
+# Store information about a pizza being ordered.
2
+pizza = {
3
+    'crust': 'thick',
4
+    'toppings': ['mushrooms', 'extra cheese'],
5
+    }
6
+
7
+# Summarize the order.
8
+print("You ordered a " + pizza['crust'] + "-crust pizza " +
9
+      "with the following toppings:")
10
+
11
+for topping in pizza['toppings']:
12
+    print("\t" + topping)

+ 8 - 0
chapter_06/user.py

@@ -0,0 +1,8 @@
1
+user_0 = {'username': 'efermi',
2
+          'first': 'enrico',
3
+          'last': 'fermi',
4
+          }
5
+
6
+for key, value in user_0.items():
7
+    print("\nKey: " + key)
8
+    print("Value: " + value)

+ 10 - 0
chapter_07/cities.py

@@ -0,0 +1,10 @@
1
+prompt = "\nPlease tell me a city you have visited:"
2
+prompt += "\n(Enter 'quit' when you are finished.) "
3
+
4
+while True:
5
+    city = input(prompt)
6
+    
7
+    if city == 'quit':
8
+        break
9
+    else:
10
+        print("I'd love to go to " + city.title() + "!")

+ 17 - 0
chapter_07/confirmed_users.py

@@ -0,0 +1,17 @@
1
+# Start out with some users that need to be verified,
2
+#  and an empty list to hold confirmed users.
3
+unconfirmed_users = ['alice', 'brian', 'candace']
4
+confirmed_users = []
5
+
6
+# Verify each user, until there are no more unconfirmed users.
7
+#  Move each verified user into the list of confirmed users.
8
+while unconfirmed_users:
9
+    current_user = unconfirmed_users.pop()
10
+    
11
+    print("Verifying user: " + current_user.title())
12
+    confirmed_users.append(current_user)
13
+    
14
+# Display all confirmed users.
15
+print("\nThe following users have been confirmed:")
16
+for confirmed_user in confirmed_users:
17
+    print(confirmed_user.title())

+ 4 - 0
chapter_07/counting.py

@@ -0,0 +1,4 @@
1
+current_number = 1
2
+while current_number <= 5:
3
+    print(current_number)
4
+    current_number += 1

+ 7 - 0
chapter_07/even_or_odd.py

@@ -0,0 +1,7 @@
1
+number = input("Enter a number, and I'll tell you if it's even or odd: ")
2
+number = int(number)
3
+
4
+if number % 2 == 0:
5
+    print("\nThe number " + str(number) + " is even.")
6
+else:
7
+    print("\nThe number " + str(number) + " is odd.")

+ 5 - 0
chapter_07/greeter.py

@@ -0,0 +1,5 @@
1
+prompt = "If you tell us who you are, we can personalize the messages you see."
2
+prompt += "\nWhat is your first name? "
3
+
4
+name = input(prompt)
5
+print("\nHello, " + name + "!")

+ 22 - 0
chapter_07/mountain_poll.py

@@ -0,0 +1,22 @@
1
+responses = {}
2
+
3
+# Set a flag to indicate that polling is active.
4
+polling_active = True
5
+
6
+while polling_active:
7
+    # Prompt for the person's name and response.
8
+    name = input("\nWhat is your name? ")
9
+    response = input("Which mountain would you like to climb someday? ")
10
+    
11
+    # Store the response in the dictionary:
12
+    responses[name] = response
13
+    
14
+    # Find out if anyone else is going to take the poll.
15
+    repeat = input("Would you like to let another person respond? (yes/ no) ")
16
+    if repeat == 'no':
17
+        polling_active = False
18
+        
19
+# Polling is complete. Show the results.
20
+print("\n--- Poll Results ---")
21
+for name, response in responses.items():
22
+    print(name + " would like to climb " + response + ".")

+ 11 - 0
chapter_07/parrot.py

@@ -0,0 +1,11 @@
1
+prompt = "\nTell me something, and I will repeat it back to you:"
2
+prompt += "\nEnter 'quit' to end the program. "
3
+  
4
+active = True
5
+while active:
6
+    message = input(prompt)
7
+    
8
+    if message == 'quit':
9
+        active = False
10
+    else:
11
+        print(message)

+ 7 - 0
chapter_07/pets.py

@@ -0,0 +1,7 @@
1
+pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
2
+print(pets)
3
+
4
+while 'cat' in pets:
5
+    pets.remove('cat')
6
+    
7
+print(pets)

+ 7 - 0
chapter_07/rollercoaster.py

@@ -0,0 +1,7 @@
1
+height = input("How tall are you, in inches? ")
2
+height = int(height)
3
+
4
+if height >= 36:
5
+    print("\nYou're tall enough to ride!")
6
+else:
7
+    print("\nYou'll be able to ride when you're a little older.")

+ 13 - 0
chapter_08/formatted_name.py

@@ -0,0 +1,13 @@
1
+def get_formatted_name(first_name, last_name, middle_name=''):
2
+    """Return a full name, neatly formatted."""
3
+    if middle_name:
4
+        full_name = first_name + ' ' +  middle_name + ' ' + last_name
5
+    else:
6
+        full_name = first_name + ' ' + last_name
7
+    return full_name.title()
8
+    
9
+musician = get_formatted_name('jimi', 'hendrix')
10
+print(musician)
11
+
12
+musician = get_formatted_name('john', 'hooker', 'lee')
13
+print(musician)

+ 8 - 0
chapter_08/greet_users.py

@@ -0,0 +1,8 @@
1
+def greet_users(names):
2
+    """Print a simple greeting to each user in the list."""
3
+    for name in names:
4
+        msg = "Hello, " + name.title() + "!"
5
+        print(msg)
6
+
7
+usernames = ['hannah', 'ty', 'margot']
8
+greet_users(usernames)

+ 5 - 0
chapter_08/greeter.py

@@ -0,0 +1,5 @@
1
+def greet_user(username):
2
+    """Display a simple greeting."""
3
+    print("Hello, " + username.title() + "!")
4
+    
5
+greet_user('jesse')

+ 4 - 0
chapter_08/making_pizzas.py

@@ -0,0 +1,4 @@
1
+import pizza as p
2
+
3
+p.make_pizza(16, 'pepperoni')
4
+p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

+ 9 - 0
chapter_08/person.py

@@ -0,0 +1,9 @@
1
+def build_person(first_name, last_name, age=''):
2
+    """Return a dictionary of information about a person."""
3
+    person = {'first': first_name, 'last': last_name}
4
+    if age:
5
+        person['age'] = age
6
+    return person
7
+
8
+musician = build_person('jimi', 'hendrix', age=27)
9
+print(musician)

+ 13 - 0
chapter_08/pets.py

@@ -0,0 +1,13 @@
1
+def describe_pet(pet_name, animal_type='dog'):
2
+    """Display information about a pet."""
3
+    print("\nI have a " + animal_type + ".")
4
+    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
5
+    
6
+# A dog named Willie.
7
+describe_pet('willie')
8
+describe_pet(pet_name='willie')
9
+
10
+# A hamster named Harry.
11
+describe_pet('harry', 'hamster')
12
+describe_pet(pet_name='harry', animal_type='hamster')
13
+describe_pet(animal_type='hamster', pet_name='harry')

+ 9 - 0
chapter_08/pizza.py

@@ -0,0 +1,9 @@
1
+def make_pizza(size, *toppings):
2
+    """Summarize the pizza we are about to make."""
3
+    print("\nMaking a " + str(size) +
4
+          "-inch pizza with the following toppings:")
5
+    for topping in toppings:
6
+        print("- " + topping)
7
+        
8
+make_pizza(16, 'pepperoni')
9
+make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

+ 24 - 0
chapter_08/printing_models.py

@@ -0,0 +1,24 @@
1
+def print_models(unprinted_designs, completed_models):
2
+    """
3
+    Simulate printing each design, until there are none left.
4
+    Move each design to completed_models after printing.
5
+    """
6
+    while unprinted_designs:
7
+        current_design = unprinted_designs.pop()
8
+    
9
+        # Simulate creating a 3d print from the design.
10
+        print("Printing model: " + current_design)
11
+        completed_models.append(current_design)
12
+        
13
+def show_completed_models(completed_models):
14
+    """Show all the models that were printed."""
15
+    print("\nThe following models have been printed:")
16
+    for completed_model in completed_models:
17
+        print(completed_model)
18
+        
19
+        
20
+unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
21
+completed_models = []
22
+
23
+print_models(unprinted_designs, completed_models)
24
+show_completed_models(completed_models)

+ 13 - 0
chapter_08/user_profile.py

@@ -0,0 +1,13 @@
1
+def build_profile(first, last, **user_info):
2
+    """Build a dictionary containing everything we know about a user."""
3
+    profile = {}
4
+    profile['first_name'] = first
5
+    profile['last_name'] = last
6
+    for key, value in user_info.items():
7
+        profile[key] = value
8
+    return profile
9
+
10
+user_profile = build_profile('albert', 'einstein',
11
+                             location='princeton',
12
+                             field='physics')
13
+print(user_profile)

+ 34 - 0
chapter_09/car.py

@@ -0,0 +1,34 @@
1
+"""A class that can be used to represent a car."""
2
+
3
+class Car():
4
+    """A simple attempt to represent a car."""
5
+
6
+    def __init__(self, manufacturer, model, year):
7
+        """Initialize attributes to describe a car."""
8
+        self.manufacturer = manufacturer
9
+        self.model = model
10
+        self.year = year
11
+        self.odometer_reading = 0
12
+        
13
+    def get_descriptive_name(self):
14
+        """Return a neatly formatted descriptive name."""
15
+        long_name = str(self.year) + ' ' + self.manufacturer + ' ' + self.model
16
+        return long_name.title()
17
+    
18
+    def read_odometer(self):
19
+        """Print a statement showing the car's mileage."""
20
+        print("This car has " + str(self.odometer_reading) + " miles on it.")
21
+        
22
+    def update_odometer(self, mileage):
23
+        """
24
+        Set the odometer reading to the given value.
25
+        Reject the change if it attempts to roll the odometer back.
26
+        """
27
+        if mileage >= self.odometer_reading:
28
+            self.odometer_reading = mileage
29
+        else:
30
+            print("You can't roll back an odometer!")
31
+    
32
+    def increment_odometer(self, miles):
33
+        """Add the given amount to the odometer reading."""
34
+        self.odometer_reading += miles

+ 27 - 0
chapter_09/dog.py

@@ -0,0 +1,27 @@
1
+class Dog():
2
+    """A simple attempt to model a dog."""
3
+    
4
+    def __init__(self, name, age):
5
+        """Initialize name and age attributes."""
6
+        self.name = name
7
+        self.age = age
8
+        
9
+    def sit(self):
10
+        """Simulate a dog sitting in response to a command."""
11
+        print(self.name.title() + " is now sitting.")
12
+
13
+    def roll_over(self):
14
+        """Simulate rolling over in response to a command."""
15
+        print(self.name.title() + " rolled over!")
16
+        
17
+
18
+my_dog = Dog('willie', 6)
19
+your_dog = Dog('lucy', 3)
20
+
21
+print("My dog's name is " + my_dog.name.title() + ".")
22
+print("My dog is " + str(my_dog.age) + " years old.")
23
+my_dog.sit()
24
+
25
+print("\nMy dog's name is " + your_dog.name.title() + ".")
26
+print("My dog is " + str(your_dog.age) + " years old.")
27
+your_dog.sit()

+ 37 - 0
chapter_09/electric_car.py

@@ -0,0 +1,37 @@
1
+"""A set of classes that can be used to represent electric cars."""
2
+
3
+from car import Car
4
+
5
+class Battery():
6
+    """A simple attempt to model a battery for an electric car."""
7
+
8
+    def __init__(self, battery_size=60):
9
+        """Initialize the batteery's attributes."""
10
+        self.battery_size = battery_size
11
+
12
+    def describe_battery(self):
13
+        """Print a statement describing the battery size."""
14
+        print("This car has a " + str(self.battery_size) + "-kWh battery.")  
15
+        
16
+    def get_range(self):
17
+        """Print a statement about the range this battery provides."""
18
+        if self.battery_size == 60:
19
+            range = 140
20
+        elif self.battery_size == 85:
21
+            range = 185
22
+            
23
+        message = "This car can go approximately " + str(range)
24
+        message += " miles on a full charge."
25
+        print(message)
26
+    
27
+        
28
+class ElectricCar(Car):
29
+    """Models aspects of a car, specific to electric vehicles."""
30
+
31
+    def __init__(self, manufacturer, model, year):
32
+        """
33
+        Initialize attributes of the parent class.
34
+        Then initialize attributes specific to an electric car.
35
+        """
36
+        super().__init__(manufacturer, model, year)
37
+        self.battery = Battery()

+ 12 - 0
chapter_09/favorite_languages.py

@@ -0,0 +1,12 @@
1
+from collections import OrderedDict
2
+
3
+favorite_languages = OrderedDict()
4
+
5
+favorite_languages['jen'] = 'python'
6
+favorite_languages['sarah'] = 'c'
7
+favorite_languages['edward'] = 'ruby'
8
+favorite_languages['phil'] = 'python'
9
+
10
+for name, language in favorite_languages.items():
11
+    print(name.title() + "'s favorite language is " +
12
+        language.title() + ".")

+ 7 - 0
chapter_09/my_car.py

@@ -0,0 +1,7 @@
1
+from car import Car
2
+
3
+my_new_car = Car('audi', 'a4', 2015)
4
+print(my_new_car.get_descriptive_name())
5
+
6
+my_new_car.odometer_reading = 23
7
+my_new_car.read_odometer()

+ 8 - 0
chapter_09/my_cars.py

@@ -0,0 +1,8 @@
1
+from car import Car
2
+from electric_car import ElectricCar
3
+
4
+my_beetle = Car('volkswagen', 'beetle', 2015)
5
+print(my_beetle.get_descriptive_name())
6
+
7
+my_tesla = ElectricCar('tesla', 'roadster', 2015)
8
+print(my_tesla.get_descriptive_name())

+ 13 - 0
chapter_10/alice.py

@@ -0,0 +1,13 @@
1
+filename = 'alice.txt'
2
+
3
+try:
4
+    with open(filename, encoding='utf-8') as f_obj:
5
+        contents = f_obj.read()
6
+except FileNotFoundError as e:
7
+    msg = "Sorry, the file " + filename + " does not exist."
8
+    print(msg)
9
+else:
10
+    # Count the approximate number of words in the file.
11
+    words = contents.split()
12
+    num_words = len(words)
13
+    print("The file " + filename + " has about " + str(num_words) + " words.")

Plik diff jest za duży
+ 3735 - 0
chapter_10/alice.txt


+ 14 - 0
chapter_10/division.py

@@ -0,0 +1,14 @@
1
+print("Give me two numbers, and I'll divide them.")
2
+print("Enter 'q' to quit.")
3
+
4
+while True:
5
+    first_number = input("\nFirst number: ")
6
+    if first_number == 'q':
7
+        break
8
+    second_number = input("Second number: ")
9
+    try:
10
+        answer = int(first_number) / int(second_number)
11
+    except ZeroDivisionError:
12
+        print("You can't divide by 0!")
13
+    else:
14
+        print(answer)

+ 7 - 0
chapter_10/file_reader.py

@@ -0,0 +1,7 @@
1
+filename = 'pi_digits.txt'
2
+
3
+with open(filename) as file_object:
4
+    lines = file_object.readlines()
5
+
6
+for line in lines:
7
+    print(line.rstrip())

+ 7 - 0
chapter_10/greet_user.py

@@ -0,0 +1,7 @@
1
+import json
2
+
3
+filename = 'username.json'
4
+
5
+with open(filename) as f_obj:
6
+    username = json.load(f_obj)
7
+    print("Welcome back, " + username + "!")

Plik diff jest za duży
+ 21022 - 0
chapter_10/little_women.txt


Plik diff jest za duży
+ 22108 - 0
chapter_10/moby_dick.txt


+ 7 - 0
chapter_10/number_reader.py

@@ -0,0 +1,7 @@
1
+import json
2
+
3
+filename = 'numbers.json'
4
+with open(filename) as file_object:
5
+    numbers = json.load(file_object)
6
+    
7
+print(numbers)

+ 7 - 0
chapter_10/number_writer.py

@@ -0,0 +1,7 @@
1
+import json
2
+
3
+numbers = [2, 3, 5, 7, 11, 13]
4
+
5
+filename = 'numbers.json'
6
+with open(filename, 'w') as file_object:
7
+    json.dump(numbers, file_object)

+ 1 - 0
chapter_10/numbers.json

@@ -0,0 +1 @@
1
+[2, 3, 5, 7, 11, 13]

+ 3 - 0
chapter_10/pi_30_digits.txt

@@ -0,0 +1,3 @@
1
+3.1415926535
2
+  8979323846
3
+  2643383279

+ 3 - 0
chapter_10/pi_digits.txt

@@ -0,0 +1,3 @@
1
+3.1415926535
2
+  8979323846
3
+  2643383279

Plik diff jest za duży
+ 10000 - 0
chapter_10/pi_million_digits.txt


+ 14 - 0
chapter_10/pi_string.py

@@ -0,0 +1,14 @@
1
+filename = 'pi_million_digits.txt'
2
+
3
+with open(filename) as file_object:
4
+    lines = file_object.readlines()
5
+
6
+pi_string = ''
7
+for line in lines:
8
+    pi_string += line.rstrip()
9
+
10
+birthday = input("Enter your birthday, in the form mmddyy: ")
11
+if birthday in pi_string:
12
+    print("Your birthday appears in the first million digits of pi!")
13
+else:
14
+    print("Your birthday does not appear in the first million digits of pi.")

+ 4 - 0
chapter_10/programming.txt

@@ -0,0 +1,4 @@
1
+I love programming.
2
+I love creating new games.
3
+I also love finding meaning in large datasets.
4
+I love creating apps that can run in a browser.

+ 31 - 0
chapter_10/remember_me.py

@@ -0,0 +1,31 @@
1
+import json
2
+
3
+def get_stored_username():
4
+    """Get stored username if available."""
5
+    filename = 'username.json'
6
+    try:
7
+        with open(filename) as f_obj:
8
+            username = json.load(f_obj)
9
+    except FileNotFoundError:
10
+        return None
11
+    else:
12
+        return username
13
+
14
+def get_new_username():
15
+    """Prompt for a new username."""
16
+    username = input("What is your name? ")
17
+    filename = 'username.json'
18
+    with open(filename, 'w') as f_obj:
19
+        json.dump(username, f_obj)
20
+    return username
21
+
22
+def greet_user():
23
+    """Greet the user by name."""
24
+    username = get_stored_username()
25
+    if username:
26
+        print("Welcome back, " + username + "!")
27
+    else:
28
+        username = get_new_username()
29
+        print("We'll remember you when you come back, " + username + "!")
30
+
31
+greet_user()

Plik diff jest za duży
+ 4319 - 0
chapter_10/siddhartha.txt


+ 16 - 0
chapter_10/word_count.py

@@ -0,0 +1,16 @@
1
+def count_words(filename):
2
+    """Count the approximate number of words in a file."""
3
+    try:
4
+        with open(filename, encoding='utf-8') as f_obj:
5
+            contents = f_obj.read() 
6
+    except FileNotFoundError:
7
+        pass
8
+    else:
9
+        # Count approximate number of words in the file.
10
+        words = contents.split()
11
+        num_words = len(words)
12
+        print("The file " + filename + " has about " + str(num_words) + " words.")
13
+
14
+filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
15
+for filename in filenames:
16
+    count_words(filename)

+ 5 - 0
chapter_10/write_message.py

@@ -0,0 +1,5 @@
1
+filename = 'programming.txt'
2
+
3
+with open(filename, 'a') as file_object:
4
+    file_object.write("I also love finding meaning in large datasets.\n")
5
+    file_object.write("I love creating apps that can run in a browser.\n")

+ 18 - 0
chapter_11/language_survey.py

@@ -0,0 +1,18 @@
1
+from survey import AnonymousSurvey
2
+
3
+# Define a question, and make a survey object.
4
+question = "What language did you first learn to speak?"
5
+my_survey = AnonymousSurvey(question)
6
+
7
+# Show the question, and store responses to the question.
8
+my_survey.show_question()
9
+print("Enter 'q' at any time to quit.\n")
10
+while True:
11
+    response = input("Language: ")
12
+    if response == 'q':
13
+        break
14
+    my_survey.store_response(response)
15
+
16
+# Show the survey results.
17
+print("\nThank you to everyone who participated in the survey!")
18
+my_survey.show_results()

+ 7 - 0
chapter_11/name_function.py

@@ -0,0 +1,7 @@
1
+def get_formatted_name(first, last, middle=''):
2
+    """Generate a neatly-formatted full name."""
3
+    if middle:
4
+        full_name = first + ' ' + middle + ' ' + last
5
+    else:
6
+        full_name = first + ' ' + last
7
+    return full_name.title()

+ 14 - 0
chapter_11/names.py

@@ -0,0 +1,14 @@
1
+from name_function import get_formatted_name
2
+
3
+print("Enter 'q' at any time to quit.")
4
+while True:
5
+    first = input("\nPlease give me a first name: ")
6
+    if first == 'q':
7
+        break
8
+        
9
+    last = input("Please give me a last name: ")
10
+    if last == 'q':
11
+        break
12
+        
13
+    formatted_name = get_formatted_name(first, last)
14
+    print("\tNeatly formatted name: " + formatted_name + '.')

+ 21 - 0
chapter_11/survey.py

@@ -0,0 +1,21 @@
1
+class AnonymousSurvey():
2
+    """Collect anonymous answers to a survey question."""
3
+    
4
+    def __init__(self, question):
5
+        """Store a question, and prepare to store responses."""
6
+        self.question = question
7
+        self.responses = []
8
+        
9
+    def show_question(self):
10
+        """Show the survey question."""
11
+        print(self.question)
12
+        
13
+    def store_response(self, new_response):
14
+        """Store a single response to the survey."""
15
+        self.responses.append(new_response)
16
+        
17
+    def show_results(self):
18
+        """Show all the responses that have been given."""
19
+        print("Survey results:")
20
+        for response in self.responses:
21
+            print('- ' + response)

+ 17 - 0
chapter_11/test_name_function.py

@@ -0,0 +1,17 @@
1
+import unittest
2
+from name_function import get_formatted_name
3
+
4
+class NamesTestCase(unittest.TestCase):
5
+    """Tests for 'name_function.py'."""
6
+    
7
+    def test_first_last_name(self):
8
+        formatted_name = get_formatted_name('janis', 'joplin')
9
+        self.assertEqual(formatted_name, 'Janis Joplin')
10
+        
11
+    def test_first_last_middle_name(self):
12
+        formatted_name = get_formatted_name(
13
+            'wolfgang', 'mozart', 'amadeus')
14
+        self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')
15
+            
16
+
17
+unittest.main()

+ 30 - 0
chapter_11/test_survey.py

@@ -0,0 +1,30 @@
1
+import unittest
2
+from survey import AnonymousSurvey
3
+
4
+class TestAnonymousSurvey(unittest.TestCase):
5
+    """Tests for the class AnonymousSurvey."""
6
+    
7
+    def setUp(self):
8
+        """
9
+        Create a survey and a set of responses for use in all test methods.
10
+        """
11
+        question = "What language did you first learn to speak?"
12
+        self.my_survey = AnonymousSurvey(question)
13
+        self.responses = ['English', 'Spanish', 'Mandarin']
14
+        
15
+    
16
+    def test_store_single_response(self):
17
+        """Test that a single response is stored properly."""
18
+        self.my_survey.store_response(self.responses[0])
19
+        self.assertIn(self.responses[0], self.my_survey.responses)
20
+        
21
+        
22
+    def test_store_three_responses(self):
23
+        """Test that three individual responses are stored properly."""
24
+        for response in self.responses:
25
+            self.my_survey.store_response(response)
26
+        for response in self.responses:
27
+            self.assertIn(response, self.my_survey.responses)
28
+            
29
+
30
+unittest.main()

Plik diff jest za duży
+ 114 - 0
chapter_12/README.md


+ 31 - 0
chapter_12/alien_invasion.py

@@ -0,0 +1,31 @@
1
+import pygame
2
+from pygame.sprite import Group
3
+
4
+from settings import Settings
5
+from ship import Ship
6
+import game_functions as gf
7
+
8
+def run_game():
9
+    # Initialize pygame, settings, and screen object.
10
+    pygame.init()
11
+    ai_settings = Settings()
12
+    screen = pygame.display.set_mode(
13
+        (ai_settings.screen_width, ai_settings.screen_height))
14
+    pygame.display.set_caption("Alien Invasion")
15
+    
16
+    # Set the background color.
17
+    bg_color = (230, 230, 230)
18
+    
19
+    # Make a ship.
20
+    ship = Ship(ai_settings, screen)
21
+    # Make a group to store bullets in.
22
+    bullets = Group()
23
+
24
+    # Start the main loop for the game.
25
+    while True:
26
+        gf.check_events(ai_settings, screen, ship, bullets)
27
+        ship.update()
28
+        gf.update_bullets(bullets)
29
+        gf.update_screen(ai_settings, screen, ship, bullets)
30
+
31
+run_game()

+ 0 - 0
chapter_12/bullet.py


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików

tmt/tiger_frontend - Gogs: Simplico Git Service

説明なし

README.md 25KB

Source Map JS

NPM

Difference between original source-map:

TL,DR: it's fork of original source-map@0.6, but with perfomance optimizations.

This journey starts from source-map@0.7.0. Some part of it was rewritten to Rust and WASM and API became async.

It's still a major block for many libraries like PostCSS or Sass for example because they need to migrate the whole API to the async way. This is the reason why 0.6.1 has 2x more downloads than 0.7.3 while it's faster several times.

Downloads count

More important that WASM version has some optimizations in JS code too. This is why community asked to create branch for 0.6 version and port these optimizations but, sadly, the answer was «no». A bit later I discovered the issue created by Ben Rothman (@benthemonkey) with no response at all.

Roman Dvornov (@lahmatiy) wrote a serveral posts (russian, only, sorry) about source-map library in his own Telegram channel. He mentioned the article «Maybe you don't need Rust and WASM to speed up your JS» written by Vyacheslav Egorov (@mraleph). This article contains optimizations and hacks that lead to almost the same performance compare to WASM implementation.

I decided to fork the original source-map and port these optimizations from the article and several others PR from the original source-map.


This is a library to generate and consume the source map format described here.

Use with Node

$ npm install source-map-js

Table of Contents

Examples

Consuming a source map

var rawSourceMap = {
  version: 3,
  file: 'min.js',
  names: ['bar', 'baz', 'n'],
  sources: ['one.js', 'two.js'],
  sourceRoot: 'http://example.com/www/js/',
  mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
};

var smc = new SourceMapConsumer(rawSourceMap);

console.log(smc.sources);
// [ 'http://example.com/www/js/one.js',
//   'http://example.com/www/js/two.js' ]

console.log(smc.originalPositionFor({
  line: 2,
  column: 28
}));
// { source: 'http://example.com/www/js/two.js',
//   line: 2,
//   column: 10,
//   name: 'n' }

console.log(smc.generatedPositionFor({
  source: 'http://example.com/www/js/two.js',
  line: 2,
  column: 10
}));
// { line: 2, column: 28 }

smc.eachMapping(function (m) {
  // ...
});

Generating a source map

In depth guide: Compiling to JavaScript, and Debugging with Source Maps

With SourceNode (high level API)

function compile(ast) {
  switch (ast.type) {
  case 'BinaryExpression':
    return new SourceNode(
      ast.location.line,
      ast.location.column,
      ast.location.source,
      [compile(ast.left), " + ", compile(ast.right)]
    );
  case 'Literal':
    return new SourceNode(
      ast.location.line,
      ast.location.column,
      ast.location.source,
      String(ast.value)
    );
  // ...
  default:
    throw new Error("Bad AST");
  }
}

var ast = parse("40 + 2", "add.js");
console.log(compile(ast).toStringWithSourceMap({
  file: 'add.js'
}));
// { code: '40 + 2',
//   map: [object SourceMapGenerator] }

With SourceMapGenerator (low level API)

var map = new SourceMapGenerator({
  file: "source-mapped.js"
});

map.addMapping({
  generated: {
    line: 10,
    column: 35
  },
  source: "foo.js",
  original: {
    line: 33,
    column: 2
  },
  name: "christopher"
});

console.log(map.toString());
// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'

API

Get a reference to the module:

// Node.js
var sourceMap = require('source-map');

// Browser builds
var sourceMap = window.sourceMap;

// Inside Firefox
const sourceMap = require("devtools/toolkit/sourcemap/source-map.js");

SourceMapConsumer

A SourceMapConsumer instance represents a parsed source map which we can query for information about the original file positions by giving it a file position in the generated source.

new SourceMapConsumer(rawSourceMap)

The only parameter is the raw source map (either as a string which can be JSON.parse'd, or an object). According to the spec, source maps have the following attributes:

  • version: Which version of the source map spec this map is following.

  • sources: An array of URLs to the original source files.

  • names: An array of identifiers which can be referenced by individual mappings.

  • sourceRoot: Optional. The URL root from which all sources are relative.

  • sourcesContent: Optional. An array of contents of the original source files.

  • mappings: A string of base64 VLQs which contain the actual mappings.

  • file: Optional. The generated filename this source map is associated with.

var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);

SourceMapConsumer.prototype.computeColumnSpans()

Compute the last column for each generated mapping. The last column is inclusive.

// Before:
consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
// [ { line: 2,
//     column: 1 },
//   { line: 2,
//     column: 10 },
//   { line: 2,
//     column: 20 } ]

consumer.computeColumnSpans();

// After:
consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
// [ { line: 2,
//     column: 1,
//     lastColumn: 9 },
//   { line: 2,
//     column: 10,
//     lastColumn: 19 },
//   { line: 2,
//     column: 20,
//     lastColumn: Infinity } ]

SourceMapConsumer.prototype.originalPositionFor(generatedPosition)

Returns the original source, line, and column information for the generated source's line and column positions provided. The only argument is an object with the following properties:

  • line: The line number in the generated source. Line numbers in this library are 1-based (note that the underlying source map specification uses 0-based line numbers -- this library handles the translation).

  • column: The column number in the generated source. Column numbers in this library are 0-based.

  • bias: Either SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND. Specifies whether to return the closest element that is smaller than or greater than the one we are searching for, respectively, if the exact element cannot be found. Defaults to SourceMapConsumer.GREATEST_LOWER_BOUND.

and an object is returned with the following properties:

  • source: The original source file, or null if this information is not available.

  • line: The line number in the original source, or null if this information is not available. The line number is 1-based.

  • column: The column number in the original source, or null if this information is not available. The column number is 0-based.

  • name: The original identifier, or null if this information is not available.

consumer.originalPositionFor({ line: 2, column: 10 })
// { source: 'foo.coffee',
//   line: 2,
//   column: 2,
//   name: null }

consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })
// { source: null,
//   line: null,
//   column: null,
//   name: null }

SourceMapConsumer.prototype.generatedPositionFor(originalPosition)

Returns the generated line and column information for the original source, line, and column positions provided. The only argument is an object with the following properties:

  • source: The filename of the original source.

  • line: The line number in the original source. The line number is 1-based.

  • column: The column number in the original source. The column number is 0-based.

and an object is returned with the following properties:

  • line: The line number in the generated source, or null. The line number is 1-based.

  • column: The column number in the generated source, or null. The column number is 0-based.

consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 })
// { line: 1,
//   column: 56 }

SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)

Returns all generated line and column information for the original source, line, and column provided. If no column is provided, returns all mappings corresponding to a either the line we are searching for or the next closest line that has any mappings. Otherwise, returns all mappings corresponding to the given line and either the column we are searching for or the next closest column that has any offsets.

The only argument is an object with the following properties:

  • source: The filename of the original source.

  • line: The line number in the original source. The line number is 1-based.

  • column: Optional. The column number in the original source. The column number is 0-based.

and an array of objects is returned, each with the following properties:

  • line: The line number in the generated source, or null. The line number is 1-based.

  • column: The column number in the generated source, or null. The column number is 0-based.

consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" })
// [ { line: 2,
//     column: 1 },
//   { line: 2,
//     column: 10 },
//   { line: 2,
//     column: 20 } ]

SourceMapConsumer.prototype.hasContentsOfAllSources()

Return true if we have the embedded source content for every source listed in the source map, false otherwise.

In other words, if this method returns true, then consumer.sourceContentFor(s) will succeed for every source s in consumer.sources.

// ...
if (consumer.hasContentsOfAllSources()) {
  consumerReadyCallback(consumer);
} else {
  fetchSources(consumer, consumerReadyCallback);
}
// ...

SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])

Returns the original source content for the source provided. The only argument is the URL of the original source file.

If the source content for the given source is not found, then an error is thrown. Optionally, pass true as the second param to have null returned instead.

consumer.sources
// [ "my-cool-lib.clj" ]

consumer.sourceContentFor("my-cool-lib.clj")
// "..."

consumer.sourceContentFor("this is not in the source map");
// Error: "this is not in the source map" is not in the source map

consumer.sourceContentFor("this is not in the source map", true);
// null

SourceMapConsumer.prototype.eachMapping(callback, context, order)

Iterate over each mapping between an original source/line/column and a generated line/column in this source map.

  • callback: The function that is called with each mapping. Mappings have the form { source, generatedLine, generatedColumn, originalLine, originalColumn, name }

  • context: Optional. If specified, this object will be the value of this every time that callback is called.

  • order: Either SourceMapConsumer.GENERATED_ORDER or SourceMapConsumer.ORIGINAL_ORDER. Specifies whether you want to iterate over the mappings sorted by the generated file's line/column order or the original's source/line/column order, respectively. Defaults to SourceMapConsumer.GENERATED_ORDER.

consumer.eachMapping(function (m) { console.log(m); })
// ...
// { source: 'illmatic.js',
//   generatedLine: 1,
//   generatedColumn: 0,
//   originalLine: 1,
//   originalColumn: 0,
//   name: null }
// { source: 'illmatic.js',
//   generatedLine: 2,
//   generatedColumn: 0,
//   originalLine: 2,
//   originalColumn: 0,
//   name: null }
// ...

SourceMapGenerator

An instance of the SourceMapGenerator represents a source map which is being built incrementally.

new SourceMapGenerator([startOfSourceMap])

You may pass an object with the following properties:

  • file: The filename of the generated source that this source map is associated with.

  • sourceRoot: A root for all relative URLs in this source map.

  • skipValidation: Optional. When true, disables validation of mappings as they are added. This can improve performance but should be used with discretion, as a last resort. Even then, one should avoid using this flag when running tests, if possible.

var generator = new sourceMap.SourceMapGenerator({
  file: "my-generated-javascript-file.js",
  sourceRoot: "http://example.com/app/js/"
});

SourceMapGenerator.fromSourceMap(sourceMapConsumer)

Creates a new SourceMapGenerator from an existing SourceMapConsumer instance.

  • sourceMapConsumer The SourceMap.
var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);

SourceMapGenerator.prototype.addMapping(mapping)

Add a single mapping from original source line and column to the generated source's line and column for this source map being created. The mapping object should have the following properties:

  • generated: An object with the generated line and column positions.

  • original: An object with the original line and column positions.

  • source: The original source file (relative to the sourceRoot).

  • name: An optional original token name for this mapping.

generator.addMapping({
  source: "module-one.scm",
  original: { line: 128, column: 0 },
  generated: { line: 3, column: 456 }
})

SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)

Set the source content for an original source file.

  • sourceFile the URL of the original source file.

  • sourceContent the content of the source file.

generator.setSourceContent("module-one.scm",
                           fs.readFileSync("path/to/module-one.scm"))

SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])

Applies a SourceMap for a source file to the SourceMap. Each mapping to the supplied source file is rewritten using the supplied SourceMap. Note: The resolution for the resulting mappings is the minimum of this map and the supplied map.

  • sourceMapConsumer: The SourceMap to be applied.

  • sourceFile: Optional. The filename of the source file. If omitted, sourceMapConsumer.file will be used, if it exists. Otherwise an error will be thrown.

  • sourceMapPath: Optional. The dirname of the path to the SourceMap to be applied. If relative, it is relative to the SourceMap.

This parameter is needed when the two SourceMaps aren't in the same directory, and the SourceMap to be applied contains relative source paths. If so, those relative source paths need to be rewritten relative to the SourceMap.

If omitted, it is assumed that both SourceMaps are in the same directory, thus not needing any rewriting. (Supplying '.' has the same effect.)

SourceMapGenerator.prototype.toString()

Renders the source map being generated to a string.

generator.toString()
// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}'

SourceNode

SourceNodes provide a way to abstract over interpolating and/or concatenating snippets of generated JavaScript source code, while maintaining the line and column information associated between those snippets and the original source code. This is useful as the final intermediate representation a compiler might use before outputting the generated JS and source map.

new SourceNode([line, column, source[, chunk[, name]]])

  • line: The original line number associated with this source node, or null if it isn't associated with an original line. The line number is 1-based.

  • column: The original column number associated with this source node, or null if it isn't associated with an original column. The column number is 0-based.

  • source: The original source's filename; null if no filename is provided.

  • chunk: Optional. Is immediately passed to SourceNode.prototype.add, see below.

  • name: Optional. The original identifier.

var node = new SourceNode(1, 2, "a.cpp", [
  new SourceNode(3, 4, "b.cpp", "extern int status;\n"),
  new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"),
  new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"),
]);

SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])

Creates a SourceNode from generated code and a SourceMapConsumer.

  • code: The generated code

  • sourceMapConsumer The SourceMap for the generated code

  • relativePath The optional path that relative sources in sourceMapConsumer should be relative to.

var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8"));
var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"),
                                              consumer);

SourceNode.prototype.add(chunk)

Add a chunk of generated JS to this source node.

  • chunk: A string snippet of generated JS code, another instance of SourceNode, or an array where each member is one of those things.
node.add(" + ");
node.add(otherNode);
node.add([leftHandOperandNode, " + ", rightHandOperandNode]);

SourceNode.prototype.prepend(chunk)

Prepend a chunk of generated JS to this source node.

  • chunk: A string snippet of generated JS code, another instance of SourceNode, or an array where each member is one of those things.
node.prepend("/** Build Id: f783haef86324gf **/\n\n");

SourceNode.prototype.setSourceContent(sourceFile, sourceContent)

Set the source content for a source file. This will be added to the SourceMap in the sourcesContent field.

  • sourceFile: The filename of the source file

  • sourceContent: The content of the source file

node.setSourceContent("module-one.scm",
                      fs.readFileSync("path/to/module-one.scm"))

SourceNode.prototype.walk(fn)

Walk over the tree of JS snippets in this node and its children. The walking function is called once for each snippet of JS and is passed that snippet and the its original associated source's line/column location.

  • fn: The traversal function.
var node = new SourceNode(1, 2, "a.js", [
  new SourceNode(3, 4, "b.js", "uno"),
  "dos",
  [
    "tres",
    new SourceNode(5, 6, "c.js", "quatro")
  ]
]);

node.walk(function (code, loc) { console.log("WALK:", code, loc); })
// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }
// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }
// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }
// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }

SourceNode.prototype.walkSourceContents(fn)

Walk over the tree of SourceNodes. The walking function is called for each source file content and is passed the filename and source content.

  • fn: The traversal function.
var a = new SourceNode(1, 2, "a.js", "generated from a");
a.setSourceContent("a.js", "original a");
var b = new SourceNode(1, 2, "b.js", "generated from b");
b.setSourceContent("b.js", "original b");
var c = new SourceNode(1, 2, "c.js", "generated from c");
c.setSourceContent("c.js", "original c");

var node = new SourceNode(null, null, null, [a, b, c]);
node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); })
// WALK: a.js : original a
// WALK: b.js : original b
// WALK: c.js : original c

SourceNode.prototype.join(sep)

Like Array.prototype.join except for SourceNodes. Inserts the separator between each of this source node's children.

  • sep: The separator.
var lhs = new SourceNode(1, 2, "a.rs", "my_copy");
var operand = new SourceNode(3, 4, "a.rs", "=");
var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()");

var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);
var joinedNode = node.join(" ");

SourceNode.prototype.replaceRight(pattern, replacement)

Call String.prototype.replace on the very right-most source snippet. Useful for trimming white space from the end of a source node, etc.

  • pattern: The pattern to replace.

  • replacement: The thing to replace the pattern with.

// Trim trailing white space.
node.replaceRight(/\s*$/, "");

SourceNode.prototype.toString()

Return the string representation of this source node. Walks over the tree and concatenates all the various snippets together to one string.

var node = new SourceNode(1, 2, "a.js", [
  new SourceNode(3, 4, "b.js", "uno"),
  "dos",
  [
    "tres",
    new SourceNode(5, 6, "c.js", "quatro")
  ]
]);

node.toString()
// 'unodostresquatro'

SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])

Returns the string representation of this tree of source nodes, plus a SourceMapGenerator which contains all the mappings between the generated and original sources.

The arguments are the same as those to new SourceMapGenerator.

var node = new SourceNode(1, 2, "a.js", [
  new SourceNode(3, 4, "b.js", "uno"),
  "dos",
  [
    "tres",
    new SourceNode(5, 6, "c.js", "quatro")
  ]
]);

node.toStringWithSourceMap({ file: "my-output-file.js" })
// { code: 'unodostresquatro',
//   map: [object SourceMapGenerator] }